isMinIE5 = (document.getElementById&&document.all) ? 1 : 0;
var formEnabled = false;
//stub out fakes.  This crap causes IE to crash.
var historyStorage = {
    put: function(){},
    get: function(){
        return '';
    }
}

function encodeASCII(input) {
    if (input == null || input.length == 0) {
        return "";
    }

    var retVal = "";
    for (var i = 0; i < input.length; i++) {
        retVal += padChar(input.charCodeAt(i));
    }

    return retVal;
}

function padChar(characters) {
    var retVal = "" + characters;

    while (retVal.length != 3) {
        retVal = "0" + retVal;
    }

    return retVal;
}

var last_zip = "";
function validateForm(form) {
/*
    var Zip = '0123456789';
    var check = form.zip.value;
*/
    if(document.getElementById("keywords-display").value.length > 0){
        document.getElementById("keywordsrep").value = encodeASCII(document.getElementById("keywords-display").value);
        document.getElementById("keywordsmi").value = encode64(document.getElementById("keywords-display").value);
     }else{
        document.getElementById("keywordsrep").value = "";
        document.getElementById("keywordsmi").value = "";
     }

    var theMinPrice = Number(form.min_price.value);
    var theMaxPrice = Number(form.max_price.value);

   //chkMinPrice = if(form.min_price.value != ""){global_util.checkNonNumericsFromString(form.min_price.value)};
   //chkMaxPrice = if(form.min_price.value != ""){global_util.checkNonNumericsFromString(form.max_price.value)};


    if((!global_util.checkNonNumericsFromString(form.min_price.value)) ||  (!global_util.checkNonNumericsFromString(form.max_price.value))){
        alert("Please use only numbers for the Price Range.");
        return false;
    }
    if(form.max_price.value != ""){
        if(theMinPrice > theMaxPrice){
            alert('The "minimum" Price must be less than the "maximum" Price.');
            return false;
        } else if (theMaxPrice == 0) {
            alert('The "maximum" Price can not equal 0');
            return false;
        }
    }

    var zip = $("zip");
    var zipError = $("vehicleZipError");
    if(zipError.value == "wait")
    {
        setTimeout(function(){validateForm(form)}, 250);
        return false;
    }
    var this_zip = $F("zip");
    if(this_zip != last_zip)
    {
        last_zip = this_zip;
        changeVehicleZip();
        setTimeout(function(){validateForm(form)}, 250);
        return false;
    }
    if(zipError.value == 'true') {
        window.alert('Please enter a valid 5 digit ZIP Code.');
        return false;
    }
        form.submit();
        return true;
}

// you must call this with <CODE>document.observe('dom:loaded',initializeMISearchForm);</CODE> or it will not work correctly.
var initializeMISearchForm = function() {
    var endYear = $('end-year');
    endYear.options[endYear.options.length - 1].selected = true;

    if (typeof(handleBodyStyleParam) != "undefined"){
        handleBodyStyleParam();
    }
    bodyStyleChanged(false);
    initializeRSH();
    replaceChecks();
    formEnabled = true;
}

function initializeRSH() {
    /**
     * By default the storageField is abs to left offset by -1000, this causes
     * issues with IE7 and the CSS around the top navigation. To correct this we
     * simply move the storageField (form and textarea) to the end of the page and
     * then remove the original. You may notice that the form is not removed, only
     * its textarea is removed. This is due to some DOM glitch in IE that wont let
     * us remove the form since it is not properly placed from the start.
     */

    /*
    var newHistory = $(historyStorage.storageField).up().cloneNode(true);
    document.body.insert(newHistory);
    $(historyStorage.storageField).remove();
    historyStorage.storageField = $(newHistory).down();
    */


   /* var newHistory = historyStorage.storageField.parentNode.cloneNode(true);
    document.body.appendChild(newHistory);
    historyStorage.storageField.parentNode.removeChild(historyStorage.storageField);
    historyStorage.storageField = newHistory.childNodes[0];   */




/*
    if (dhtmlHistory.isFirstLoad()) {
        historyStorage.put('pageLoaded', true);
    } else {
        // do something different if the page  is reloaded from the back button
        // currently not necessary since bodyStyleChanged takes care of all of it
    }
    */

   //all bad.
}

