﻿/*  ----------------------------------------------------------------------------------------------------------------------
    "CommunicationForm" nesnesi, "params" nesnesi içinde aşağıdaki değerleri gerektirir:
   
    container:
        İletişimi formunun içinde gösterileceği HTML elemanının ID'si.
    formID:
        ASP.NET formunun ID'si.
    formType:
        1..14 arasında form tipi ID'si.
    formCaption:
        "Kasko yaptırmak istiyorum" gibi form tipine karşılık gelen başlık.
    cityList:
        [[34, "İstanbul"], [06, "Ankara"]] gibi [CityID, CityName] ikililerinden oluşan şehir listesi.
    modelList:
        [[89, "Renault"], [47, "Dacia"]] gibi [ModelID, ModelName] ikililerinden oluşan model listesi.
    modelTestList:
        [[89, "Renault"], [47, "Dacia"]] gibi [ModelID, ModelName] ikililerinden oluşan model test listesi.
    otherBrandList:
        [[89, "Renault"], [47, "Dacia"]] gibi [OtherBrandID, OtherBrandName] ikililerinden oluşan model test listesi.
    buyingDateList:
        [[1, '1-5 Ay Arası'], [6, '6-11 Ay Arası'], [0, 'Bilmiyorum']] gibi [BuyingDateID, BuyingDate] ikilileri listesi.
    fuelTypeList:
        [[1, 'Benzin'], [2, 'Dizel'], [3, 'LPG']] gibi [FuelTypeID, FuelType] ikilileri listesi.
    modelYearList:
        [[1998], [1999], [2000], ...] gibi bir dizi
    selectedModelID:
        741 gibi bir model numarası. Öndeğer olarak bir model seçili gelmeyecekse verilmeyebilir.
    getDealersUrl:
        "/get_dealers.aspx" gibi bir sayfa.
    getOtherModelsUrl:
        "/get_other_models.aspx" gibi bir sayfa.
    siteBrand:
        "Renault" gibi form altındaki onaylıyorum kutusunda gösterilecek marka.
    submitFunction:
        Formun submit edilmesi için bir javascript fonksiyonu. function() { doPostBack(...) } gibi parametresiz tanımlanmış olmalı.
    errorMessage:
        Hata var ise "Üzgünüz, .... hata oluştu." gibi bir mesaj içermeli. Hata yoksa tanımlanmamalı!
    successMessage:
        Form submit edildikten sonra gösterilecek mesaj. Yalnızca submit işlemi başarılıysa tanımlanmalı!
    successRedirectUrl:
        Form submit edildikten ve teşekkür mesajı gösterildikten sonra gidilecek hedef URL.
    ----------------------------------------------------------------------------------------------------------------------*/
/* --- FORM TYPES --- */
var ftBuyNewVehicle = 1;
var ftBuySecondHandVehicle = 2;
var ftTestDrive = 3;
var ftBrochureRequest = 4;
var ftBookletRequest = 5;
var ftServiceRequest = 6;
var ftBuyAccessories = 7;
var ftAdditionalWarranty = 8;
var ftInsurance = 9;
var ftMagazineSubscription = 10;
var ftMagazineUnsubscription = 11;
var ftConsultancy = 12;
var ftComplaint = 13;
var ftSuggestion = 14;
var ftSecurity = 15;
var ftAppointment = 16;
var ftDakik = 17;
var ftAestethic = 18;
var ftBrochureERequest = 19;

Ext.util.CSS.swapStyleSheet('theme', document.URL.substr(0, document.URL.lastIndexOf("/") + 1) + "zip.axd/js/ext.zip/xtheme-gray.css");

function updateTimes(field, minVal, maxVal) {
    var min = field.parseDate(minVal);
    if (!min) {
        min = new Date().clearTime();
    }
    var max = field.parseDate(maxVal);
    if (!max) {
        max = new Date().clearTime().add('mi', (24 * 60) - 1);
    }
    var times = [];
    while (min <= max) {
        times.push([min.dateFormat(field.format)]);
        min = min.add('mi', field.increment);
    }

    field.store.removeAll();
    field.store.loadData(times);
};

Ext.override(Ext.form.TimeField,
    {
        setMinValue: function(newval) {
            this.minValue = (typeof newval == "string" ? this.parseDate(newval) : newval);
            this.setValue(newval);
        },
        setMaxValue: function(newval) {
            this.maxValue = (typeof newval == "string" ? this.parseDate(newval) : newval);
        }
    });

    Ext.apply(Ext.form.VTypes, {
        pastdate: function(val, field) {
            var date = field.parseDate(val);
            if (!date) return;

            date = date.clearTime();
            var date2 = field.parseDate(new Date().clearTime()).clearTime();
            if (date <= date2)
                return false;

            return true;
        },
        pastdateText: 'Geçmiş bir tarih belirtilemez lütfen kontrol ediniz.',

        futuredate: function(val, field) {
            var date = field.parseDate(val);
            if (!date) return;

            date = date.clearTime();
            var date2 = field.parseDate(new Date().clearTime()).clearTime();
            if (date > date2)
                return false;

            return true;
        },
        futuredateText: 'İlerki bir tarih belirtilemez lütfen kontrol ediniz.',
        atLeastOneCheck: function(val, field) {
            var markInvalid = function() {
                var C = field.ownerCt;
                C.header.addClass("x-column-header-red");
                C.body.addClass("x-column-body-redborder");
                Ext.getCmp('contact_warning').show();
            }

            var clearInvalid = function() {
                var C = field.ownerCt;
                C.header.removeClass("x-column-header-red");
                C.body.removeClass("x-column-body-redborder");
                Ext.getCmp('contact_warning').hide();
            }

            var R = false;
            var parent = field.ownerCt;
            var fields = parent.items;
            var i = 0;
            clearInvalid();
            for (i = 0; i < fields.getCount(); i++) {
                var item = fields.itemAt(i);
                if (item.checked) {
                    R = true;
                    break;
                }
            }
            if (!R) markInvalid();
            return R;
        },
        atLeastOneCheckText: "Lütfen az bir tane iletişim kanalı seçiniz.",
        mobilePhone: function(val, field) {
        var phone = field.getValue();
            if (!phone) return;        
            if (phone.substr(0,1) == "0")
                return false;
            if (phone.substr(0,1) != "5")
                return false;  

            return true;
        },
        mobilePhoneText: 'Lütfen "Cep Telefonun"uzu başında "0" olmadan 10 karakter olarak giriniz.'
    });

