﻿Type.registerNamespace('AAP');

AAP.ModelSelector = function(element) {
    AAP.ModelSelector.initializeBase(this, [element]);
    this._ModelYears;
    this._Makes;
    this._Models;
    this._BodyStyles;
    this._ServiceUrl = "";
    this._ModelMakeNotSelectedPrompt = "";
    this._ModelMakeSelectedPrompt = "";
    this._SelectedModelChanged = null;
    this._LoadMakesDelegate;
    this._LoadModelsDelegate;
    this._UpdateSelectedModelIdDelegate;
    this._PromptCssClass;
    this._IsModelRequired = false;
    this._CacheOffset = "";
    this._prevSelectedModelId = "";
}

AAP.ModelSelector.prototype = {
    initialize : function() {
        AAP.ModelSelector.callBaseMethod(this, 'initialize');
        if (this._SelectedModelChanged == null) {
            this._SelectedModelChanged = Function.createDelegate(this, this._SelectModelChangedHandler);
        }
        if(this._UpdateSelectedModelIdDelegate == null) {
            this._UpdateSelectedModelIdDelegate = Function.createDelegate(this,this._UpdateSelectedModelHadler);
        }

        
        $addHandler($get(this._ModelYears.id), "change", this._SelectedModelChanged);
        $addHandler($get(this._Makes.id), "change", this._SelectedModelChanged);
        $addHandler($get(this._Models.id), "change",this._UpdateSelectedModelIdDelegate);
        
        var bodyStyles = this.get_BodyStyles();
        if(bodyStyles) {
            $addHandler(bodyStyles, "change",this._SelectedModelChanged);
        }
        
        if(this._LoadMakesDelegate == null) {
            this._LoadMakesDelegate = Function.createDelegate(this,this._LoadMakesHandler);
        }
        
        if(this._LoadModelsDelegate == null) {
            this._LoadModelsDelegate = Function.createDelegate(this,this._LoadModelsHandler);
        }

        var makesElem = $get(this._Makes.id);
        var makeId = makesElem.options[makesElem.selectedIndex].value;
        if(makeId != "-1") {
            this._coreSelectModelChanged(makesElem);
        }
        if(this.get_PromptCssClass() != 'undefined' && this.get_PromptCssClass() != null) {
            Sys.UI.DomElement.addCssClass(makesElem.options[0], this.get_PromptCssClass());
            if(this.get_IsModelRequired()) {
                var modelElem = $get(this._Models.id);
                Sys.UI.DomElement.addCssClass(modelElem.options[0], this.get_PromptCssClass());
            }
        }
    },
    dispose: function() {
        AAP.ModelSelector.callBaseMethod(this, 'dispose');
        if (this._SelectedModelChanged) {
            Sys.UI.DomEvent.removeHandler($get(this._ModelYears.id), 'change', this._SelectedModelChanged);
            Sys.UI.DomEvent.removeHandler($get(this._Makes.id), 'change', this._SelectedModelChanged);
            delete this._SelectedModelChanged;
        }
        if(this._UpdateSelectedModelIdDelegate) {
            Sys.UI.DomEvent.removeHandler($get(this._Models.id), 'change', this._UpdateSelectedModelIdDelegate);
        }
    },
    _UpdateSelectedModelHadler:function(eventElement) {
        $get("selectedModelId~"+this.get_id()).value = $get(this._Models.id).options[$get(this._Models.id).selectedIndex].value;
    },
    _SelectModelChangedHandler: function(eventElement)  {
        this._coreSelectModelChanged(eventElement.target);
    },
    _coreSelectModelChanged:function(target) {
        var modelYearsElem = $get(this._ModelYears.id);
        var makesElem = $get(this._Makes.id);
        var modelsElem = $get(this._Models.id);
        var bodyStylesElem = this.get_BodyStyles();
        
        if(modelYearsElem.selectedIndex < 0) {
            return;
        }
        
        /*
        var modelYear = modelYearsElem.options[modelYearsElem.selectedIndex].value;
        var makeId = makesElem.options[makesElem.selectedIndex].value;
        var modelId = modelsElem.options[modelsElem.selectedIndex].value;
        */
        
        var modelYear = modelYearsElem.value;
        var makeId = makesElem.value || -1;
        var modelId = modelsElem.value || -1;
        
        
        var bodystyle = "";
        if(bodyStylesElem && bodyStylesElem.selectedIndex > 0) {
            bodystyle = bodyStylesElem.options[bodyStylesElem.selectedIndex].value;
        }
        
        var request =  new Sys.Net.WebRequest();
        request.set_url(this._ServiceUrl + this.BuildQueryString(modelYear, makeId, modelId, bodystyle));
        var promptElements;
        this.PreparePrompts(target, promptElements, request);
        var executor = new Sys.Net.XMLHttpExecutor();
        request.set_executor(executor);
        this._disableDropdowns(promptElements);
        executor.executeRequest();
        var started = executor.get_started();
    },
    PreparePrompts:function(target, promptElements, request) {
        var modelYearsElem = $get(this._ModelYears.id);
        var makesElem = $get(this._Makes.id);
        var modelsElem = $get(this._Models.id);
        var bodyStylesElem = this.get_BodyStyles();

        if(target == modelYearsElem) {
            request.add_completed(this._LoadMakesDelegate);
            if(bodyStylesElem)
                bodyStylesElem.selectedIndex = 0;
            promptElements = [makesElem,modelsElem];
        } 
        if(target == makesElem) {
            request.add_completed(this._LoadModelsDelegate);
            promptElements = [modelsElem];
        } 
        if(target == bodyStylesElem) {
            request.add_completed(this._LoadMakesDelegate);
            promptElements = [makesElem,modelsElem];
        } 
    },
    _LoadMakesHandler: function(executor, eventArgs) {
        if(executor.get_responseAvailable()) {
            var response = Sys.Serialization.JavaScriptSerializer.deserialize(executor.get_responseData());
            var makesElem = $get(this._Makes.id);
            makesElem.options.length = 0;
            var makes = response.makes.makes;
            var i=0;
            var j=0;
            if(this._isArray(makes) && makes[0] && makes[0].id != -1) {
                makesElem.options[0] = new Option("Select One",-1);
                if(this.get_PromptCssClass() != 'undefined' && this.get_PromptCssClass() != null) {
                    Sys.UI.DomElement.addCssClass(makesElem.options[0], this.get_PromptCssClass());
                }
                i=1;
            }
            if(this._isArray(makes)) {
                for(j in makes) {
                    makesElem.options[i] = new Option(makes[j].name, makes[j].id);
                    i++;
                }
            }
            $get(this._Models.id).options.length=0;
            $get(this._Models.id).options[0] = new Option(this._ModelMakeNotSelectedPrompt,-1);
            if(this.get_IsModelRequired() && this.get_PromptCssClass() != 'undefined' && this.get_PromptCssClass() != null) {
                Sys.UI.DomElement.addCssClass($get(this._Models.id).options[0], this.get_PromptCssClass());
            }
            this._enableDropdowns();
        }
    },
    _LoadModelsHandler: function(executor, eventArgs) {
        if(executor.get_responseAvailable()) {
            var responseData = executor.get_responseData();
            if(!responseData) return;
            var response = Sys.Serialization.JavaScriptSerializer.deserialize(responseData);
            var modelsElem = $get(this._Models.id);
            modelsElem.options.length = 0;
            var models = response.models.models;
            var j = 0;
            var i = 0;
            if(this._isArray(models) && models[0] && models[0].id != -1) {
                modelsElem.options[0] = new Option(this._ModelMakeSelectedPrompt,-1);
                if(this.get_IsModelRequired() && this.get_PromptCssClass() != 'undefined' && this.get_PromptCssClass() != null) {
                    Sys.UI.DomElement.addCssClass(modelsElem.options[0], this.get_PromptCssClass());
                }
                i=1;
            }
            if(window.console) {
                window.console.log(this._isArray(models));
                window.console.log(models);
            }
            if(this._isArray(models)) {
                for(j in models) {
                    
                    modelsElem.options[i] = new Option(models[j].name, models[j].id);
                    if((this._prevSelectedModelId && this._prevSelectedModelId != "-1") && models[j].id == this._prevSelectedModelId) {
                        modelsElem.value = models[j].id;
                    }
                    i++;
                }
            }
            if(!this._isArray(models)) {
                modelsElem.length=0;
                modelsElem.options[0] = new Option(this._ModelMakeNotSelectedPrompt,-1);
                if(this.get_IsModelRequired() && this.get_PromptCssClass() != 'undefined' && this.get_PromptCssClass() != null) {
                    Sys.UI.DomElement.addCssClass(modelsElem.options[0], this.get_PromptCssClass());
                }
                modelsElem.selectedIndex = 0;
            }
            this._prevSelectedModelId = "";
            this._enableDropdowns();
        }
    },
    _disableDropdowns:function(promptElements) {
        this._prevSelectedModelId = $get(this._Models.id).value;
        $get(this._ModelYears.id).disabled = true;
        $get(this._Makes.id).disabled = true;
        $get(this._Models.id).disabled = true;
        if(this.get_BodyStyles()) {
            this.get_BodyStyles().disabled = true;
        }
        
        for(i in promptElements) {
            promptElements[i].options.length = 0;
            promptElements[i].options[0] = new Option("Please Wait...", 0);
        }
        this.OnDisableInput();
    },
    _enableDropdowns: function() {
        $get(this._ModelYears.id).disabled = false;
        $get(this._Makes.id).disabled = false;
        $get(this._Models.id).disabled = false;
        if(this.get_BodyStyles()) {
            this.get_BodyStyles().disabled = false;
        }
        this._setupHiddenValues();
        this.OnEnableInput();
    },
    _setupHiddenValues: function() {
        var modelYearsElem = $get(this._ModelYears.id);
        var makesElem = $get(this._Makes.id);
        var modelsElem = $get(this._Models.id);
        var bodyStyleElem = this.get_BodyStyles();
        
        /*
        var modelYear = modelYearsElem.options[modelYearsElem.selectedIndex].value;
        var makeId = makesElem.options[makesElem.selectedIndex].value;
        var modelId = modelsElem.options[modelsElem.selectedIndex].value;
        */
        
        var modelYear = modelYearsElem.value;
        var makeId = makesElem.value || -1;
        var modelId = modelsElem.value || -1;
        
        var bodyStyle = null;
        if(bodyStyleElem) {
            bodyStyle = bodyStyleElem.options[bodyStyleElem.selectedIndex].value;
        }
            
        $get("selectedModelYear~"+this.get_id()).value = modelYear;
        $get("selectedMakeId~"+this.get_id()).value = makeId;
        $get("selectedModelId~"+this.get_id()).value = modelId;
        if(bodyStyle) {
            $get("selectedBodyStyle~"+this.get_id()).value = bodyStyle;
        }
    },
    BuildQueryString: function(modelYear, makeId, modelId, bodystyle) {
        return "?modelyear="+modelYear+"&makeid="+makeId+"&modelid="+modelId+"&bodystyle="+bodystyle+"&co="+this.get_CacheOffset();
    },
    _isArray: function(obj) {
        return !!(obj && obj.constructor == Array);
    },
    get_ServiceUrl: function() {
        return this._ServiceUrl;
    },
    set_ServiceUrl: function(value) {
        this._ServiceUrl = value;
    },
    get_ModelYears: function() {
        return this._ModelYears;
    },
    set_ModelYears: function(value) {
        this._ModelYears = value;
    },
    get_Makes: function() {
        return this._Makes;
    },
    set_Makes: function(value) {
        this._Makes = value;
    },
    get_Models: function() {
        return this._Models;
    },
    set_Models: function(value) {
        this._Models = value;
    },
    get_BodyStyles: function() {
        return this._BodyStyles;
    },
    set_BodyStyles: function(value) {
        this._BodyStyles = value;
    },
    get_ModelMakeNotSelectedPrompt:function() {
        return this._ModelMakeNotSelectedPrompt;
    },
    set_ModelMakeNotSelectedPrompt:function(value) { 
        this._ModelMakeNotSelectedPrompt = value;
    },
    get_ModelMakeSelectedPrompt:function() {
        return this._ModelMakeSelectedPrompt;
    },
    set_ModelMakeSelectedPrompt:function(value) {
        this._ModelMakeSelectedPrompt = value;
    },
    get_PromptCssClass:function() {
        return this._PromptCssClass;
    },
    set_PromptCssClass:function(value) {
        this._PromptCssClass = value;
    },
    get_IsModelRequired:function() {
        return this._IsModelRequired;
    },
    set_IsModelRequired:function(value) {
        this._IsModelRequired = value
    },
    get_CacheOffset:function() {
        return this._CacheOffset;
    },
    set_CacheOffset:function(value) {
        this._CacheOffset = value;
    },
    add_DisableInput:function(handler) {
        this.get_events().addHandler("DisableInput", handler);
    },
    remove_DisableInput:function(handler) {
        this.get_events().removeHandler("DisableInput", handler);  
    },
    add_EnableInput:function(handler) {
        this.get_events().addHandler("EnableInput", handler);
    },
    remove_EnableInput:function(handler) {
        this.get_events().removeHandler("EnableInput", handler);  
    },
    OnDisableInput:function() {
        var handler = this.get_events().getHandler("DisableInput");
        if (handler) {
            handler(this, Sys.EventArgs.Empty);
        }
    },
    OnEnableInput:function() {
        var handler = this.get_events().getHandler("EnableInput");
        if (handler) {
            handler(this, Sys.EventArgs.Empty);
        }
    }
}

AAP.ModelSelector.registerClass('AAP.ModelSelector', Sys.UI.Control);
//if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();


if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();