function getSelectedBodyStyles() {
    var bsDiv = document.getElementById('bodyStyleList');
    var bsCheckboxes = bsDiv.getElementsByTagName("input");
    var bsArray = new Array();
    for (var i = 0; i < bsCheckboxes.length; i++) {
        if (bsCheckboxes[i].checked) {
            bsArray[bsArray.length] = bsCheckboxes[i].value;
        }
    }
    return bsArray;
}

function makeChanged(makeId) {
    var theCheckbox = document.getElementById(makeId)

    storeMakes();
    updateModels(makeId, theCheckbox.value, theCheckbox.checked);
    ModelSearchUtil.toAtcMakeCode(theCheckbox.value, updateAdMake);
}

function updateModels(makeId, make, checked) {
    var bsArray = getSelectedBodyStyles();
    var callbackFunction = function(modelsMap) {
        handleMakeChecked(makeId, modelsMap);
    }

    if (checked) {
        ModelSearchUtil.getAllRetailModelsByMakeAndBodyStyle(make, bsArray, callbackFunction);
    } else {
        handleMakeUnChecked(make, makeId);
    }
}

function storeMakes() {
    var mkDiv = document.getElementById('makes');

    var mkCheckboxes = mkDiv.getElementsByTagName("input");
    var mkArray = new Array();
    for (var i = 0; i < mkCheckboxes.length; i++) {
        if (mkCheckboxes[i].checked) {
            mkArray[mkArray.length] = mkCheckboxes[i].value;
        }
    }
    historyStorage.put('makes', mkArray);
}

function handleMakeChecked(makeId, modelsMap) {
    //NML entry point make sure to prepend model links, pass in new obj from callback function
    //break out models for existing code
    var models = modelsMap.miModels;
    $('model_default_text').style.display = "none";
    var theDiv = document.createElement('div');
    theDiv.setAttribute('id', makeId+'models');
    var theTitle = document.createElement('div');
    theTitle.setAttribute('id','model-title-checkbox-info');
    var make = document.getElementById(makeId).value;
    var theTextOfTheTitle = document.createTextNode(make);
    theTitle.appendChild(theTextOfTheTitle);
    theDiv.appendChild(theTitle);
    var storedModels = historyStorage.get(make);
    var newStoredModels = new Array();

    var rowCount = 0;
    //break out NML model and URLs
    //prepend the URLs
    if (modelsMap.newModels.length > 0) {
        var newModels = modelsMap.newModels;

        var newModelsHead = document.createElement("div");
        newModelsHead.setAttribute('class', 'modelitem' + rowCount++%2);
        var newModelsHeadText = document.createTextNode("Coming Soon");
        newModelsHead.appendChild(newModelsHeadText);
        theDiv.appendChild(newModelsHead);

        for (var i = 0; i < newModels.length; i++) {
            var newModelJson = newModels[i];
            var newModel = newModelJson.evalJSON();

            var newModelDiv = document.createElement("div");
            newModelDiv.setAttribute('class', 'modelitem' + rowCount++%2);

            var newModelLink = document.createElement("a");
            newModelLink.setAttribute("href", newModel.link);
            newModelLink.appendChild(document.createTextNode(newModel.make + " " + newModel.model));

            newModelDiv.appendChild(newModelLink);
            theDiv.appendChild(newModelDiv);
        }

        var currModelsHead = document.createElement("div");
        currModelsHead.setAttribute('class', 'modelitem' + rowCount++%2);
        var currModelsHeadText = document.createTextNode("Current Models");
        currModelsHead.appendChild(currModelsHeadText);
        theDiv.appendChild(currModelsHead);
    }
    for (i = 0; i < models.length; i++) {
        var modelitemdiv = document.createElement('div');
        if(!isMinIE5){
        theDiv.setAttribute('class','models-filter-container');
         modelitemdiv.setAttribute('class', 'modelitem' + rowCount++%2);
    } else {
        theDiv.setAttribute('className','models-filter-container');
         modelitemdiv.setAttribute('className', 'modelitem' + rowCount++%2);
    }
   var theTitle = document.createElement('div');
    theTitle.setAttribute('id','model-title-checkbox-info');
        var theCheckbox = document.createElement('input');
        theCheckbox.setAttribute('type', 'checkbox');
        theCheckbox.setAttribute('name', makeId+'models');
        theCheckbox.setAttribute('value', models[i]);
        theCheckbox.onclick = function (evt) { evt = (evt) ? evt : ((window.event) ? window.event : "");
            var element = (evt.target) ? evt.target : evt.srcElement;
            modelChanged(element.name);
            };

        // determine if model was previously checked
        if(storedModels != null) {
            for (var j = 0; j < storedModels.length; j++) {
                if (models[i] == storedModels[j]) {
                    theCheckbox.defaultChecked = true;
                    newStoredModels[newStoredModels.length] = models[i];
                }
            }
        }

        modelitemdiv.appendChild(theCheckbox);
        var checkboxLabel = document.createElement('span');

        var checkboxLabeText = document.createTextNode(models[i]);
        checkboxLabel.appendChild(checkboxLabeText);
        modelitemdiv.appendChild(checkboxLabel);
        theDiv.appendChild(modelitemdiv);
    }
    document.getElementById('modelLists').appendChild(theDiv);
    historyStorage.put(make, newStoredModels);
}

