﻿Type.registerNamespace('AAP');

AAP.TrimSelector = function(element) {
    AAP.TrimSelector.initializeBase(this, [element]);
    this._ModelYears = {};
    this._Makes = {};
    this._Models = {};
    this._Trims = {};
    this._ModelMakeNotSelectedPrompt = "";
    this._ModelMakeSelectedPrompt = "";
    this._TrimModelNotSelectedPrompt = "";
    this._TrimModelSelectedPrompt = "";
    this._SearchResultUrl="";
    this._RedirectToSearchResults=true;
    this._SelectedModelChanged = null;
    this._LoadTrims = null;
    this._LoadMakesDelegate;
    this._LoadModelsDelegate;
    this._SelectedTrimChangedDelegate=null;
}

AAP.TrimSelector.prototype = {
    initialize : function() {
        AAP.TrimSelector.callBaseMethod(this, 'initialize');
        if (this._SelectedModelChanged === null) {
            this._SelectedModelChanged = Function.createDelegate(this, this._SelectModelChangedHandler);
        }
        if(this._SelectedTrimChangedDelegate == null) {
            this._SelectedTrimChangedDelegate = Function.createDelegate(this,this._SelectedTrimChangedHandler);
        }
        $addHandler($get(this._Models.id), "change", this._SelectedModelChanged);
        $addHandler($get(this._ModelYears.id), "change", this._SelectedModelChanged);
        $addHandler($get(this._Makes.id), "change", this._SelectedModelChanged);
        $addHandler($get(this._Trims.id), "change", this._SelectedTrimChangedDelegate);
        
        if(this._LoadTrims == null) {
            this._LoadTrims = Function.createDelegate(this,this._LoadTrimsHandler);
        }
        if(this._LoadMakesDelegate == null) {
            this._LoadMakesDelegate = Function.createDelegate(this,this._LoadMakesHandler);
        }
        if(this._LoadModelsDelegate == null) {
            this._LoadModelsDelegate = Function.createDelegate(this,this._LoadModelsHandler);
        }
    },
    dispose: function() {
        AAP.TrimSelector.callBaseMethod(this, 'dispose');
        if (this._SelectedModelChanged) {
            Sys.UI.DomEvent.removeHandler($get(this._Models.id), 'change', this._SelectedModelChanged);
            Sys.UI.DomEvent.removeHandler($get(this._ModelYears.id), 'change', this._SelectedModelChanged);
            delete this._SelectedModelChanged;
        }
    },
    _SelectedTrimChangedHandler:function(eventElement) {
        this._setupHiddenValues();        
        if(!this.get_RedirectToSearchResults()) {
            return
        }
        var trimsElem = $get(this._Trims.id);
        var trimId = trimsElem.options[trimsElem.selectedIndex].value;
        if(trimId > 0) {
            window.location=this._SearchResultUrl + "?trimid=" + trimId  
        }
    },
    _SelectModelChangedHandler: function(eventElement)  {
        var modelYearsElem = $get(this._ModelYears.id);
        var makesElem = $get(this._Makes.id);
        var modelsElem = $get(this._Models.id);
        var trimsElem = $get(this._Trims.id);
        var modelYear = modelYearsElem.options[modelYearsElem.selectedIndex].value;
        var makeId = makesElem.options[makesElem.selectedIndex].value;
        var modelId = modelsElem.options[modelsElem.selectedIndex].value;
        
        var request =  new Sys.Net.WebRequest();
        request.set_url("trim.aap?modelyear="+modelYear+"&makeid="+makeId+"&modelid="+modelId);
        var promptElements;
        if(eventElement.target == modelYearsElem) {
            request.add_completed(this._LoadMakesDelegate);
            promptElements = [makesElem,modelsElem,trimsElem];
        } 
        if(eventElement.target == makesElem) {
            request.add_completed(this._LoadModelsDelegate);
            promptElements = [modelsElem,trimsElem];
        } 
        if(eventElement.target == modelsElem) {
            request.add_completed(this._LoadTrims);
            promptElements = [trimsElem];
        } 
        
        
        
        var executor = new Sys.Net.XMLHttpExecutor();
        request.set_executor(executor);
        
        this._disableDropdowns(promptElements);
        
        
        executor.executeRequest();
        
        var started = executor.get_started();
    },
    _LoadTrimsHandler: function(executor, eventArgs) {
        if(executor.get_responseAvailable()) {
            var response = Sys.Serialization.JavaScriptSerializer.deserialize(executor.get_responseData());
            var trimsElem = $get(this._Trims.id);
            trimsElem.options.length = 0;
            trimsElem.options[0] = new Option(this._TrimModelSelectedPrompt, -1);
            var trims = response.trims.trims;
            var i=1;
            for(index in trims) {
                trimsElem.options[i] = new Option(trims[index].name, trims[index].id);
                i++;
            }
            this._enableDropdowns();
        }
    },
    _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(makes[0] && makes[0].id != -1) {
                makesElem.options[0] = new Option("Select One",-1);
                i=1;
            }
            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);
            $get(this._Trims.id).options.length=0;
            $get(this._Trims.id).options[0] = new Option(this._TrimModelNotSelectedPrompt,-1);
            this._enableDropdowns();
        }
    },
    _LoadModelsHandler: function(executor, eventArgs) {
        if(executor.get_responseAvailable()) {
            var response = Sys.Serialization.JavaScriptSerializer.deserialize(executor.get_responseData());
            var modelsElem = $get(this._Models.id);
            modelsElem.options.length = 0;
            var models = response.models.models;
            var j = 0;
            var i = 0;
            if(models[0] && models[0].id != -1) {
                modelsElem.options[0] = new Option(this._ModelMakeSelectedPrompt,-1);
                i=1;
            } 
            for(j in models) {
                modelsElem.options[i] = new Option(models[j].name, models[j].id);
                i++;
            }
            $get(this._Trims.id).options.length=0;
            $get(this._Trims.id).options[0] = new Option(this._TrimModelNotSelectedPrompt,-1);
            this._enableDropdowns();
        }
    },
    _disableDropdowns:function(promptElements) {
        $get(this._ModelYears.id).disabled = true;
        $get(this._Makes.id).disabled = true;
        $get(this._Models.id).disabled = true;
        $get(this._Trims.id).disabled = true;
        
        for(i in promptElements) {
            promptElements[i].options.length = 0;
            promptElements[i].options[0] = new Option("Please Wait...", 0);
        }
    },
    _enableDropdowns: function() {
        $get(this._ModelYears.id).disabled = false;
        $get(this._Makes.id).disabled = false;
        $get(this._Models.id).disabled = false;
        $get(this._Trims.id).disabled = false;
        this._setupHiddenValues();
    },
    _setupHiddenValues: function() {
        var modelYearsElem = $get(this._ModelYears.id);
        var makesElem = $get(this._Makes.id);
        var modelsElem = $get(this._Models.id);
        var trimsElem = $get(this._Trims.id);

        var modelYear = modelYearsElem.options[modelYearsElem.selectedIndex].value;
        var makeId = makesElem.options[makesElem.selectedIndex].value;
        var modelId = modelsElem.options[modelsElem.selectedIndex].value;
        var trimId = trimsElem.options[trimsElem.selectedIndex].value;
        $get("selectedModelYear~"+this.get_id()).value = modelYear;
        $get("selectedMakeId~"+this.get_id()).value = makeId;
        $get("selectedModelId~"+this.get_id()).value = modelId;
        $get("selecedTrimId~"+this.get_id()).value = trimId;
    },
    get_ModelYears: function() {
        return this._ModelYears;
    },
    get_Makes: function() {
        return this._Makes;
    },
    get_Models: function() {
        return this._Models;
    },
    get_Trims: function() {
        return this._Trims;
    },
    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_TrimModelNotSelectedPrompt:function() {
        return this._TrimModelNotSelectedPrompt;
    },
    set_TrimModelNotSelectedPrompt:function(value) {
        this._TrimModelNotSelectedPrompt = value;
    },
    get_TrimModelSelectedPrompt:function() {
        return this._TrimModelSelectedPrompt;
    },
    set_TrimModelSelectedPrompt:function(value) {
        this._TrimModelSelectedPrompt = value;
    },
    get_SearchResultUrl:function() {
        return this._SearchResultUrl;
    },
    set_SearchResultUrl:function(value) {
        this._SearchResultUrl = value;
    },
    get_RedirectToSearchResults:function() {
        return this._RedirectToSearchResults;
    },
    set_RedirectToSearchResults:function(value) {
        this._RedirectToSearchResults = value;
    }
}

AAP.TrimSelector.registerClass('AAP.TrimSelector', Sys.UI.Control);

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();