﻿if(!this.IPS){
    IPS = {};
}
if(!this.IPS.S1){
IPS.S1 = {
    init:function(){
        var condSct = $('S1_CondSct');
        var makeSct = $('S1_MakeSct');
        if(condSct){
            condSct.onchange = IPS.S1.updateMakes;
        }
        if(makeSct){
            makeSct.onchange = IPS.S1.updateModels;
        }
        var showAdvBtn = $('S1_ShowAdvBtn');
        var hideAdvBtn = $('S1_HideAdvBtn');
        if(showAdvBtn){
            showAdvBtn.onclick = function(){ IPS.S1.showAdvSearch(); return false; };
        }
        if(hideAdvBtn){
            hideAdvBtn.onclick = function(){ IPS.S1.hideAdvSearch(); return false; };
        }
        var searchBtn = $('S1_SearchBtn');
        if(searchBtn){
            searchBtn.onclick = IPS.S1.doSearch;
        }
        var oldYearSct = $('S1_OldYearSct');
        var newYearSct = $('S1_NewYearSct');
        var lowPriceSct = $('S1_LowPriceSct');
        var highPriceSct = $('S1_HighPriceSct');
        var lowDPSct = $('S1_LowDPSct');
        var highDPSct = $('S1_HighDPSct');
        if(oldYearSct){
            oldYearSct.onchange = IPS.S1.checkRelatedValues;
        }
        if(newYearSct){
            newYearSct.onchange = IPS.S1.checkRelatedValues;
        }
        if(lowPriceSct){
            lowPriceSct.onchange = IPS.S1.checkRelatedValues;
        }
        if(highPriceSct){
            highPriceSct.onchange = IPS.S1.checkRelatedValues;
        }
        if(lowDPSct){
            lowDPSct.onchange = IPS.S1.checkRelatedValues;
        }
        if(highDPSct){
            highDPSct.onchange = IPS.S1.checkRelatedValues;
        }

        //see if any advanced search params are selected.  if so, show the adv area        
        var LowPriceSct = $('S1_LowPriceSct');
        var HighPriceSct = $('S1_HighPriceSct');
        var BodyStyleSct = $('S1_BodyStyleSct');
        var HighMileageSct = $('S1_HighMileageSct');
        var CertifiedChk = $('S1_CertifiedChk');
        var DistanceSct = $('S1_DistanceSct');
        var ZipCodeTxt = $('S1_ZipCodeTxt');
        //if any of this is true, show the adv area
        if((LowPriceSct && LowPriceSct.selectedIndex > 0) ||
            (HighPriceSct && HighPriceSct.selectedIndex > 0) ||
            (BodyStyleSct && BodyStyleSct.selectedIndex > 0) ||
            (lowDPSct && lowDPSct.selectedIndex > 0) ||
            (highDPSct && highDPSct.selectedIndex > 0) ||
            (HighMileageSct && HighMileageSct.selectedIndex > 0) ||
            (CertifiedChk && CertifiedChk.checked == true) ||
            (DistanceSct && DistanceSct.selectedIndex > 0) ||
            (ZipCodeTxt && ZipCodeTxt.value != IPS.S1.Serv.DefaultZipText)){
            IPS.S1.showAdvSearch();      
        }
        if(ZipCodeTxt){
            ZipCodeTxt.onfocus = IPS.S1.clearDefaultZipTxt;
            ZipCodeTxt.onblur = IPS.S1.applyDefaultZipTxt;
        }
    },
    
    clearDefaultZipTxt:function(){
        var ZipCodeTxt = $('S1_ZipCodeTxt');
        if(ZipCodeTxt && IPS.S1.Serv.DefaultZipText && ZipCodeTxt.value == IPS.S1.Serv.DefaultZipText){
            ZipCodeTxt.value = '';
        }
    },    
    
    applyDefaultZipTxt:function(){
        var ZipCodeTxt = $('S1_ZipCodeTxt');
        //apply the default text if the zip is empty
        if(ZipCodeTxt && IPS.S1.Serv.DefaultZipText && ZipCodeTxt.value.trim() == ''){
            ZipCodeTxt.value = IPS.S1.Serv.DefaultZipText;
        }
    },
    
    checkRelatedValues:function(e){
        if(!e) e = window.event;
        var target;
        if(e.target){
            target = e.target;
        }else if(e.srcElement){
            target = e.srcElement;
        }
        var relatedElement = null;
        var goHigherOrLower;
        switch(target.id){
            case 'S1_OldYearSct':
                relatedElement = $('S1_NewYearSct');
                goHigherOrLower = 'h';
                break;
            case 'S1_NewYearSct':
                relatedElement = $('S1_OldYearSct');
                goHigherOrLower = 'l';
                break;
            case 'S1_LowPriceSct':
                relatedElement = $('S1_HighPriceSct');
                goHigherOrLower = 'h';
                break;
            case 'S1_HighPriceSct':
                relatedElement = $('S1_LowPriceSct');
                goHigherOrLower = 'l';
                break;
            case 'S1_LowDPSct':
                relatedElement = $('S1_HighDPSct');
                goHigherOrLower = 'h';
                break;
            case 'S1_HighDPSct':
                relatedElement = $('S1_LowDPSct');
                goHigherOrLower = 'l';
                break;
        }
        //only compare if relatedElement was found and the newly selected or related val isnt -1
        var val = parseInt(target.options[target.selectedIndex].value, 10);
        var relatedVal = parseInt(relatedElement.options[relatedElement.selectedIndex].value, 10);
        if(relatedElement != null && val != -1 && relatedVal != -1){
            switch(goHigherOrLower){
                case 'h':
                    if(relatedVal < val){
                        //select the next higher val
                        var diff, foundVal;
                        for(var i = 0; i < relatedElement.options.length; i++){
                            var compVal = parseInt(relatedElement.options[i].value, 10);
                            //set the new value if its greater than the current val and diff is null
                            //or the difference is greater than 0 (meaning the compVal is bigger than val)
                            //and its less than the existing difference
                            if(compVal >= val && (diff == null || (compVal - val >= 0 && compVal - val < diff))){
                                diff = compVal - val;
                                foundVal = true;
                                relatedElement.selectedIndex = i;
                            }
                        }
                        if(foundVal == false){
                            IPS.Shared.selectOptionByVal(relatedElement, '-1');
                        }
                    }
                    break;
                case 'l':
                    if(relatedVal > val){
                        //select the next lower val
                        var diff, foundVal;
                        for(var i = 0; i < relatedElement.options.length; i++){
                            var compVal = parseInt(relatedElement.options[i].value, 10);
                            //set the new value if its greater than the current val and diff is null
                            //or the difference is greater than 0 (meaning the compVal is bigger than val)
                            //and its less than the existing difference
                            if(compVal <= val && (diff == null || (val - compVal >= 0 && val - compVal < diff))){
                                diff = val - compVal;
                                foundVal = true;
                                relatedElement.selectedIndex = i;
                            }
                        }
                        if(foundVal == false){
                            IPS.Shared.selectOptionByVal(relatedElement, '-1');
                        }
                    }
                    break;
            }
        }
    },
    
    doSearch:function(){
        var searchBtn = $('S1_SearchBtn');
        if(searchBtn){
            //validate the zip if a user modified it.  If it's not valid or the user didnt modify it, set it to the default value
            var zipCodeTxt = $('S1_ZipCodeTxt');
            if(zipCodeTxt && IPS.S1.Serv.DefaultZipText){
                var isValid = false;
                var zipStringToCheck = IPS.Shared.StripFormat.postalCode(zipCodeTxt.value);
                //if its a valid US or CA zip
                if(IPS.Shared.Validate.postalCode5(zipStringToCheck) == true || 
                    IPS.Shared.Validate.postalCodeCA(zipStringToCheck) == true ||
                    zipCodeTxt.value == IPS.S1.Serv.DefaultZipText){
                    isValid = true;
                }
                if(isValid == false){
                    zipCodeTxt.value = IPS.S1.Serv.DefaultZipText;
                }
            }
            var condSct = $('S1_CondSct');
            var listPageUrl = '';
            if(condSct){
                //1 = used, 2 = new, 3 = both
                switch(condSct.options[condSct.selectedIndex].value){
                    case '1':
                        if(IPS.S1.Serv.ListPageURLUsed){
                            listPageUrl = IPS.S1.Serv.ListPageURLUsed;
                        }
                        break;
                    case '2':
                        if(IPS.S1.Serv.ListPageURLNew){
                            listPageUrl = IPS.S1.Serv.ListPageURLNew;
                        }
                        break;
                    case '3':
                        if(IPS.S1.Serv.ListPageURLNewAndUsed){
                            listPageUrl = IPS.S1.Serv.ListPageURLNewAndUsed;
                        }
                        break;
                }            
            }else{ //no condition - use the list page stored in ListPageURL
                if(IPS.S1.Serv.ListPageURL){
                    listPageUrl = IPS.S1.Serv.ListPageURL;
                }
            }
            if(listPageUrl != ''){
                var seperator = '?';
                //if we have a query, dont add a '?', instead add an '&'
                if(listPageUrl.indexOf('?') > -1){
                    seperator = '&';
                }
                searchBtn.href = IPS.Shared.insertQueryInURL(listPageUrl, 's', IPS.S1.buildQueryParam());
            }else{
                return false;
            }
        }
    },
    
    buildQueryParam:function(){
        var q = '1_';
        var condSct = $('S1_CondSct');
        var MakeSct = $('S1_MakeSct');
        var ModelSct = $('S1_ModelSct');
        var OldYearSct = $('S1_OldYearSct');
        var NewYearSct = $('S1_NewYearSct');
        var LowPriceSct = $('S1_LowPriceSct');
        var HighPriceSct = $('S1_HighPriceSct');
        var PriceRangeSct = $('S1_PriceRangeSct');
        var LowDPSct = $('S1_LowDPSct');
        var HighDPSct = $('S1_HighDPSct');
        var DPRangeSct = $('S1_DPRangeSct');
        var BodyStyleSct = $('S1_BodyStyleSct');
        var HighMileageSct = $('S1_HighMileageSct');
        var CertifiedChk = $('S1_CertifiedChk');
        var DistanceSct = $('S1_DistanceSct');
        var ZipCodeTxt = $('S1_ZipCodeTxt');
        
        var condDefault = '1';
        if(!condSct && IPS.S1.Serv.Condition){
           condDefault = IPS.S1.Serv.Condition;
        }
        //these values can come from two different selects.  the range or the individuals.
        var lowPrice, highPrice, lowDP, highDP;
        if(PriceRangeSct){
            var vals = IPS.S1.getInputValsForRange(PriceRangeSct, ['-1','-1']);
            lowPrice = vals[0];
            highPrice = vals[1];
        }else{
            lowPrice = IPS.S1.getInputVal(LowPriceSct, 'select', '-1');
            highPrice = IPS.S1.getInputVal(HighPriceSct, 'select', '-1');
        }
        
        if(DPRangeSct){
            var vals = IPS.S1.getInputValsForRange(DPRangeSct, ['-1','-1']);
            lowDP = vals[0];
            highDP = vals[1];
        }else{
            lowDP = IPS.S1.getInputVal(LowDPSct, 'select', '-1');
            highDP = IPS.S1.getInputVal(HighDPSct, 'select', '-1');
        }
        
        q += IPS.S1.getInputVal(condSct, 'select', condDefault) + '_';
        q += IPS.S1.getInputVal(MakeSct, 'select', '-1') + '_';
        q += IPS.S1.getInputVal(ModelSct, 'select', '-1') + '_';
        q += IPS.S1.getInputVal(OldYearSct, 'select', '-1') + '_';
        q += IPS.S1.getInputVal(NewYearSct, 'select', '-1') + '_';
        q += lowPrice + '_';
        q += highPrice + '_';
        q += IPS.S1.getInputVal(BodyStyleSct, 'select', '-1') + '_';
        q += IPS.S1.getInputVal(HighMileageSct, 'select', '-1') + '_';
        q += IPS.S1.getInputVal(CertifiedChk, 'checkbox', '0') + '_';
        q += IPS.S1.getInputVal(DistanceSct, 'select', '-1') + '_';
        q += IPS.S1.getInputVal(ZipCodeTxt, 'zip', '-1') + '_';
        q += lowDP + '_';
        q += highDP;
        
        return q;
    },
    
    getInputVal:function(element, type, defaultVal){
        if(element){
            switch(type){
                case 'select':
                    if(element.options){
                        return element.options[element.selectedIndex].value;
                    }
                    break;
                case 'checkbox':
                    if(element.checked !== undefined){
                        return element.checked == true ? '1' : '0';
                    }
                    break;
                case 'zip':
                    if(element.value && IPS.S1.Serv.DefaultZipText){
                        //the zip value will be IPS.S1.Serv.DefaultZipText if there was a validation error or if the user hasnt entered anything.
                        return element.value == IPS.S1.Serv.DefaultZipText ? defaultVal : element.value;
                    }
                    break;
            }
            return defaultVal;
        }else{
            return defaultVal;
        }
    },
    
    getInputValsForRange:function(element, defaultVal){
        if(element){
            if(element.options){
                return element.options[element.selectedIndex].value.split('|');
            }
            return defaultVal;
        }else{
            return defaultVal;
        }
    },
    
    showAdvSearch:function(){
        var advSearch = $('S1_AdvancedSearchList');
        var showAdvLi = $('S1_ShowAdvLi');
        var hideAdvLi = $('S1_HideAdvLi');        
        if(advSearch && showAdvLi && hideAdvLi){
            showAdvLi.style.display = 'none';
            hideAdvLi.style.display = '';
            advSearch.style.display = '';
        }
    },
    
    hideAdvSearch:function(){
        var advSearch = $('S1_AdvancedSearchList');
        var showAdvLi = $('S1_ShowAdvLi');
        var hideAdvLi = $('S1_HideAdvLi');        
        if(advSearch && showAdvLi && hideAdvLi){
            showAdvLi.style.display = '';
            hideAdvLi.style.display = 'none';
            advSearch.style.display = 'none';
        }
    },
    
    clearAndDisableMakes:function(){
        var makeSct = $('S1_MakeSct');
        if(makeSct){
            IPS.Shared.disableElement(makeSct);
            while(makeSct.options.length > 1){
                makeSct.options[1] = null;
            }
        }
    },
    
    clearAndDisableModels:function(){
        var modelSct = $('S1_ModelSct');
        if(modelSct){
            IPS.Shared.disableElement(modelSct);
            while(modelSct.options.length > 1){
                modelSct.options[1] = null;
            }
        }
    },
    
    updateMakes:function(){
        var condSct = $('S1_CondSct');
        if(condSct){
            var cond = parseInt(condSct.options[condSct.selectedIndex].value, 10);
            IPS.S1.clearAndDisableModels();
            IPS.S1.clearAndDisableMakes();
            S1CallServer('getMakes~^~' + JSON.stringify(cond), 'getMakes');
        }
    },
    
    updateModels:function(){
        //if theres a condition select rendered, use its value for the cond param.  else, use -1 and let the server decide
        var condSct = $('S1_CondSct');
        var makeSct = $('S1_MakeSct');
        if(makeSct){
            var cond = -1;
            if(condSct){
                cond = parseInt(condSct.options[condSct.selectedIndex].value, 10);
            }
            var makeID = parseInt(makeSct.options[makeSct.selectedIndex].value, 10);
            IPS.S1.clearAndDisableModels();
            //if makeID is -1, we dont call the server because we arent populating any models
            if(makeID != -1){
                //the package is an array of ints - cond then makeid
                var pkg = [cond, makeID];
                S1CallServer('getModels~^~' + JSON.stringify(pkg), 'getModels');
            }
        }
    },
    
    handleGetMakes:function(makeListStr){
        var makeList = JSON.parse(makeListStr);
        var makeSct = $('S1_MakeSct');
        if(makeList && makeSct){
            IPS.Shared.populateDDLWithList(makeSct, makeList);
            IPS.Shared.enableElement(makeSct);
        }
    },
    
    handleGetModels:function(modelListStr){
        var modelList = JSON.parse(modelListStr);
        var modelSct = $('S1_ModelSct');
        if(modelList && modelSct){
            IPS.Shared.populateDDLWithList(modelSct, modelList);
            IPS.Shared.enableElement(modelSct);
        }
    },
    
    receiveServerData:function(response, context){
        switch(context){
            case 'getMakes':
                IPS.S1.handleGetMakes(response);
                break;
            case 'getModels':
                IPS.S1.handleGetModels(response);
                break;
        }
    },
    
    serverError:function(error){
        alert(error);
    }
};
}else{
    throw 'IPS.S1 already exists.';
}

addEvent(window, 'load', IPS.S1.init);