
var uzCustomFilter = {
    ajaxLib: "ami",
    requestType: "GET",
    langData: "ru",
    dataSource: "uz_custom_filter.php",
    async: true,

    optionsDisableMethod: "erase", //disable|erase

    aDefaultFieldsDisabledStatus: {},

    selectCatSupport: 1,
    catSelectId: "select_cat_id",
    scriptLink: "",
    currentCatId: 0,
    //aCatsSublinks: new Array(),

    currentFormName: "",

    hTabs: {},
    defaultTabName: "",
    currentTabName: "",
    changedFieldName: "",

    allByStepLevel: 0,

    //selectDefaultOptionCapt: "",
    //currentTabCookieName: "uz_custom_filter_active_tab_name",

    init: function(opt){

        // Set options
        if(typeof(opt) != 'undefined'){
            this.setOptions(opt);
        }
        if(typeof(uzCustomFilterOptions) != 'undefined'){
            this.setOptions(uzCustomFilterOptions);
        }

        // Init ajax stuff
        this.reinitAjaxStuff();

        //this.getFieldsDefaultDisabled();

        //if(this.selectCatSupport){
        //    this.initCurrentCat();
        //}

        //
        // Set default active tab
        //
        if(typeof(hTabs[this.defaultTabName]) != 'undefined'){
            this.setActiveTab(this.defaultTabName);
        }
        
    },

    setOptions: function(opt){
        for(var key in opt){
            this[key] = opt[key];
        }
    },

    reinitAjaxStuff: function(){
        var hOpt = {
            ajaxLib: this.ajaxLib,
            async: this.async,
            requestType: this.requestType,
            langData: this.langData,
            dataSource: this.dataSource
        };
        uzAjaxStuff.init(hOpt);
    },

    //
    // Common functions
    //

    setActiveTab: function(name){
        var key, clss, idTab, idForm;

        this.changedFieldName = "";

        if(typeof(this.hTabs[name]) != 'undefined' && this.currentTabName != name){
            this.currentTabName = name;
            // Show form and highlight tab
            for(key in this.hTabs){
                classTab = "uz_cf_tab";
                classForm = "uz_cf_form_hidden";
                if(key == name){
                    classTab = "uz_cf_tab_active";
                    classForm = "uz_cf_form";
                }
                idTab = "uz_cf_tab_"+key;
                if(document.getElementById(idTab)){
                    document.getElementById(idTab).className=classTab;
                }

                idForm = "uz_cf_form_box_"+key;
                if(document.getElementById(idForm)){
                    document.getElementById(idForm).className=classForm;
                }

                // Enable fields for any way before re-fill
                this.enableFields();
                //alert("name="+name+", key = "+key+", idTab="+idTab+", classTab="+classTab+", idForm="+idForm+", classForm="+classForm);
            }
            // Fill selects
            this.fillFields();
        }
    },

    //fillFieldsAllByStep: function(){
    fillFields: function(){
        // Prepare current values

        var cForm = document.forms[this.currentFormName];

        // Prepare url params
        var urlParams = this.getRequestUrl(this.hTabs[this.currentTabName]);

        var fieldsList = this.getFieldsList();
        if(fieldsList.length){

            this.disableFields();

            // Re-init ajax stuff
            this.reinitAjaxStuff();

            var hData = {
                action: "get_flt_data",
                fields_list: fieldsList,
                plainUrlParams: urlParams
            };
            //alert(urlParams);
            uzAjaxStuff.request(hData, uzCustomFilter.applyFilterData);
        }

    },

    getFieldsList: function(){
        var aFields = new Array();
        var fillType = this.hTabs[this.currentTabName].fillType;
        switch(fillType){
            case "all_by_step":
                aFields = this.getFieldsListAllByStep();
                break;
            case "one_of_all_filled":
                aFields = this.getFieldsListOneFilled();
                break;
            default:
                break;
        }
        return aFields;
    },

    applyFilterData: function(content) {
        var fillType = uzCustomFilter.hTabs[uzCustomFilter.currentTabName].fillType;
        switch(fillType){
            case "all_by_step":
                uzCustomFilter.applyFilterDataAllByStep(content);
                break;
            case "one_of_all_filled":
                uzCustomFilter.applyFilterDataOneFilled(content);
                break;
            default:
                break;
        }
        uzCustomFilter.enableFields();
    },

    onFieldChange: function(fld){
        this.changedFieldName = fld;
        var fillType = uzCustomFilter.hTabs[uzCustomFilter.currentTabName].fillType;
        switch(fillType){
            case "all_by_step":
                this.onFieldChangeAllByStep(fld);
                break;
            case "one_of_all_filled":
                this.onFieldChangeOneFilled(fld);
                break;
            default:
                break;
        }
    },

    getRequestUrl: function(hData){
        var res = "";

        // Prepare search subcats flag
        res += "&search_subcats=1";

        // Prepare category id
        res += "&catid=" + hData.idCat;

        // Collect actual fields values from form
        res += this.getFieldsVal(hData.fieldsList);
        /*
        switch(hData.fillType){
            case "all_by_step":
                res += this.getFieldsValAllByStep(hData.fieldsList);
                break;
            case "one_of_all_filled":
                res += this.getFieldsValOneFilled(hData.fieldsList);
                break;
            default:
                break;
        }
        //*/

        return res;
    },

    getFieldsVal: function(aFields){
        var res = "";
        var val;

        var cForm = document.forms[this.currentFormName];

        // Collect actual fields values from form
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
                val = encodeURIComponent(cForm.elements[aFields[i]].value);
                res += "&"+aFields[i]+"="+val;
                //alert(i+", "+val);
            }
        }
    
        return res;
    },

    populateSelect: function(data) {
        var name = uzAjaxStuff.getResItems(data, "name").join("");
        var defaultVal = uzAjaxStuff.getResItems(data, "default_val").join("");
        var aVals = uzAjaxStuff.getResItems(data, "exist_vals");

        var cForm = document.forms[this.currentFormName];
        var el = cForm.elements[name];

        var i, n;

        //alert(data);
        //alert(name);
        //alert(aVals.length);
        //alert(aVals)

        // Drop old options
        this.dropSelectOptions(el, true);

        if(aVals.length){
            // First default option
            //el.options[0] = new Option(this.selectDefaultOptionCapt, "");

            // Add new options
            for(i=0; i<aVals.length; i++) {
                el.options[i+1] = new Option(aVals[i], aVals[i]);
            }
            el.value = defaultVal;
        
        } else {
            el.value = "";
        }
    },

    // Drop 'select' field options
    dropSelectOptions: function(oField, keepFirst){
        if(typeof(keepFirst) == 'undefined'){
            var keepFirst = false;
        }
        n = oField.length;
        for(i=n-1; i>0; i--) {
            oField.options[i] = null;
        }
        if(!keepFirst){
            oField.options[0] = null;
        }
    },

    onSearchClick: function(){
        var fillType = this.hTabs[this.currentTabName].fillType;
        switch(fillType){
            case "all_by_step":
                if(this.checkFormAllByStep()){
                    this.submitForm();
                }
                break;
            case "one_of_all_filled":
                if(this.checkFormOneFilled()){
                    this.submitForm();
                }
                break;
            default:
                break;
        }
    },

    submitForm: function(){
        var url = this.hTabs[this.currentTabName].url;
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        var cForm = document.forms[this.currentFormName];
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
               url += "&"+aFields[i]+"="+encodeURIComponent(cForm.elements[aFields[i]].value);
            }
        }
        //alert(url);
        document.location.href = url;
    },

    onResetClick: function(){
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        var cForm = document.forms[this.currentFormName];
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
                cForm.elements[aFields[i]].value = "";
            }
        }
        // Fill selects
        this.fillFields();
    },

    disableFields: function() {
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        var cForm = document.forms[this.currentFormName];
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
                cForm.elements[aFields[i]].disabled = true;
            }
        }
    },

    enableFields: function() {
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        var cForm = document.forms[this.currentFormName];
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
                cForm.elements[aFields[i]].disabled = false;
            }
        }
    },

    //
    // Common functions end
    //






    //
    // All-by-step functions
    //

    getFieldsListAllByStep: function(){
        var aRes = [];
        var cForm = document.forms[this.currentFormName];
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        if(aFields.length){
            for(var i = 0; i <= this.allByStepLevel; i++){
                if(typeof(aFields[i]) != 'undefined'){
                    aRes.push(aFields[i]);
                    if(cForm.elements[aFields[i]].options.length < 2){
                        break;
                    }
                }
            }
        }
        return aRes.join("|");
    },

    applyFilterDataAllByStep: function(content) {
        //alert(content);
        var debug = uzAjaxStuff.getResItems(content, "debug").join("");
        if(debug.length){
            alert(debug);
        }

        var aFieldsData = uzAjaxStuff.getResItems(content, "fields_data");

        if(aFieldsData.length){
            if(typeof(aFieldsData[this.allByStepLevel]) != 'undefined'){
                uzCustomFilter.populateSelect(aFieldsData[this.allByStepLevel]);
            }
            //for(var i = 0; i < aFieldsData.length; i++){
            //    uzCustomFilter.populateSelect(aFieldsData[i]);
            //}
        }
    },

    onFieldChangeAllByStep: function(fld){
        //
        // Drop fields after changed options, reset values to ''
        //
        var aFields = this.hTabs.auto.fieldsList;
        if(aFields.length){
            var cForm = document.forms[this.currentFormName];
            var foundFld = false;
            for(var i = 0; i < aFields.length; i++){
                if(foundFld){
                    // Cleanup options
                    var el = cForm.elements[aFields[i]];
                    el.value = "";
                    this.dropSelectOptions(el, true);
                }
                if(fld == aFields[i]){
                    this.allByStepLevel = i + 1;
                    foundFld = true;
                }
            }
        }
        // If is last field - do not query
        if(this.allByStepLevel < aFields.length){
            this.fillFields();
        }
    },

    checkFormAllByStep: function(){
        var res = true;
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        var cForm = document.forms[this.currentFormName];
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
               if(cForm.elements[aFields[i]].value == ""){
                   alert(this.hTabs[this.currentTabName].fillAlert);
                   res = false;
                   break;
               }
            }
        }
        return res;
    },


    //
    // All-by-step functions end
    //







    
    
    
    


    //
    // One of all filled functions
    //

    getFieldsListOneFilled: function(){
        var aRes = new Array();
        var cForm = document.forms[this.currentFormName];
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        /*
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
                //if(aFields[i] != this.changedFieldName){
                    aRes.push(aFields[i]);
                //}
            }
        }
        //*/
        return aFields.join("|");
    },

    applyFilterDataOneFilled: function(content) {
        //alert(content);
        var debug = uzAjaxStuff.getResItems(content, "debug").join("");
        if(debug.length){
            alert(debug);
        }

        var aFieldsData = uzAjaxStuff.getResItems(content, "fields_data");

        if(aFieldsData.length){
            for(var i = 0; i < aFieldsData.length; i++){
                uzCustomFilter.populateSelect(aFieldsData[i]);
            }
        }
    },

    onFieldChangeOneFilled: function(fld){
        //
        // Drop fields after changed options, reset values to ''
        //
        var aFields = this.hTabs.auto.fieldsList;
        if(aFields.length){
            var cForm = document.forms[this.currentFormName];
            var foundFld = false;
            for(var i = 0; i < aFields.length; i++){
                if(foundFld){
                    // Cleanup options
                    var el = cForm.elements[aFields[i]];
                    el.value = "";
                    this.dropSelectOptions(el, true);
                }
                if(fld == aFields[i]){
                    foundFld = true;
                }
            }
        }

        this.fillFields();
    },

    checkFormOneFilled: function(){
        var res = false;
        var aFields = this.hTabs[this.currentTabName].fieldsList;
        var cForm = document.forms[this.currentFormName];
        if(aFields.length){
            for(var i = 0; i < aFields.length; i++){
               if(cForm.elements[aFields[i]].value != ""){
                   res = true;
                   break;
               }
            }
        }
        if(!res){
           alert(this.hTabs[this.currentTabName].fillAlert);
        }
        return res;
    },

    //
    // One of all filled functions end
    //



    endvar: 1
}