/* --- EXT FIX TO MAKE F5, CTRL+C, CTRL+V KEYS WORK --- */
var myFilterKeys = function(e)  {     
    var k = e.getKey();

    if ((e.keyCode == e.F5 && e.charCode === 0) ||
        (e.keyCode === 0 && e.ctrlKey && (e.charCode == 118 || e.charCode == 99))) {
        return;
    }

    if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))) {
        return;
    }
    
    var c = e.getCharCode();
    var cc = String.fromCharCode(c);
    
    if (Ext.isIE && (e.isSpecialKey() || !cc)){
        return;
    }
    
    if (!this.maskRe.test(cc)) {
        e.stopEvent();
    }
};

var phoneRegEx = /^(?:\([2-9][0-9]{2}\)|[2-9][0-9]{2})(?:\s|)[1-9][0-9]{2}(?:\s|)[0-9]{2}(?:\s|)[0-9]{2}$/;
var phoneRegExError = 'Telefon geçerli değil. Lütfen (216) 323 87 65 gibi alan koduyla birlikte giriniz.';
var phoneMinOne = 'En az bir telefon girmelisiniz.';
var mobilePhoneRequired = 'Cep telefonunuzu girlmelisiniz.';

var CommunicationForm_Form = null;
var CommunicationForm_Params = null;