function handleMakeUnChecked(make, makeId) {
    historyStorage.put(make, null);
    document.getElementById('modelLists').removeChild(document.getElementById(makeId+'models'));
}

function modelChanged(makeDivId) {
    var make = document.getElementById(makeDivId.split('models')[0]).value;
    var modelsDiv = document.getElementById(makeDivId);
    var modelCheckboxes = modelsDiv.getElementsByTagName("input");
    var modelArray = new Array();
    for (var i = 0; i < modelCheckboxes.length; i++) {
        if (modelCheckboxes[i].checked) {
            modelArray[modelArray.length] = modelCheckboxes[i].value;
        }
    }
    historyStorage.put(make, modelArray);
}

function setAdMakeModelFields() {
    var mkDiv = document.getElementById('makes');
    var mkCheckboxes = mkDiv.getElementsByTagName("input");
    for (var i = 0; i < mkCheckboxes.length; i++) {
        if (mkCheckboxes[i].checked) {
            document.getElementById("AdMakeModelValue").value = "";
            break;
        } else {
            document.getElementById("AdMakeModelValue").value = "none";
        }
    }
}

function bodyStyleChanged(updateAd) {
    var bsArray = getSelectedBodyStyles();
    ModelSearchUtil.getMakesByBodyStyle(bsArray, updateMakeList);

    if(updateAd) {
        updateAdBodyType();
    }
}

function updateMakeList(makes) {
    var makeListDiv = document.getElementById('makeList');
    makeListDiv.removeChild(document.getElementById("makes"));
    var makesDiv = document.createElement('div');
    makesDiv.setAttribute('id', 'makes');
    var storedMakes = historyStorage.get('makes');
    for (var i = 0; i < makes.length; i++) {
        var makeitemdiv = document.createElement('div');
          if(!isMinIE5){
         makeitemdiv.setAttribute('class', 'makeitem' + i%2);
    } else {
         makeitemdiv.setAttribute('className', 'makeitem' + i%2);
    }

        var theCheckbox = document.createElement('input');
        theCheckbox.setAttribute('type', 'checkbox');
        theCheckbox.setAttribute('id', 'make'+i);
        theCheckbox.setAttribute('name', 'make'+i);
        theCheckbox.setAttribute('value', makes[i]);
        theCheckbox.onclick = function (evt) { evt = (evt) ? evt : ((window.event) ? window.event : "");
            var element = (evt.target) ? evt.target : evt.srcElement;
            makeChanged(element.id)};

        // determine if make was previously checked
        var bsArray = getSelectedBodyStyles();
        if(storedMakes != null) {
            for (var j = 0; j < storedMakes.length; j++) {
                if (makes[i] == storedMakes[j]) {
                    theCheckbox.defaultChecked = true;
                    updateModels('make'+i, makes[i], true);
                }
            }
        }

        makeitemdiv.appendChild(theCheckbox);
        var checkboxLabel = document.createElement('span');
        var checkboxLabeText = document.createTextNode(makes[i]);
        checkboxLabel.appendChild(checkboxLabeText);
        makeitemdiv.appendChild(checkboxLabel);
        makesDiv.appendChild(makeitemdiv);
    }
    makeListDiv.appendChild(makesDiv);

    removeAllModels();
}

function removeAllModels() {
    var modelsDiv = document.getElementById('modelLists');
    var children =  modelsDiv.childNodes;
    while (children.length > 0) {
        modelsDiv.removeChild(children[0]);
    }
}

function fromYearChangedMIForm() {
    fromYearChangedMI();
    document.getElementById("yearsChanged").value = 'y';
    //TODO handle year range changes
}

function toYearChangedMIForm() {
    toYearChangedMI();
    document.getElementById("yearsChanged").value = 'y';
    //TODO handle year range changes
}

var adMake = null;
var adRequest = null;
function updateAdMake(make) {
    make=make.replace(/\s+/g,'+');
    //only update ad if first make checked and no body types selected.
    if (adMake == null && (adBodyType == null || adBodyType == "")) {
        adMake = make;
        try {
            //if in frames (initially for CPP)
            if (window.top.frames[1].frames['350TowerAd'] != null || window.top.frames['350TowerAd'] != null) {
                var adParams = document.getElementById('350TowerAd').getAttribute('adtagrequest');
                adRequest = adParams;
                if(getSelectedBodyStyles().length != '0'){
                    adParams = adParams.replace('&bodystyle=' + lastBodyType + '&', '&bodystyle=&');
                }
                adParams = adParams.replace('&make=none', '&make='+make);
                document.getElementById('350TowerAd').setAttribute('adtagrequest', adParams);
                document.getElementById('350TowerAd').src = '/inc/ad.html?Log=0';
            }
        } catch (e) {
            //do nothing. This is here to catch the exceptions that occur when ad blocking is enabled.
        }
    }
    // if all makes are unchecked reset admake so next make checked will update
    if (historyStorage.get('makes').length == 0) {
        document.getElementById('350TowerAd').setAttribute('adtagrequest', adRequest);
        adMake = null;
    }
}

var adBodyType = null;
var lastBodyType= '';
function updateAdBodyType() {
    var bodyType = "";
    var bodyTypePreConverted = "";
    var selectedBodyTypes = getSelectedBodyStyles();
    // array which represents body type priority based on business logic with the first item being the highest priority
        var bodyTypePriority = new Array('SEDAN','SUV','Crossover','TRUCKS','COUPE','CONVERT','WAGON','VANS','HATCH');
    for (var j = bodyTypePriority.length; j >= 0; j--) {
        for (var i = 0; i < selectedBodyTypes.length; i++) {
            if (bodyTypePriority[j] == selectedBodyTypes[i]) {
                bodyTypePreConverted = selectedBodyTypes[i];
                if(bodyTypePreConverted == 'SEDAN') {
                    bodyType = 'SEDAN';
                } else if(bodyTypePreConverted == 'SUV') {
                    bodyType = 'SUV';
                } else if(bodyTypePreConverted == 'Crossover') {
                    bodyType = 'Crossover';
                } else if(bodyTypePreConverted == 'TRUCKS') {
                    bodyType = 'TRUCKS';
                } else if(bodyTypePreConverted == 'COUPE') {
                    bodyType = 'COUPE';
                } else if(bodyTypePreConverted == 'CONVERT') {
                    bodyType = 'CONVERT';
                } else if(bodyTypePreConverted == 'WAGON') {
                    bodyType = 'WAGON';
                } else if(bodyTypePreConverted == 'VANS') {
                    bodyType = 'VANS';
                } else if(bodyTypePreConverted == 'HATCH') {
                    bodyType = 'HATCH';
                } else {
                    bodyType = '';
                }
            }
        }
    }

    if (adBodyType != bodyType) {
        adBodyType = bodyType;
        if(getSelectedBodyStyles().length == '0'){
            adBodyType = '';
        }
        try {
            //if in frames (initially for CPP)
            if (window.top.frames[1].frames['350TowerAd'] != null || window.top.frames['350TowerAd'] != null) {
                var adParams = document.getElementById('350TowerAd').getAttribute('adtagrequest');
                adParams = adParams.replace('&bodystyle=' + lastBodyType + '&', '&bodystyle='+adBodyType+'&');
                document.getElementById('350TowerAd').setAttribute('adtagrequest', adParams);
                if(getSelectedBodyStyles().length != '0'){
                    document.getElementById('350TowerAd').src = '/inc/ad.html?Log=0';
                }
            }
            lastBodyType = adBodyType;
        } catch (e) {
            //do nothing. This is here to catch the exceptions that occur when ad blocking is enabled.
        }       
    }
}