// JavaScript Document
var CommunicationForm = function(params) {
    if (params.successMessage &&
        params.successMessage.length > 0) {
        new Ext.Panel({
            applyTo: params.container,
            autoHeight: true,
            bodyStyle: 'text-align:center;background-color:#DFE8F6;padding:10px',
            buttonAlign: 'center',
            buttons: [
                new Ext.Button({
                    text: 'Tamam',
                    handler: function() {
                        document.location = params.successRedirectUrl
                    }
                })
            ],
            html: '<br/>' + params.successMessage + '<br /><br />'
        });

        return;
    }

    var formLabelWidth = 140;
    var formEditorWidth = 340;

    Ext.QuickTips.init();

    // turn on validation errors beside the field globally
    Ext.form.Field.prototype.msgTarget = 'side';

    var hasCalledValidator = false;

    var phoneValidator = function(val) {

        var parent = this.ownerCt;
        var fields = parent.items;

        var oneTelNonEmpty = false;
        var i = 0;

        for (i = 0; i < fields.getCount(); i++) {

            var item = fields.itemAt(i);
            if (!Ext.isEmpty(item.getValue()))
                oneTelNonEmpty = true;

            if (!hasCalledValidator && item != this) {
                hasCalledValidator = true;
                try {
                    item.validateValue(item.getValue());
                }
                finally {
                    hasCalledValidator = false;
                }
            }
        }

        if (Ext.isEmpty(val)) {
            if (oneTelNonEmpty)
                return true;
            else
                return phoneMinOne;
        }
        else if (phoneRegEx.test(val))
            return true;
        else
            return phoneRegExError;
    };


    var isAppointment = false;
    var isShowCommunicationMessage = false;

    if (inSet([ftAppointment])) {
        isAppointment = true;
    }

    var emailRequired = true;
    var emailText = "E-Posta<sup class=\"required\">*</sup>";
    if (isAppointment) {
        emailRequired = false;
        emailText = "E-Posta";
    }

    var fields = [
        {
            id: 'name',
            name: 'name',
            fieldLabel: 'Adınız<sup class="required">*</sup>',
            maxLength: 50,
            allowBlank: false,
            vtype: 'alpha'
        },
        {
            id: 'surname',
            name: 'surname',
            fieldLabel: 'Soyadınız<sup class="required">*</sup>',
            maxLength: 50,
            allowBlank: false,
            vtype: 'alpha'
        }
        ];


    var rdgCustomerService = new Ext.ux.RadioGroup({
        id: 'is_customer_service',
        name: 'is_customer_service',
        fieldLabel: 'Bu yetkili noktamızda müşteri temsilcimiz ile görüştünüz mü?<sup class="required">*</sup>',
        horizontal: true,
        allowBlank: false,
        radios: [
        {
            boxLabel: 'Evet',
            checked: false,
            value: '1'
        },
        {
            boxLabel: 'Hayır',
            checked: false,
            value: '1'
        }
      ]
    });

    var AuthorizedEnableDisable = function(checked) {
        jQuery(function(Q) {
            if (checked) {
                Q('#authorized_dealer_city').parents(".x-form-item").show();                
                Q('#authorized_dealer').parents(".x-form-item").show();
                Q('#is_customer_service').parents(".x-form-item").show();
                
                lstAuthorizedDealerCityID.setDisabled(false);
                lstAuthorizedDealer.setDisabled(false);
                rdgCustomerService.setDisabled(false);
            }
            else {
                Q('#authorized_dealer_city').parents(".x-form-item").hide();
                Q('#authorized_dealer').parents(".x-form-item").hide();
                Q('#is_customer_service').parents(".x-form-item").hide();

                lstAuthorizedDealerCityID.setDisabled(true);
                lstAuthorizedDealer.setDisabled(true);
                rdgCustomerService.setDisabled(true);
            }
        });
    };

    var IsTalkedAuthorized = inSet([ftComplaint]);
    var rdgTalkedAuthorized = new Ext.ux.RadioGroup({
        id: 'is_talked_authorized',
        name: 'is_talked_authorized',
        fieldLabel: 'Yetkili noktamızla görüştünüz mü?<sup class="required">*</sup>',
        horizontal: true,
        allowBlank: false,
        radios: [
        {
            boxLabel: 'Evet',
            checked: false,
            value: '1',
            listeners: {
                'check': function(e) {
                    AuthorizedEnableDisable(e.checked);
                }
            }
        },
        {
            boxLabel: 'Hayır',
            checked: false,
            value: '0',
            listeners: {
                'check': function(e) {

                }
            }
        }
      ]
    });

    var lstAuthorizedDealerCityID = new Ext.form.ComboBox({
        id: 'authorized_dealer_city',
        name: 'authorized_dealer_city',
        hiddenName: 'authorized_dealer_city_id',
        fieldLabel: 'Yetkili nokta ili<sup class="required">*</sup>',
        allowBlank: false,
        displayField: 'name',
        valueField: 'id',
        mode: 'local',
        triggerAction: 'all',
        editable: true,
        forceSelection: true,
        emptyText: '---seçiniz---',
        store: new Ext.data.SimpleStore({
            fields: ['id', 'name'],
            data: params.cityList
        })
    });

    var dealerAuthorizedStore = new Ext.data.JsonStore({
        url: params.getDealersUrl,
        root: 'dealers',
        fields: ['id', 'name']
    });

    var lstAuthorizedDealer = new Ext.form.ComboBox({
        id: 'authorized_dealer',
        name: 'authorized_dealer',
        hiddenName: 'authorized_dealer_dealer_id',
        fieldLabel: 'Hangi yetkili nokta<sup class="required">*</sup>',
        allowBlank: false,
        displayField: 'name',
        valueField: 'id',
        mode: 'local',
        triggerAction: 'all',
        editable: true,
        forceSelection: true,
        emptyText: '---şehir seçiniz---',
        store: dealerAuthorizedStore
    });

    lstAuthorizedDealer.emptyText = '---seçiniz---';
    lstAuthorizedDealerCityIDSelect = function() {
        dealerAuthorizedStore.load({
            params: {
                cityID: lstAuthorizedDealerCityID.getValue()
            },
            callback: function(r, options, success) {
                if (r.length && r.length > 0) {
                    lstAuthorizedDealer.emptyText = "";
                    lstAuthorizedDealer.emptyText = '---seçiniz---';
                }
                else {
                    lstAuthorizedDealer.emptyText = "";
                    lstAuthorizedDealer.emptyText = '---başka bir yakın şehir seçiniz---';
                }

                lstAuthorizedDealer.setValue("");
            }
        });
    };

    lstAuthorizedDealerCityID.on("select", lstAuthorizedDealerCityIDSelect);

    if (IsTalkedAuthorized) {

        var fields2 = [];
        fields2.push(rdgTalkedAuthorized);
        fields2.push(lstAuthorizedDealerCityID);
        fields2.push(lstAuthorizedDealer);
        fields2.push(rdgCustomerService);

        fields2.push(fields[0]);
        fields2.push(fields[1]);
        fields = fields2;
    }

    var phoneFields = new Ext.form.FieldSet({
        title: 'Telefonlar',
        autoHeight: true,
        autoWidth: true,
        labelWidth: formLabelWidth - 11,
        id: 'phones',
        defaultType: 'textfield',
        defaults: {
            width: formEditorWidth,
            maxLength: 10,
            minLength: 10,
            labelSeparator: '',
            /*validator: phoneValidator,*/
            xtype: 'textfield',
            maskRe: /^[()0-9\s]?$/,
            filterKeys: myFilterKeys
        },
        items: [
                {
                    id: 'gsm_phone',
                    name: 'gsm_phone',
                    fieldLabel: 'Cep Telefonu<sup class="required">*</sup>',
                    maxLength: 10,
                    minLength: 10,
                    allowBlank: false,
                    xtype: 'textfield',
                    regexText: mobilePhoneRequired,
                    maskRe: /^[()0-9\s]?$/,
                    regex: /^[5]([0-9]){9}$/,
                    vtype: "mobilePhone",
                    regexText: 'Alan kodunuzu 0 ile başlamadan ve sadece rakam girmelisiniz.'
                },
                {
                    id: 'work_phone',
                    name: 'work_phone',
                    fieldLabel: 'Sabit Telefon',
                    maskRe: /^[()0-9\s]?$/,
                    regex: /^[1-9]([0-9]){9}$/,
                    regexText: 'Sadece rakam girmelisiniz.'
                }
            ]
    })

    if (inSet([ftAppointment])) {
        phoneFields = new Ext.form.FieldSet({
            title: 'Telefonlar',
            autoHeight: true,
            autoWidth: true,
            labelWidth: formLabelWidth - 11,
            id: 'phones',
            defaults: {
                width: formEditorWidth,
                labelSeparator: ''
            },
            items: [
                {
                    id: 'gsm_phone',
                    name: 'gsm_phone',
                    fieldLabel: 'Cep Telefonu<sup class="required">*</sup>',
                    maxLength: 10,
                    minLength: 10,
                    allowBlank: false,
                    xtype: 'textfield',
                    regexText: mobilePhoneRequired,
                    maskRe: /^[()0-9\s]?$/,
                    regex: /^[1-9]([0-9]){9}$/,
                    regexText: 'Alan kodunuzu 0 ile başlamadan ve sadece rakam girmelisiniz.'
                },
                {
                    id: 'work_phone',
                    name: 'work_phone',
                    fieldLabel: 'Sabit Telefon',
                    xtype: 'textfield',
                    maxLength: 10,
                    maskRe: /^[()0-9\s]?$/,
                    regex: /^[1-9]([0-9]){9}$/,
                    regexText: 'Sadece rakam girmelisiniz.'
                }
            ]
        })
    }

    fields.push(phoneFields);

    fields.push({
        id: 'email',
        name: 'email',
        fieldLabel: emailText,
        maxLength: 50,
        allowBlank: !emailRequired,
        vtype: 'email'
    });

    var ftAddress = inSet([ftBrochureRequest, ftBookletRequest, ftMagazineSubscription, ftMagazineUnsubscription, ftBuySecondHandVehicle, ftDakik, ftServiceRequest, ftInsurance, ftBuyAccessories, ftAestethic, ftConsultancy, ftSuggestion, ftComplaint]);

    if (ftAddress) {

        var provinceStore = new Ext.data.JsonStore({
            url: params.getProvinceUrl,
            root: 'province',
            fields: ["id", "name"]
        });

        var lstProvince = new Ext.form.ComboBox({
            id: 'province_id',
            name: 'province',
            hiddenName: 'province',
            fieldLabel: 'İlçe<sup class="required">*</sup>',
            allowBlank: false,
            displayField: 'name',
            valueField: 'id',
            mode: 'local',
            editable: true,
            forceSelection: true,
            emptyText: '---İlçe seçiniz---',
            store: provinceStore
        });

        lstProvinceIDSelect = function() {
            if (!isMessage) {
                if ((!lstDealer.getValue()) && (lstDealerCityID.getValue() == lstCityID.getValue())) {
                    lstDealerCityIDSelect();
                }
            }
        }

        lstProvince.on("select", lstProvinceIDSelect);

        if (params.selectedProvinceID &&
        params.provinceList.toString().indexOf(params.selectedProvinceID) >= 0) {
            lstProvince.value = params.selectedProvinceID;
        }

        var lstCityID = new Ext.form.ComboBox({
            id: 'city',
            name: 'city',
            hiddenName: 'city_id',
            fieldLabel: 'İl<sup class="required">*</sup>',
            allowBlank: false,
            displayField: 'name',
            valueField: 'id',
            mode: 'local',
            triggerAction: 'all',
            editable: true,
            forceSelection: true,
            emptyText: '---seçiniz---',
            store: new Ext.data.SimpleStore({
                fields: ['id', 'name'],
                data: params.cityList
            })
        });

        lstCityIDSelect = function() {
            if (!isMessage) {
                if (!lstDealerCityID.getValue()) {
                    lstDealerCityID.setValue(lstCityID.getValue());
                    lstDealerCityIDSelect();
                }
            }
            provinceStore.load({
                params: {
                    city_id: lstCityID.getValue()
                    //parent_id: ((params.selectedprovinceID) && (params.selectedCityID == lstCityID.getValue())) ? params.selectedprovinceID : ""
                },
                callback: function(r, options, success) {
                    if (r.length && r.length > 0) {
                        lstProvince.emptyText = '---seçiniz---';
                    }
                    else
                        lstProvince.emptyText = '---başka bir şehir seçiniz---';

                    if ((params.selectedprovinceID) && (params.selectedCityID == lstCityID.getValue())) {
                        lstProvince.setValue(params.selectedprovinceID);
                    }
                    else
                        lstProvince.setValue("");
                }
            });
        };

        if (params.selectedprovinceID)
            lstCityIDSelect();

        lstCityID.on("select", lstCityIDSelect);

        fields.push(lstCityID);
        fields.push(lstProvince);

        fields.push(
    {
        id: 'address',
        name: 'address',
        fieldLabel: 'Adres' + (inSet([ftBookletRequest]) ? "<sup class=\"required\">*</sup>" : ""),
        allowBlank: !inSet([ftBookletRequest]),
        maxLength: 250,
        xtype: 'textarea'
    },
    {
        id: 'postcode',
        name: 'postcode',
        fieldLabel: 'Posta Kodu',
        maxLength: 10,
        xtype: 'textfield',
        vtype: 'alphanum',
        regex: /^[0-9]{5}$/,
        maskRe: /^[0-9\s]?$/,
        regexText: '5 haneli rakam girmelisiniz.'
    });

    }

    var rdgGender = new Ext.ux.RadioGroup({
        id: 'gender_id',
        name: 'gender_id',
        fieldLabel: 'Cinsiyet<sup class="required">*</sup>',
        horizontal: true,
        allowBlank: false,
        radios: [
        {
            boxLabel: 'Erkek',
            checked: false,
            value: '0'
        },
        {
            boxLabel: 'Kadın',
            checked: false,
            value: '1'
        }
      ]
    });

    var BirthDay = new Ext.form.DateField({
        id: 'birthday',
        name: 'birthday',
        fieldLabel: 'Doğum Tarihi<sup class="required">*</sup>',
        allowBlank: false,
        editable: false,
        forceSelection: true,
        invalidText: '{0} geçersiz bir tarihdir. Tarih formatı gg.aa.yyyy şeklinde olmalıdır.',
        format: 'd.m.Y',
        xtype: 'datefield',
        vtype: 'birthdate'
    });

    fields.push(BirthDay);
    fields.push(rdgGender);

    if (inSet([ftTestDrive]) | inSet([ftAppointment])) {
        if (inSet([ftTestDrive])) {
            fields.push({
                id: 'model',
                name: 'model_id',
                hiddenName: 'model_id',
                fieldLabel: 'Test aracı<sup class="required">*</sup>',
                allowBlank: false,
                displayField: 'name',
                valueField: 'id',
                mode: 'local',
                triggerAction: 'all',
                editable: true,
                forceSelection: true,
                emptyText: '---seçiniz---',
                xtype: 'combo',
                store: new Ext.data.SimpleStore({
                    fields: ['id', 'name'],
                    data: params.modelTestList
                })
            });
        }

        if (params.selectedModelID &&
            params.modelTestList.toString().indexOf(params.selectedModelID) >= 0) {
            fields[fields.length - 1].value = params.selectedModelID;
        }

        var increment = 30;
        var max = 18;
        var min = 8;
        var minValue = min + ':00';
        var maxValue = max + ':00';

        var testDate = new Ext.form.DateField({
            id: 'test_date',
            name: 'test_date',
            fieldLabel: 'Tercih ettiğiniz tarih<sup class="required">*</sup>',
            allowBlank: false,
            editable: false,
            forceSelection: true,
            invalidText: '{0} geçersiz bir tarihdir. Tarih formatı gg.aa.yyyy şeklinde olmalıdır.',
            format: 'd.m.Y',
            xtype: 'datefield',
            vtype: 'pastdate',
            menuListeners: Ext.applyIf({
                select: function(o, d) {
                    Ext.form.DateField.prototype.menuListeners.select.apply(this, arguments);
                    if (isAppointment) {
                        if (params.min_time) {
                            if (this.value <= params.next_day) {
                                if ((params.min_time < max && params.min_time > min) || params.min_time <= min) {
                                    minValue = params.min_time + ':00';
                                    if (params.min_time <= min)
                                        minValue = min + ':00';
                                    this.setValue(params.next_day);
                                    updateTimes(testTime, minValue, maxValue);
                                    testTime.setMinValue(minValue);
                                }
                                else {
                                    var myDate = new Date();
                                    myDate.setDate(myDate.getDate() + 2)
                                    this.setValue(myDate);
                                    minValue = min + ':00';
                                    updateTimes(testTime, minValue, maxValue);
                                    testTime.minValue = minValue;
                                    testTime.setMinValue(minValue);
                                }
                            }
                            else {
                                updateTimes(testTime, min + ':00', maxValue);
                                testTime.setMinValue(min + ':00');
                            }
                        }
                    }
                }
            }, Ext.form.DateField.prototype.menuListeners)
        });

        if (isAppointment) {
            if (params.next_day) {
                testDate.value = params.next_day;
                if (params.min_time) {
                    if ((params.min_time < max && params.min_time > min) || params.min_time <= min) {
                        minValue = params.min_time + ':00';
                        if (params.min_time <= min)
                            minValue = min + ':00';
                    }
                    else {
                        var myDate = new Date();
                        myDate.setDate(myDate.getDate() + 2)
                        testDate.value = myDate;
                        minValue = min + ':00';
                    }
                }
            }
        }

        var testTime = new Ext.form.TimeField({
            id: 'test_time',
            name: 'test_time',
            fieldLabel: 'Tercih ettiğiniz saat<sup class="required">*</sup>',
            allowBlank: false,
            minValue: minValue,
            maxValue: maxValue,
            minText: 'En erken {0} olabilir.',
            maxText: 'En geç {0} olabilir.',
            invalidText: '{0} geçerli bir saat değildir.',
            format: 'H:i',
            increment: increment,
            editable: true,
            forceSelection: true,
            xtype: 'timefield'
        });

        fields.push(testDate);
        fields.push(testTime);

        if (isAppointment) {
            var timeNote = new Ext.form.Field({
                autoCreate: { tag: 'div', cn: { tag: 'div'} },
                dataIndex: 'timeNote', // if you using Form.load, this would work
                id: 'timeNote',
                value: true,
                setValue: function(val) {
                    this.value = val;
                    if (this.rendered) {
                        this.el.child('div').update(
                                '<span style=";font-size:11px;height:17px;display:block;">En erken 24 saat sonrasına randevu alabilirsiniz.</span>'
                           );
                    }
                },
                getRawValue: function() {
                    return this.value;
                }
            });
            fields.push(timeNote);
        }
    }

    function inSet(s) {
        if (s.indexOf(params.formType) >= 0)
            return true;
    }

    var isMessage = inSet([ftConsultancy, ftSuggestion, ftComplaint]);
    var dealersShown = inSet([ftBuyNewVehicle, ftBuySecondHandVehicle, ftTestDrive, ftAppointment, ftBookletRequest,
        ftServiceRequest, ftBuyAccessories, ftInsurance, ftBrochureRequest, ftAestethic, ftDakik]);

    var lstDealerCityID = new Ext.form.ComboBox({
        id: 'dealer_city',
        name: 'dealer_city',
        hiddenName: 'dealer_city_id',
        fieldLabel: 'Yetkili Nokta İli<sup class="required">*</sup>',
        allowBlank: false,
        displayField: 'name',
        valueField: 'id',
        mode: 'local',
        triggerAction: 'all',
        editable: true,
        forceSelection: true,
        emptyText: '---seçiniz---',
        store: new Ext.data.SimpleStore({
            fields: ['id', 'name'],
            data: params.cityList
        })
    });

    if (!isMessage)
        fields.push(lstDealerCityID);

    if (params.selectedCityID &&
        params.cityList.toString().indexOf(params.selectedCityID) >= 0) {
        fields[fields.length - 1].value = params.selectedCityID;
    }

    if (ftAddress) {
        //fields.push(lstCityID);
        //fields.push(lstProvince);
    }

    if (dealersShown) {
        var dealerStore = new Ext.data.JsonStore({
            url: params.getDealersUrl,
            root: 'dealers',
            fields: ['id', 'name']
        });

        var lstDealer = new Ext.form.ComboBox({
            id: 'dealer',
            name: 'dealer',
            hiddenName: 'dealer_id',
            fieldLabel: 'Yetkili noktamız<sup class="required">*</sup>',
            allowBlank: false,
            displayField: 'name',
            valueField: 'id',
            mode: 'local',
            triggerAction: 'all',
            editable: true,
            forceSelection: true,
            emptyText: '---şehir seçiniz---',
            store: dealerStore
        });

        fields.push(lstDealer);

        lstDealerCityIDSelect = function() {
            dealerStore.load({
                params: {
                    cityID: lstDealerCityID.getValue(),
                    provinceID: ftAddress ? lstProvince.getValue() : "",
                    parent_id: ((params.selectedDealerID) && (params.selectedCityID == lstDealerCityID.getValue())) ? params.selectedDealerID : ""
                },
                callback: function(r, options, success) {

                    if (r.length && r.length > 0) {
                        lstDealer.emptyText = '---seçiniz---';
                    }
                    else
                        lstDealer.emptyText = '---başka bir yakın şehir seçiniz---';

                    if ((params.selectedDealerID) && (params.selectedCityID == lstDealerCityID.getValue())) {
                        lstDealer.setValue(params.selectedDealerID);
                    }
                    else
                        lstDealer.setValue("");
                }
            });
        };

        if (params.selectedDealerID)
            lstDealerCityIDSelect();

        lstDealerCityID.on("select", lstDealerCityIDSelect);
    }

    if (inSet([ftBuySecondHandVehicle])) {
        fields.push({
            id: 'model',
            name: 'model',
            hiddenName: 'model_id',
            fieldLabel: 'İlgilendiğiniz araç<sup class="required">*</sup>',
            allowBlank: false,
            displayField: 'name',
            valueField: 'id',
            mode: 'local',
            triggerAction: 'all',
            editable: true,
            forceSelection: true,
            emptyText: '---seçiniz---',
            xtype: 'combo',
            store: new Ext.data.SimpleStore({
                fields: ['id', 'name'],
                data: params.modelList
            })
        });

        if (params.selectedModelID &&
            params.modelList.toString().indexOf(params.selectedModelID) >= 0) {
            fields[fields.length - 1].value = params.selectedModelID;
        }
    }

    /**/

    if (isAppointment) {
        fields.push({
            id: 'appointment_type',
            name: 'appointment_type',
            hiddenName: 'appointment_type_id',
            fieldLabel: 'Telep edilen hizmet<sup class="required">*</sup>',
            allowBlank: false,
            displayField: 'name',
            valueField: 'id',
            mode: 'local',
            triggerAction: 'all',
            editable: false,
            forceSelection: true,
            emptyText: '---seçiniz---',
            xtype: 'combo',
            store: new Ext.data.SimpleStore({
                fields: ['id', 'name'],
                data: params.appointmentTypes
            })
        });
    }

    if (isMessage) {
        var msgLabel = 'Mesaj';
        if (isAppointment)
            msgLabel = 'Diğer';
        fields.push({
            id: 'message',
            name: 'message',
            fieldLabel: msgLabel,
            maxLength: 3000,
            height: 150,
            allowBlank: true,
            xtype: 'textarea'
        });
    }

    var vehicleRequired = false;
    var MyCar = inSet([ftBuyNewVehicle, ftTestDrive, ftBrochureRequest, ftBrochureERequest, ftBuySecondHandVehicle, ftConsultancy, ftSuggestion, ftComplaint]);
    vehicleRequired = inSet([ftBookletRequest, ftAppointment]);
    if (MyCar)
        params.otherBrandList.splice(0, 0, [null, "Aracım yok"]);

    var lstOtherBrand = new Ext.form.ComboBox({
        id: 'other_brand_name',
        fieldLabel: !MyCar ? 'Mevcut aracınızın markası' : 'Aracınız var mı?<sup class="required">*</sup>',
        name: 'other_brand_name',
        hiddenName: 'other_brand_id',
        allowBlank: false,
        displayField: 'name',
        valueField: 'id',
        mode: 'local',
        triggerAction: 'all',
        editable: true,
        forceSelection: true,
        emptyText: '---seçiniz---',
        store: new Ext.data.SimpleStore({
            fields: ['id', 'name'],
            data: params.otherBrandList
        })
    });

    var otherModelsStore = new Ext.data.JsonStore({
        url: params.getOtherModelsUrl,
        root: 'models',
        fields: ['id', 'name']
    });

    var lstOtherModel = new Ext.form.ComboBox({
        id: 'other_model',
        name: 'other_model',
        hiddenName: 'other_model_id',
        fieldLabel: 'Model',
        allowBlank: false,
        displayField: 'name',
        valueField: 'id',
        mode: 'local',
        editable: true,
        forceSelection: true,
        emptyText: '---marka seçiniz---',
        store: otherModelsStore
    });

    lstOtherBrandSelect = function() {
        if (lstOtherBrand.getValue() > 0) {
            onOwnCarExpand();
        }
        else {
            onOwnCarCollapse();
        }

        otherModelsStore.load({
            params: {
                brandID: lstOtherBrand.getValue()
            },
            callback: function(r, options, success) {
                if (r.length && r.length > 0)
                    lstOtherModel.emptyText = '---seçiniz---';
                else
                    lstOtherModel.emptyText = '---bu marka altında araç yoktur---';
                lstOtherModel.setValue("");
            }
        });
    };

    lstOtherBrand.on("select", lstOtherBrandSelect);



    var onOwnCarExpand = function() {
        pnlOwnCar.items.each(
                function(item, index, length) {
                    item.setDisabled(false);
                    return true;
                });
        lstOtherModel.setDisabled(false);
    }

    var onOwnCarCollapse = function() {
        pnlOwnCar.items.each(
        function(item, index, length) {
            if (item.xtype)
                item.setDisabled(true);
            return true;
        });
        lstOtherModel.setDisabled(true);
    }

    var kilometrage = {
        id: 'kilometrage',
        name: 'kilometrage',
        fieldLabel: 'Kilometre',
        maxLength: 10,
        xtype: 'textfield',
        regex: /^[0-9]{0,10}$/,
        maskRe: /^[0-9\s]?$/,
        regexText: 'Sadece rakam girmelisiniz.',
        filterKeys: myFilterKeys
    }

    var licensePlate = {
        id: 'license_plate',
        name: 'license_plate',
        allowBlank: false,
        fieldLabel: 'Plaka',
        maxLength: 30,
        xtype: 'textfield',
        maskRe: /^[0-9\sa-zA-Z]?$/,
        regex: /^([01-81]{2})(\s{0,1})+([a-zA-Z]{1,3})(\s{0,1})+([0-9]{2,5}$)/,
        regexText: 'Lütfen Plakanızı "99 X 9999" gibi yazınız.'
    }

    var modelYear = {
        id: 'model_year',
        name: 'model_year',
        fieldLabel: 'Model yılı',
        allowBlank: false,
        displayField: 'name',
        valueField: 'id',
        mode: 'local',
        triggerAction: 'all',
        editable: true,
        forceSelection: true,
        emptyText: '---seçiniz---',
        xtype: 'combo',
        store: new Ext.data.SimpleStore({
            fields: ['id', "name"],
            data: params.modelYearList
        })
    }

    var chasisNo = {
        id: 'chassis_no',
        name: 'chassis_no',
        fieldLabel: "Şasi no",
        maxLength: 50,
        xtype: 'textfield',
        vtype: 'alphanum',
        allowBlank: true
    }

    var elements = [lstOtherBrand, lstOtherModel, modelYear, licensePlate, chasisNo, kilometrage];

    var pnlOwnCar = new Ext.form.FieldSet({
        title: 'Araç bilgileri', //vehicleRequired ? 'Var Olan Aracınız' : 'Aracınız var mı?',
        autoHeight: true,
        autoWidth: true,
        defaultType: 'textField',
        labelWidth: formLabelWidth - 11,
        id: 'owncar',
        defaults: {
            width: formEditorWidth,
            labelSeparator: ''
        },
        items: elements
    });

    if (params.siteBrand) {
        lstOtherBrand.setValue(params.otherBrandList[0][0]);
        lstOtherBrandSelect();
    }

    pnlOwnCar.disable = false;
    pnlOwnCar.enable();
    pnlOwnCar.show();
    pnlOwnCar.setVisible(true);

    //fields.push(lstOtherBrand);
    fields.push(pnlOwnCar);

    if (params.siteBrand) {
        lstOtherBrand.setValue(params.otherBrandList[0][0]);
        lstOtherBrandSelect();
        if (vehicleRequired)
            lstOtherBrand.setDisabled(true);
    }

    var rdgContactChecked = function(checked) {
        pnlContactTypes.disabled = !checked;
        var items = Ext.getCmp('contact_types').items.items;
        jQuery(items).each(function(i, x) {
            x.setValue(checked);
            x.setDisabled(!checked);
            var label = jQuery(x.container.dom).find("label");
            if (!checked)
                label.addClass("x-item-disabled");
            else
                label.removeClass("x-item-disabled");
            return true;
        });
    };

    var rdgContact = new Ext.ux.RadioGroup({
        id: 'is_contact',
        name: 'is_contact',
        fieldLabel: 'Sizinle kampanya ve ürünlerimiz ile ilgili bilgi amaçlı iletişime geçmemizi ister misiniz?<sup class="required">*</sup>',
        horizontal: true,
        allowBlank: true,
        radios: [
        {
            boxLabel: 'Evet',
            checked: false,
            value: '1',
            listeners: {
                'check': function(e) {
                    rdgContactChecked(e.checked);
                }
            }
        },
        {
            boxLabel: 'Hayır',
            checked: false,
            value: '0',
            listeners: {
                'check': function(e) {
                    var items = Ext.getCmp('contact_types').items.items;
                    if (e.checked && !isShowCommunicationMessage) {
                        Ext.Msg.alert('Renault', 'İletişim izni vermediğiniz takdirde kampanya ve ayrıcalıklı tekliflerimize dair bilgilendirilme fırsatını kaybedeceksiniz. <b>Size özel fırsatlarımızı yakalamak için <span style="color:#FF0000">"evet"</span>i işaretleyiniz.</b>');
                        var C = items[0].ownerCt;
                        C.header.removeClass("x-column-header-red");
                        C.body.removeClass("x-column-body-redborder");
                        Ext.getCmp('contact_warning').hide();
                        isShowCommunicationMessage = true;
                    }
                    /*else
                    {
                    if (!Ext.form.VTypes.atLeastOneCheck('', items[0]))
                    Ext.Msg.alert("Renault", '<b>Lütfen sizinle iletişime geçmemizi istediğiniz kanal(lar)ı işaretleyiniz.<br>Kanal tercihinizi belirtmeniz, <span style="color:#FF0000">iletişim sürecinin</span> başlaması için gereklidir.</b>');
                    }*/
                }
            }
        }
      ]
    });

    var ContactEmail = {
        id: 'contact_email',
        name: 'contact_email',
        xtype: 'checkbox',
        inputValue: 1,
        allowBlank: true,
        value: 1,
        autoWidth: true,
        checked: true,
        hideLabel: true,
        boxLabel: "E-Posta",
        vtype: "atLeastOneCheck"
    };

    var ContactPhone = {
        id: 'contact_phone',
        name: 'contact_phone',
        xtype: 'checkbox',
        inputValue: 1,
        allowBlank: true,
        validateField: true,
        value: 1,
        autoWidth: true,
        checked: true,
        hideLabel: true,
        boxLabel: "Telefon",
        vtype: "atLeastOneCheck"
    };

    var ContactSms = {
        id: 'contact_sms',
        name: 'contact_sms',
        xtype: 'checkbox',
        inputValue: 1,
        allowBlank: true,
        validateField: true,
        value: 1,
        autoWidth: true,
        checked: true,
        hideLabel: true,
        boxLabel: "SMS",
        vtype: "atLeastOneCheck"
    };

    var IsContactSelectedAlert = false;
    var IsContactShowMessage = false;

    var ContactPost = {
        id: 'contact_post',
        name: 'contact_post',
        xtype: 'checkbox',
        inputValue: 1,
        allowBlank: true,
        validateField: true,
        value: 1,
        autoWidth: true,
        checked: true,
        hideLabel: true,
        boxLabel: "Posta",
        vtype: "atLeastOneCheck"
    };

    var ContactTypesElements = [ContactEmail, ContactPhone, ContactSms, ContactPost];
    var pnlContactTypes = new Ext.form.FieldSet({
        title: "Sizinle hangi kanallardan iletişime geçilmesini istersiniz ?",
        autoHeight: true,
        autoWidth: false,
        /*collapsed: false,
        checkboxToggle: true,*/
        layout: "column",
        /*checkboxName: 'is_contact',*/
        labelWidth: formLabelWidth - 11,
        id: 'contact_types',
        defaults: {
            width: formEditorWidth,
            labelSeparator: ''
        },
        items: ContactTypesElements
    });

    //pnlContactTypes.disabled = true;
    pnlContactTypes.enable();
    pnlContactTypes.show();
    pnlContactTypes.setVisible(true);
    Ext.onReady(function() {
        rdgContactChecked(false);

        jQuery(function(Q) {
            var mrchars = Q("<div\/>").attr("id", "messsage_remaining");
            mrchars.appendTo(Q("#message").parent());

            Q("#message").piMaxLength({
                feedback: '#messsage_remaining',
                maxlength: 3000,
                message: "{0} karakter kaldı"
            });

            Q('#authorized_dealer_city').parents(".x-form-item").hide();
            Q('#authorized_dealer').parents(".x-form-item").hide();
            Q('#is_customer_service').parents(".x-form-item").hide();

            lstAuthorizedDealerCityID.setDisabled(true);
            lstAuthorizedDealer.setDisabled(true);
            rdgCustomerService.setDisabled(true);
        });
    });

    var pnlNote = new Ext.form.Label({
        text: "*Doldurulması zorunlu alanlar"
    })

    fields.push(rdgContact);
    fields.push(pnlContactTypes);

    var pnlContactWarning = new Ext.form.Label({
        text: "Lütfen sizinle iletişime geçmemizi istediğiniz kanal(lar)ı işaretleyiniz. Kanal tercihinizi belirtmeniz, iletişim sürecinin başlaması için gereklidir.",
        id: 'contact_warning',
        name: 'contact_warning'
    });

    pnlContactWarning.hide();
    fields.push(pnlContactWarning);

    fields.push(pnlNote);

    var MyExtPanel = Ext.extend(Ext.FormPanel, {

        getLayoutTarget: function() {
            return this.body;
        },

        onRender: function(ct, position) {
            this.initFields();

            Ext.FormPanel.superclass.onRender.call(this, ct, position);
            this.form.initEl(params.formID);
        }
    });

    var showError = function(msg, title, callback) {
        title = title || 'Hata!';
        Ext.Msg.show({
            title: title,
            msg: msg,
            modal: true,
            icon: Ext.Msg.ERROR,
            buttons: Ext.Msg.OK,
            fn: callback
        });
    };

    var showMessage = function(msg, title, callback) {
        title = title || 'Bilgi';
        Ext.Msg.show({
            title: title,
            msg: msg,
            modal: true,
            icon: Ext.Msg.INFO,
            buttons: Ext.Msg.OK,
            fn: callback
        });
    };

    var onSubmit = function() {
        frm.getForm().submit({
            url: document.location,
            scope: this,
            success: function(form, action) {
                showMessage(action.result.message, undefined, function() {
                    document.location = action.result.redirect;
                });
            },
            failure: function(form, action) {
                if (action.failureType == "client") {
                    var e = firstFocusElement(form);
                    showError("Doldurulmamış zorunlu alanlar bulunuyor. Lütfen formu kontrol ediniz.", "Hata",
                    function() {
                        jQuery(function(Q) {
                            if (e) {
                                Q(e.el.dom).focus();
                            }
                        });
                    });
                }
                else
                    showError(action.result.error);
            },
            params: {
                ajax_cmd: 'submit',
                ajax_target: params.container
            },
            waitMsg: 'Lütfen bekleyiniz...'
        });
    };

    var btnText = params.formCaption;
    if (isAppointment)
        btnText = 'Randevu Al';

    var frm = new MyExtPanel({
        labelWidth: formLabelWidth, // label settings here cascade unless overridden
        layout: 'form',
        autoHeight: true,
        frame: true,
        monitorValid: true,
        applyTo: params.container,
        title: params.formCaption,
        bodyStyle: 'padding:5px 5px 0',
        width: formLabelWidth + formEditorWidth + 55,
        defaults: {
            width: formEditorWidth,
            labelSeparator: ''
        },
        defaultType: 'textfield',
        items: fields,
        buttons: [{
            id: 'submit',
            text: btnText,
            handler: onSubmit
}]
        });

        /*if (params.formValues)
        {
        frm.getForm().setValues(params.formValues);        
        lstDealerCityIDSelect();
        lstOtherBrandSelect();
        //pnlOwnCar.setChecked(true);
        CommunicationForm_Form = frm;
        CommunicationForm_Params = params;
        window.setTimeout("CommunicationForm_Form.getForm().setValues(CommunicationForm_Params.formValues);", 500);
        }*/

        Ext.override(Ext.form.Checkbox, {
            validateValue: function(value) {
                if (this.vtype) {
                    var vt = Ext.form.VTypes;
                    if (!vt[this.vtype](value, this))
                        IsContactSelectedAlert = true;
                    else
                        IsContactSelectedAlert = false;

                    if (IsContactSelectedAlert && !IsContactShowMessage) {
                        if (!IsContactShowMessage)
                            IsContactShowMessage = true;
                        //Ext.Msg.alert("Renault", '<b>Lütfen sizinle iletişime geçmemizi istediğiniz kanal(lar)ı işaretleyiniz.<br>Kanal tercihinizi belirtmeniz, <span style="color:#FF0000">iletişim sürecinin</span> başlaması için gereklidir.</b>');
                    }
                }

                if (IsContactSelectedAlert)
                    return false;

                return true;
            }
        });

        Ext.override(Ext.ux.RadioGroup, {
            validateValue: function(value) {
                $checked = jQuery("input[@name='" + this.name + "']:checked").val();
                if (!$checked) {
                    this.markInvalid("Lütfen seçim yapınız", this);
                    return false;
                }
                else {
                    this.clearInvalid(this);
                    return true;
                }
                return true;
            },
            markInvalid: function(m, element) {
                this.clearInvalid(element);
                jQuery(function(Q) {
                    var elem = Q(element.el.dom).parents(".x-form-element");
                    var err = Q("<div\/>").addClass("x-form-invalid-icon")
                    err.css("left", "487px")
                    err.css("top", "0")
                    err.attr("title", m);
                    err.css("visibility", "visible");
                    err.appendTo(elem);
                });
            },
            clearInvalid: function(element) {
                jQuery(function(Q) {
                    if (!element) return;
                    var elem = Q(element.el.dom).parents(".x-form-element");
                    elem.find(".x-form-invalid-icon").remove();
                });
            }
        });

        Ext.override(Ext.form.TextField, {
            validateValue: function(value) {
                if (typeof this.validator == "function") {
                    var msg = this.validator(value);
                    if (msg !== true) {
                        this.markInvalid(msg);
                        return false;
                    }
                }

                if (value.trim().length < 1 || value === this.emptyText) { // if it's blank
                    if (this.allowBlank) {
                        this.clearInvalid();
                        return true;
                    }
                    else {
                        this.markInvalid(this.blankText);
                        return false;
                    }
                }

                if (value.length < this.minLength) {
                    this.markInvalid(String.format(this.minLengthText, this.minLength));
                    return false;
                }

                if (value.length > this.maxLength) {
                    this.markInvalid(String.format(this.maxLengthText, this.maxLength));
                    return false;
                }

                if (this.vtype) {
                    var vt = Ext.form.VTypes;
                    if (!vt[this.vtype](value, this)) {
                        this.markInvalid(this.vtypeText || vt[this.vtype + 'Text']);
                        return false;
                    }
                }

                if (this.regex && !this.regex.test(value)) {
                    this.markInvalid(this.regexText);
                    return false;
                }
                return true;
            }
        });

        new Ext.ToolTip({ target: 'gsm_phone', html: '5324567890 gibi alan koduyla sadece rakam olarak giriniz.' });
        new Ext.ToolTip({ target: 'work_phone', html: '2123456789 gibi alan koduyla sadece rakam olarak giriniz.' });
        new Ext.ToolTip({ target: 'license_plate', html: 'Plakanızı  "99 X 9999" - "99 X 99999" - "99 XX 999" - "99 XX 9999" - "99 XXX 99" formatlarından birisi olabilecek şekilde girmelisiniz.' });
    };
