//dependencies:
// /inc/js/search_constants.js
// /dwr/interfaces/FycSearchForm.js
// /dwr/interfaces/FycSearchFormUtil.js
// /dwr/engine.js
// /dwr/util.js
// /inc/js/year_range.js
// /inc/js/select_util.js

var styles = null;
var ifid = null;
var isAWSP = null;

//Def 22530 account for page load variations by checking for both /aws/ in the URI, as well as looking for the div.
var sellerTypeDivPresent = document.getElementById('for-sale-by-div') || document.location.href.indexOf('/aws/')==-1;

function initSponsorVars (styles, ifid, isAWSP) {
    this.styles = styles;
    this.ifid = ifid;
    this.isAWSP = isAWSP;
}

function populateBodyStyle(code,styleFlag) {
    if (code == BODY_STYLE_NONE) {
        if (styleFlag && styleFlag == '2') {
            showBodyStyle();
        } else {
            hideBodyStyle();
        }
    } else {
        var convertibleCheckBox = document.getElementById('convertible-checkbox');
        var suvCheckBox         = document.getElementById('suv-checkbox');
        var coupeCheckBox       = document.getElementById('coupe-checkbox');
        var truckCheckBox       = document.getElementById('truck-checkbox');
        var hatchbackCheckBox   = document.getElementById('hatchback-checkbox');
        var vanCheckBox         = document.getElementById('van-checkbox');
        var sedanCheckBox       = document.getElementById('sedan-checkbox');
        var wagonCheckBox       = document.getElementById('wagon-checkbox');

        if ((code & BODY_STYLE_SUV) > 0) {
            suvCheckBox.checked = true;
        } else {
            suvCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_COUPE) > 0) {
            coupeCheckBox.checked = true;
        } else {
            coupeCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_CONVERTIBLE) > 0) {
            convertibleCheckBox.checked = true;
        } else {
            convertibleCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_TRUCK) > 0) {
            truckCheckBox.checked = true;
        } else {
            truckCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_HATCHBACK) > 0) {
            hatchbackCheckBox.checked = true;
        } else {
            hatchbackCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_VAN) > 0) {
            vanCheckBox.checked = true;
        } else {
            vanCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_SEDAN) > 0) {
            sedanCheckBox.checked = true;
        } else {
            sedanCheckBox.checked = false;
        }

        if ((code & BODY_STYLE_WAGON) > 0) {
            wagonCheckBox.checked = true;
        } else {
            wagonCheckBox.checked = false;
        }
        showBodyStyle();
    }
}

/* Gets the body style from the form. */
function getBodyStyle(valueList) {
    var retVal = BODY_STYLE_NONE;

    if (valueList == null) {
        var anyBodyStyleRadio = document.getElementById('body-style-choice-any');

        if (anyBodyStyleRadio.checked) {
            return BODY_STYLE_NONE;
        }

        var convertibleCheckBox = document.getElementById('convertible-checkbox');
        var suvCheckBox         = document.getElementById('suv-checkbox');
        var coupeCheckBox       = document.getElementById('coupe-checkbox');
        var truckCheckBox       = document.getElementById('truck-checkbox');
        var hatchbackCheckBox   = document.getElementById('hatchback-checkbox');
        var vanCheckBox         = document.getElementById('van-checkbox');
        var sedanCheckBox       = document.getElementById('sedan-checkbox');
        var wagonCheckBox       = document.getElementById('wagon-checkbox');
        if (convertibleCheckBox.checked) {
            retVal |= BODY_STYLE_CONVERTIBLE;
        }

        if (suvCheckBox.checked) {
            retVal |= BODY_STYLE_SUV;
            }

        if (coupeCheckBox.checked) {
            retVal |= BODY_STYLE_COUPE;
        }

        if (truckCheckBox.checked) {
            retVal |= BODY_STYLE_TRUCK;
        }

        if (hatchbackCheckBox.checked) {
            retVal |= BODY_STYLE_HATCHBACK;
        }

        if (vanCheckBox.checked) {
            retVal |= BODY_STYLE_VAN;
        }

        if (sedanCheckBox.checked) {
            retVal |= BODY_STYLE_SEDAN;
        }

        if (wagonCheckBox.checked) {
            retVal |= BODY_STYLE_WAGON;
        }

    } else {
        var bodyStyle = valueList.split(',');

        for (var i = 0; i < bodyStyle.length; i++) {
            switch (bodyStyle[i]) {
                case 'WAGON':
                    retVal |= BODY_STYLE_WAGON;
                    break;
                case 'VANS':
                    retVal |= BODY_STYLE_VAN;
                    break;
                case 'SEDAN':
                    retVal |= BODY_STYLE_SEDAN;
                    break;
                case 'HATCH':
                    retVal |= BODY_STYLE_HATCHBACK;
                    break;
                case 'TRUCKS':
                    retVal |= BODY_STYLE_TRUCK;
                    break;
                case 'COUPE':
                    retVal |= BODY_STYLE_COUPE;
                    break;
                case 'SUV':
                    retVal |= BODY_STYLE_SUV;
                    break;
                case 'CONVERT':
                    retVal |= BODY_STYLE_CONVERTIBLE;
                    break;
            }
        }
    }

    return retVal;
}


/* Gets the value of a field */
function getValue(theField, defaultValue) {
    var theValue = dwr.util.getValue(theField);
    if (defaultValue != null && (theField == null | theField == '')) {
        return defaultValue;
    }
    return theValue;
}

/* Gets the search type */
function getSearchType(stringValue) {
    if (stringValue == null) {
        var usedRadio         = document.getElementById('used-cars-search-for');
        var newRadio         = document.getElementById('new-cars-search-for');
        var certifiedRadio     = document.getElementById('certified-cars-search-for');

        if (usedRadio != null && usedRadio.checked) {
            return SEARCH_TYPE_USED;
        }
        if (newRadio != null && newRadio.checked) {
            return SEARCH_TYPE_NEW;
        }
        if (certifiedRadio != null && certifiedRadio.checked) {
            return SEARCH_TYPE_CERTIFIED;
        }
    } else {
        if (stringValue == 'certified') {
            return SEARCH_TYPE_CERTIFIED;
        }
        if (stringValue == 'used') {
            return SEARCH_TYPE_USED;
        }
        if (stringValue == 'new') {
            return SEARCH_TYPE_NEW;
        }
    }

    return SEARCH_TYPE_ALL;
}

function getSearchTypeString() {
    var searchType = getSearchType();

    switch (searchType) {
        case SEARCH_TYPE_ALL:
            return 'both';
        case SEARCH_TYPE_NEW:
            return 'new';
        case SEARCH_TYPE_CERTIFIED:
            return 'certified';
        case SEARCH_TYPE_USED:
            return 'used';
    }

    return '';
}

// Hides or Shows the 'For Sale by' module on the FYC search form according to the All, New, Certified, or Used radio buttons checked.
function hideShowSellerType() {
    //defect 22530 - AWS JS error is breaking the ads.
    if (!sellerTypeDivPresent) {return;}

    if (getSearchType() == SEARCH_TYPE_ALL) {
        document.getElementById("for-sale-by-div").style.display = "block";
    } else if (getSearchType() == SEARCH_TYPE_USED) {
        document.getElementById("for-sale-by-div").style.display = "block";
    } else {
        document.getElementById("for-sale-by-div").style.display = "none";
    }
}

/* Called when search type changes */
function searchTypeChanged() {
    enableAdSwap();

    // DEF_22735
    if ( getSearchType() == SEARCH_TYPE_NEW ||
         getSearchType() == SEARCH_TYPE_CERTIFIED) {
        if( isAWSP != 'true' ) {
            document.getElementById('for-sale-by-all').checked = true;
        }
    }

    hideShowSellerType();

    if (getSearchType() == SEARCH_TYPE_NEW) {
        var endYearField    = document.getElementById('end-year');

        var endYearValue = parseInt(endYearField.value);
        var defaultNewStartYear = parseInt(defaultNewFromYear);

        if (endYearValue < defaultNewStartYear) {
            endYearField.value = defaultNewToYear;
        }
    }
    setCertified();
    //CR 32540 - years for Certified search depend on makes and models selected
    //For that reason, in case of Certified search, we first populate makes and models,
    //and then within the same callback (syncronously) populate the years.
    populateMakesAndModels();
    if (getSearchType() != SEARCH_TYPE_CERTIFIED) {
        populateToYear(true,true);
    }
    if (isAWSP != "true")
        updateSubheader();
}

/* Called when the make changes */
function makeChanged() {
    enableAdSwap();
    populateMakesAndModels('make');
    updateSubheader();
    //callSponsorChange();//called by updateMakeAndModelState called by populateMakesAndModels
}

/* Called when the make2 changes */
function make2Changed() {
    populateMakesAndModels('make2');
}

/* Called when the make3 changes */
function make3Changed() {
    populateMakesAndModels('make3');
}

/* Called when the model changes */
function modelChanged() {
    //CR 32540 - years for Certified search need to change when makes and models change
    if (getSearchType() == SEARCH_TYPE_CERTIFIED) {
        populateYearsCertified();
    }
}

function updateSubheader() {

if (isAWSP != "true") {
    if(checkZipLength(true) && (document.getElementById("make").value !== null && document.getElementById("make").value !== "")) {
        subHeaderZipChanged();
        subHeaderMakeChanged();
            document.getElementById("fyc-sub-head-generic").style.display = "none";
            document.getElementById("fyc-sub-head").style.display = "block";
    } else {
            document.getElementById("fyc-sub-head-generic").style.display = "block";
            document.getElementById("fyc-sub-head").style.display = "none";

    }
}
}

function subHeaderMakeChanged() {
    document.getElementById("subHeaderMake").innerHTML = document.getElementById("make").options[document.getElementById("make").selectedIndex].innerHTML;
}


function subHeaderZipChanged () {
       MarketManager.getMarketByZipCode(document.getElementById("zip-code").value, updateSubheaderZip);
}

function updateSubheaderZip(data) {
    if(data.zipcode !== null) {
        if(data.city != null) {
            var city = trim(data.city.toLowerCase());

            if (city.indexOf(" ") !== -1) {
                var cityArr = city.split(" ");

                for (i =0; i<cityArr.length; i++) {
                    cityArr[i] = cityArr[i].substring(0, 1).toUpperCase()+cityArr[i].substring(1);
                }
                 document.getElementById("subHeaderCity").innerHTML = cityArr.join(" ");
            } else {
                 document.getElementById("subHeaderCity").innerHTML = city.substring(0, 1).toUpperCase()+city.substring(1);
            }
        } else {
            document.getElementById("fyc-sub-head-generic").style.display = "block";
            document.getElementById("fyc-sub-head").style.display = "none";
        }
    }
}

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;
}

function removeMakeModelOptionElements(makeSelect,modelSelect){
    removeOptionsWithLoadingIndicator(makeSelect);
    removeOptionsWithLoadingIndicator(modelSelect);
}

function removeOptionsWithLoadingIndicator(selectField){
    selectField.innerHTML = "";
    selectField.options[0] = new Option("Loading...", "");
    selectField.disabled = true;
}

/* Populates the make field */
/* param: cascade - populate all dependent fields. */
function populateMakesAndModels(fieldName, updateType) {
    var makeField = document.getElementById('make'),
    make2Field    = document.getElementById('make2'),
    make3Field    = document.getElementById('make3');

    var modelField = document.getElementById('model'),
    model2Field    = document.getElementById('model2'),
    model3Field    = document.getElementById('model3');

    var makeValue = makeField.value,
    make2Value    = make2Field.value,
    make3Value    = make3Field.value;

    var modelValue = modelField.value,
    model2Value    = model2Field.value,
    model3Value    = model3Field.value;

    /* logic to only update the fields that need to be updated */
    if (fieldName == null) {
        removeMakeModelOptionElements(makeField,modelField);
        removeOptionsWithLoadingIndicator(make2Field);
        if (!isDefaultValue(make2Value)) {
            removeMakeModelOptionElements(make3Field,model2Field);
            if (!isDefaultValue(make3Value)) {
                removeOptionsWithLoadingIndicator(model3Field);
            }
        }
    } else {
        switch (fieldName) {
            case 'make':
                removeMakeModelOptionElements(make2Field,modelField);
                break;
            case 'make2':
                removeMakeModelOptionElements(make3Field,model2Field);
                break;
            case 'make3':
                removeOptionsWithLoadingIndicator(model3Field);
                break;
        }
    }

    FycSearchForm.getMakeAndModelLists(
        getSearchType(),
        getBodyStyle(),
        makeValue,
        make2Value,
        make3Value,
        {
            callback:function(makesAndModels) {
                if (fieldName == null) {
                    populateSelectCallback(makesAndModels.makeSelectOptions, makeField, makeValue);
                    populateSelectCallback(makesAndModels.modelSelectOptions, modelField, modelValue);
                    populateSelectCallback(makesAndModels.make2SelectOptions, make2Field, make2Value);
                    if (!isDefaultValue(make2Value)) {
                        populateSelectCallback(makesAndModels.model2SelectOptions, model2Field, model2Value);
                        populateSelectCallback(makesAndModels.make3SelectOptions, make3Field, make3Value);
                        if (!isDefaultValue(make3Value)) {
                            populateSelectCallback(makesAndModels.model3SelectOptions, model3Field, model3Value);
                        }
                    }
                    if (updateType == 'bodyStyle') {
                        updateAds(makeValue);
                    } else {
                        updateAds();
                    }
                } else {
                    switch (fieldName) {
                        case 'make':
                            // Clearing the previously cached value
                            if (modelValue != null || modelValue != '') {
                                modelValue = '';
                            }
                            populateSelectCallback(makesAndModels.modelSelectOptions, modelField, modelValue);
                            processTrimSeriesIndention(modelField);
                            populateSelectCallback(makesAndModels.make2SelectOptions, make2Field, make2Value);
                            updateAds();
                            break;
                        case 'make2':
                            // Clearing the previously cached value
                            if (model2Value != null || model2Value != '') {
                                model2Value = '';
                            }
                            populateSelectCallback(makesAndModels.model2SelectOptions, model2Field, model2Value);
                            processTrimSeriesIndention(model2Field);
                            populateSelectCallback(makesAndModels.make3SelectOptions, make3Field, make3Value);
                            break;
                        case 'make3':
                            // Clearing the previously cached value
                            if (model3Value != null || model3Value != '') {
                                model3Value = '';
                            }
                            populateSelectCallback(makesAndModels.model3SelectOptions, model3Field, model3Value);
                            processTrimSeriesIndention(model3Field);
                            break;
                    }
                }

                if(fieldName == null || fieldName == 'make') {
                    updateMakeAndModelState(true);
                } else {
                    updateMakeAndModelState(false);
                }
                //defect 7811. For certified searches, we need to finish populating makes and models
                //BEFORE populating years.
                if (getSearchType() == SEARCH_TYPE_CERTIFIED) {
                    populateYearsCertified();
                }
            }
        }
    );

}

/**
 * Defect 23068 - per business requirement, submodels will have spaces to indent them.
 * Webkit doesn't support text-indent, so we fall back to nbsp for it and exploder.  However, Safari 3.2 doesn't like nbsp inserted dynamically.   The nightly WebKit build is ok, though.
 * @param selectBoxId - a pointer to the select box you wish to update
 */
function processTrimSeriesIndention(selectBoxElement){
    var options = selectBoxElement.getElementsByTagName('option');
    var firefox = navigator.userAgent.toLowerCase().indexOf('firefox')!=-1;

    for (i=0, optLen=options.length; i<optLen; i++){
        var currentItem = options[i];

        //ff didn't like the NBSP on the generated items.  IE reconginzes the class on update, but not on page load!?!?!  Safari... don't get me started.
        if (firefox){
            if (currentItem.innerHTML.indexOf(" ")==0){
                currentItem.setAttribute("class","hanging-indent");
            }
        } else {
            var content = currentItem.innerHTML;
            content = content.replace(/\s/g,"&nbsp;&nbsp;");
        }
    }
}

/* Called to initially populate the form */
function populateForm(zipValFromCookie) {

    var zipElem = document.getElementById('zip-code');

    if (zipElem.value == '') {
        zipElem.value = zipValFromCookie;
    }
    updateMakeAndModelState();
    updateColorState();
}


/* Called when the body style changes. */
function bodyStyleChanged() {
    var bodyCode = document.getElementById('bodyCode');
    bodyCode.value = getBodyStyle();
    populateMakesAndModels(null,'bodyStyle');
}


/* Updates the state of make/model fields. */
function updateMakeAndModelState(updateSponsorAd) {

    var make     = document.getElementById('make');
    var model     = document.getElementById('model');
    var make2     = document.getElementById('make2');
    var model2     = document.getElementById('model2');
    var make3     = document.getElementById('make3');
    var model3    = document.getElementById('model3');

    make.disabled = false;

    if (isDefault(make)) {
        model.disabled = true;
        model.value = '';
        make2.disabled = true;
        make2.value = '';
    } else {
        model.disabled = false;
        make2.disabled = false;
    }

    if (isDefault(make2)) {
        model2.disabled = true;
        model2.value = '';
        make3.disabled = true;
        make3.value = '';
    } else {
        model2.disabled = false;
        make3.disabled = false;
    }

    if (isDefault(make3)) {
        model3.disabled = true;
        model3.value = '';
    } else {
        model3.disabled = false;
    }

    if(updateSponsorAd) {
        callSponsorChange();//added global var styles
    }
}

function clearMakesAndModels() {
    var makeField = document.getElementById('make');
    var make2Field = document.getElementById('make2');
    var make3Field = document.getElementById('make3');

    makeField.value = '';
    make2Field.value = '';
    make3Field.value = '';
    updateMakeAndModelState();
}


/* Updates the state of color fields. */
function updateColorState() {
    var color     = document.getElementById('exterior-color-one');
    var color2     = document.getElementById('exterior-color-two');
    var color3     = document.getElementById('exterior-color-three');

    color.disabled = false;
    if (isDefault(color)) {
        color2.disabled = true;
        color2.value = '';
    } else {
        color2.disabled = false;
    }

    if (isDefault(color2)) {
        color3.disabled = true;
        color3.value = '';
    } else {
        color3.disabled = false;
    }
}

function isPowerSearch() {
    return false;
}


/* Utility functions to determine if a dropdown is @ its default value. */
function isDefault(theField) {
    return isDefaultValue(theField.value);
}
function isDefaultValue(theValue) {
    return (theValue == null || theValue == '');
}

/* Toggle More Criteria */
function displayToggle(){
    if(document.getElementById('more-criteria').style.display == 'none') {
        showMoreCriteria();
        document.getElementById( 'make-model-trim' ).scrollIntoView();
    } else {
        hideMoreCriteria();
        /* Write Business Intelligence ASIS tag to Logs */
        asis("/no_cache/ac/findacarform2_hide_search_criteria_ac.asis");
    }
}

function showMoreCriteria(){
    document.getElementById('more-criteria').style.display          = 'block';
    document.getElementById('expand-collapse-link').innerHTML       = hideMoreLinkText; /* variable is declared on search_form.jsp for spanish */
    document.getElementById('expand-collapse-link').style.background= 'url(../../img/fyc/btn_collapse.gif) center left no-repeat';
    /*Set Advance Parameter for 'Modify Search' to open more criteria section when the page loads */
    form.advanced.value = "y";
}

function hideMoreCriteria(){
    document.getElementById('more-criteria').style.display          = 'none';
    document.getElementById('expand-collapse-link').innerHTML       = viewMoreLinkText;
    document.getElementById('expand-collapse-link').style.background= 'url(../../img/fyc/btn_expand.gif) center left no-repeat';

    /*Clear Advance Parameter */
    form.advanced.value = "";
}

function changePlusMinus() {
    if(document.getElementById('more-criteria').style.display == 'none') {
        document.getElementById('expand-collapse-link').style.background= 'url(../../img/fyc/btn_expand_orange.gif) center left no-repeat';
    } else {
        document.getElementById('expand-collapse-link').style.background= 'url(../../img/fyc/btn_collapse_orange.gif) center left no-repeat';
    }
}

function goToBottom() {

    document.location.href = "/fyc/index.jsp#bottom";
}

function resetChangePlusMinus() {
    if(document.getElementById('more-criteria').style.display == 'none') {
        document.getElementById('expand-collapse-link').style.background= 'url(../../img/fyc/btn_expand.gif) center left no-repeat';
    } else {
        document.getElementById('expand-collapse-link').style.background= 'url(../../img/fyc/btn_collapse.gif) center left no-repeat';
    }
}

/* Show/Hide Body Styles and Uncheck When Closed */
function toggleBodyStyle(display){
    if (display == 'none') {
        hideBodyStyle();
        bodyStyleChanged();
    } else {
        showBodyStyle();
    }
}

function showBodyStyle(){
    document.getElementById('body-style-options-div').style.display = 'block';
    document.getElementById('body-style-choice').checked            = true;
}

function hideBodyStyle(){
    document.getElementById('body-style-options-div').style.display = 'none';
    document.getElementById('body-style-choice-any').checked        = true;
    for(var i=0;i<form.body_style.length;i++){
        form.body_style[i].checked = false;
    }
}

/* Highlight Select Box Row */
function highlightSelect(id,state){
    document.getElementById(id).style.background  = state=='on'?'#e1f0ff':'#ffffff';
    document.getElementById(id).style.borderColor = state=='on'?'#65b2ff':'#ffffff';
}

/* Set Certified */
function setCertified() {
    var isCertified = getSearchType() == SEARCH_TYPE_CERTIFIED;

    form.certified.value = isCertified?'y':'';
}

function showZipErrorMessage() {
  document.getElementById('zipmessage').className = 'search-form-error';
  document.getElementById('invalidzipmessage').style.display  = 'block';
  document.getElementById('zip-code').focus();
}

function hideZipErrorMessage() {
    document.getElementById('zipmessage').className = '';
    document.getElementById('invalidzipmessage').style.display  = 'none';
}

function showAggregationOption() {
  document.getElementById('aggregation').style.display  = 'block';
}

function hideAggregationOption() {
    document.getElementById('aggregation').style.display  = 'none';
}

var zipFormat = /(^\d{5}$)|(^\d{5}-\d{4}$)/;

function zipFormatValid() {

    if(!form.address.value || form.address.value.length < 5 || form.address.value == '00000' || !form.address.value.match(zipFormat) || document.getElementById("marketZipError").value == 'true'){
        showZipErrorMessage();
        return false;
    }

    return true;
}

function checkForEnterKey(e) {
    BrowserDetect.init();
    if (BrowserDetect.browser=='Explorer') e = event;
    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
        validateForm();
        return false;
    }
    return true;
}
function doShowZipErrors() {
    var el = document.getElementById('showZipError') ;
    return el && 'y' == el.value;
}
function checkZipLength(retVal) {
    zip = document.getElementById("zip-code").value;

    if(retVal) {
        return zip.length == 5;
    }

    if (zip.length == 5) {
        if (document.getElementById("body-style-choice-any").checked) {
            document.getElementById("body-style-choice-any").focus();
        } else {
            document.getElementById("body-style-choice").focus();
        }
    }
}

function validMarketZip() {
    zip = document.getElementById("zip-code").value;
    document.getElementById("zip-code").focus();
    /*Need to have this check because we do not populate zip code if request is from VSSP*/
    if (zip != null) {
      MarketManager.getMarketByZipCode(zip, marketCallBack);
   }
}

var marketCallBack = function (data) {
    if (data.zipCode != null) {
        document.searchForm.marketZipError.value = "false";
    } else {
       document.searchForm.marketZipError.value = "true";
        if (doShowZipErrors()){
            showZipErrorMessage();
        }
    }
}

function processCarIdLookup() {
    var carId = document.getElementById("carIdText").value;
    carId = carId.toUpperCase();

    if(carId.indexOf('AT-') == -1) {
        carId = 'AT-' + carId;
    }
    document.getElementById('carIdText').value = carId;
    carId = document.getElementById("carIdText").value.substring(3);

    var validChar='0123456789ABCDEF';
    var hexValid = true;
    for (i=0; i < carId.length; i++) {
        if (validChar.indexOf(carId.charAt(i)) < 0) {
            hexValid = false;
        }
    }

    if (carId != null && carId != "" && hexValid) {
        FycSearchFormUtil.checkCarId(carId, atCarIdCallBack);
    } else {
        var element = document.getElementById('atcCarIdSearchDiv');
        var frameElement = document.getElementById('atcCarIdSearchIFrame');
        var title = document.getElementById('carIdSearchTitle');
        var blurb = document.getElementById('carIdSearchBlurb');
        title.innerHTML = '<strong>' + document.getElementById('atc-car-id-title-definition').innerHTML + carId + '</strong>';
        blurb.innerHTML = document.getElementById('atc-car-id-blurb-definition').innerHTML;
        document.getElementById('carIdText').focus();
    }
}

var atCarIdCallBack = function (data) {
    var carId = document.getElementById("carIdText").value;
    if (data != null) {
        var element = document.getElementById('atcCarIdSearchDiv');
        if(element.style.display == 'block') {
            element.style.display = 'none';
            // mis code below is logged when user clicks the Find button that appears when find by AT Car ID link is clicked on FYC search form
            return BILogUtil.Redirector('/fyc/vdp.jsp?car_id=' + parseInt(carId.substring(3), 16) + '&dealer_id=' + data, ["mis=FCSFBDMGID1219"], false).send();

        }
    } else {
        var element = document.getElementById('atcCarIdSearchDiv');
        var frameElement = document.getElementById('atcCarIdSearchIFrame');
        var title = document.getElementById('carIdSearchTitle');
        var blurb = document.getElementById('carIdSearchBlurb');
        title.innerHTML = '<strong>' + document.getElementById('atc-car-id-title-definition').innerHTML + carId + '</strong>';
        blurb.innerHTML = document.getElementById('atc-car-id-blurb-definition').innerHTML;
        document.getElementById('carIdText').focus();
    }
}

/* Validate Form */
function validateForm(){
    var numberOfErrors = 0;

    $('lastStartYear').value = $('start-year').options[0].value;

    if (document.getElementById('carIdText').value != null && document.getElementById('carIdText').value != "") {
        numberOfErrors++;
        processCarIdLookup();
    }

    hideZipErrorMessage();

    /* Set the advanced equals y parameter if any 'more criteria' have been selected */
    var colorIndex = document.getElementById('exterior-color-one').selectedIndex;
    var mileageIndex = document.getElementById('mileage').selectedIndex;
    var sortTypeIndex = document.getElementById('sort_type').selectedIndex;
    if (form.transmission.options[0].selected     != true
        || form.engine.options[0].selected         != true
        || form.drive.options[0].selected         != true
        || form.doors.options[0].selected         != true
        || form.fuel.options[0].selected         != true
        || form.mileage.options[mileageIndex].value != ""
        || form.color.options[colorIndex].value != ""
        || form.color2.options[0].selected         != true
        || form.color3.options[0].selected         != true
        || form.sort_type.options[sortTypeIndex].value != "priceDESC"
        || form.only_photo.checked                 == true
        || form.only_price.checked                 == true
        || form.only_special.checked               == true){
        form.advanced.value = "y";
    }

    //we don't want to pass on the redirect url into the srl url... must return a blank value
    if (form.sponsorModel) {
        form.sponsorModel.options[0].value = '';
        form.sponsorModel.value = '';
    }

    /* Remove Any Commas or Dollar Signs */
    form.min_price.value = replaceStr(replaceStr(form.min_price.value,"$",""),",","");
    form.max_price.value = replaceStr(replaceStr(form.max_price.value,"$",""),",","");

    /* Remove any decimals and following characters */
    form.min_price.value = stripDecimals(form.min_price.value);
    form.max_price.value = stripDecimals(form.max_price.value);

    if (document.getElementById("keywords-display").value != null && document.getElementById("keywords-display").value != '') {  //&&  document.getElementById("keywords-display").value != '""') {
        document.getElementById("keywordsrep").value = encodeASCII(document.getElementById("keywords-display").value);
        document.getElementById("keywordsfyc").value = encode64(document.getElementById("keywords-display").value);
    }else {
        /*Defect 13122:: re-set the hidden field values of the following when the user hits the browser back button from the SRP to the search form */
         document.getElementById("keywordsrep").value ="";
         document.getElementById("keywordsfyc").value ="";
    }

    if (!zipFormatValid()) {
        numberOfErrors++;
    }
    if (isNaN(form.min_price.value) || isNaN(form.max_price.value)
            || parseInt(form.min_price.value) > parseInt(form.max_price.value)) {
        document.getElementById('pricerangelegend').className       = 'pricemessage';
        document.getElementById('invalidpricemessage').style.display= 'block';

        if (document.getElementById('zipmessage').className != 'search-form-error') {
            document.getElementById('lowest-price').focus();
        }

        numberOfErrors++;
    } else {
        document.getElementById('pricerangelegend').className       = '';
        document.getElementById('invalidpricemessage').style.display= 'none';
    }
    if(numberOfErrors==1){
        /* Move absolute positioned dealer direct add when validation message is displayed. TODO: remove when no dealer direct add */
        document.getElementById('sponsorAdsDisplay').style.top         = '340px';
        self.scrollTo(0,290);
    }else if(numberOfErrors>1){
        document.getElementById('sponsorAdsDisplay').style.top         = '340px';
        self.scrollTo(0,290);
    }
    return 0 == numberOfErrors; //if there are no errors, return true and allow the form to submit!
}


/* Clear Form */
function clearForm(isAwsp){
    //added isAwsp passed in as true or false
    clearMakesAndModels();
    /* Store Zip temporarily to repopulate after reset */
    var tempAddress = form.address.value;
    /* Hide More Criteria */
    if (!isAwsp) {
        hideMoreCriteria();
    }
    /* Reset text inputs */
    form.reset();
    /* Reset Select, Radio, Checkboxes Boxes */

    for(var i=0;i<form.elements.length;i++){
        if(form.elements[i].type == 'select-one'){
            form.elements[i].options[0].selected = true;
        }
        if(form.elements[i].type == 'radio' || form.elements[i].type == 'checkbox'){
            form.elements[i].checked = false;
        }
    }

    /* Hide Body Style */
    toggleBodyStyle('none');

    /* Set Special Default Values  */
    if (isAwsp) {
        document.getElementById('new-cars-search-for').checked          = true;
    } else {
        if (document.getElementById('all-cars-search-for') == null) {
            document.getElementById('used-cars-search-for').checked     = true;
        } else {
            document.getElementById('all-cars-search-for').checked      = true;
        }
        hideShowSellerType();
    }
    form.min_price.value                                                 = "";
    form.max_price.value                                                 = "";
    form.keywords_display.value                                            = "";
    document.getElementById("keywordsrep").value = "";
    document.getElementById("keywordsfyc").value = "";
    document.getElementById('body-style-choice-any').checked            = true;
    resetDefaultSearchDistance();
    if (isAwsp) {
        form.special_type.options[0].selected                           = true;
    } else {
        form.sort_type.options[2].selected = true;
    }

    form.address.value                                                  = tempAddress;
    form.advanced.value                                                 = '';
    updateColorState();
    resetYears();
    /* Clear Validation Text */
    document.getElementById('zipmessage').className                     = '';
    document.getElementById('invalidzipmessage').style.display          = 'none';
    document.getElementById('pricerangelegend').className               = '';
    document.getElementById('invalidpricemessage').style.display        = 'none';
    document.getElementById('sponsorAdsDisplay').style.top             = '340px';

    if (!isAwsp) {
        /* Write Business Intelligence ASIS tag to Logs */
        asis("/no_cache/ac/findacarform2_clearform_ac.asis");
    }

    /* Since the form was cleared the zip must be validated again after the form zip value is repopulated to reset the hidden error input*/
    validMarketZip();

    setSessionAttribute("LAST_SEARCH_PARAMS", "");

    if (!isAwsp) {
        document.getElementById("fyc-sub-head-generic").style.display = "block";
        document.getElementById("fyc-sub-head").style.display = "none";
    }
    /* Set "For Sale By" default */
    if (!isAwsp) {
        document.getElementById('for-sale-by-all').checked          = true;
    }
}

/* Sets Default Search Radius */
function resetDefaultSearchDistance(){
    for (var i = 0; i < form.distance.options.length; i++) {
        if (defaultSearchDistance == form.distance.options[i].value) {
            form.distance.options[i].selected = true;
            return;
        }
    }
}

/* When Page Loads */
function formInitialization(){
    populateFormUsingCookie();
    hideShowSellerType();

    /* Detect advanced hidden parameter and open form if value equals 'y' */
    if(isAdvanced()){
        showMoreCriteria();
    }
    if (isHighlightFirstMakeModel()){
        highlightSelect('rollover-container-one','on');
    }

    updateColorState();

}

/* Fix for IE Bug Label/Image Bug */
window.onload = function(){
if(document.all && navigator.appVersion.indexOf("MSIE")>-1 && navigator.appVersion.indexOf("Windows")>-1) {
    var a = document.getElementsByTagName("label");
    for(var i=0,j=a.length;i<j;i++){
      if(a[i].hasChildNodes && a[i].childNodes.item(0).tagName == "IMG"){
        a[i].childNodes.item(0).forid = a[i].htmlFor;
        a[i].childNodes.item(0).onclick = function(){
          var e = document.getElementById(this.forid);
          switch(e.type){
            case "radio": e.checked|=1;break;
            case "checkbox": e.checked=!e.checked;break;
            case "text": case "password": case "textarea": e.focus(); break;
          }
        };
      }
    }
  }

};

/*Search Sponsorship */
var sponsorWin = "";
function formHandler(urlObj) {
    var URL = form.sponsorModel.value;
    if (URL == "") {
        URL = urlObj;
    }
    if (URL != "") {
        sponsorWin = window.open(URL, 'sponsorWin', "menubar=yes,toolbar=yes,location=yes,directories=yes,status=yes,scrollbars=yes,resizable=yes,width=1100,height=800");
        sponsorWin.focus();
    }
}

function isAdvanced() {
    var advancedField = document.getElementById('advanced');
    var advancedValue = advancedField.value;

    if ('y' == advancedValue) {
        return true;
    }

    return false;
}
function isHighlightFirstMakeModel() {
    return document.getElementById('highlightFirstMakeModel') &&  document.getElementById('highlightFirstMakeModel').value == 'y';
}

function callSponsorChange() {

    //re-collapse sponsorship ad in case new make is non-sponsorship clear sponsor content
    clearSponsorshipContent();
    clearCertifiedContent();

    var makeField = document.getElementById('make');
    var makeValue = makeField.value;
    var modelField = document.getElementById('model')
    var modelValue = modelField.value;
    var addressField = document.getElementById('zip-code');
    var addressValue = addressField.value;
    var languageField = document.getElementById('search_lang');
    var languageValue = languageField.value;
    var fromDateField = document.getElementById('start-year');
    var fromDateValue = fromDateField.value;
    var toDateField = document.getElementById('end-year');
    var toDateValue = toDateField.value;
    var fromPriceField = document.getElementById('lowest-price');
    var fromPriceValue = fromPriceField.value;
    var toPriceField = document.getElementById('highest-price');
    var toPriceValue = toPriceField.value;
    var pageLocationField = document.getElementById('page_location');
    var pageLocationValue = pageLocationField.value;

    var url = SPONSOR_PAGE + '?make=' + makeValue;
    url += '&model=' + modelValue;
    if (isAdvanced()) {
        url += '&advanced=y';
    }
    url += '&address=' + addressValue;
    url += '&language=' + languageValue;
    url += '&fromDate=' + fromDateValue;
    url += '&toDate=' + toDateValue;
    url += '&fromPrice=' + fromPriceValue;
    url += '&toPrice=' + toPriceValue;
    url += '&pageLocation=' + pageLocationValue;
    var searchType = getSearchTypeString();
    url += '&search_type=' + searchType;

    url += '&styles=' + this.styles;
    url += '&ifid=' + this.ifid;
    url += '&Log=0';
    ajaxEngine.call('sponsors',url,'updateSponsors',false,null);
}

///////////////////////////////////////////////////////////////////////////
// We needed to swap the ad order for Toyota only (when "all cars" or "new search" are selected)
//   without changing the structure of the page
// This is a really bad way to do this but it needs to be done quick and dirty
// I ran this method by Scott Markle and he agreed that this would be fine for now
// Currently, this is tested only in IE and Mozilla. It would be a good idea to do
//     multiple version testing within these browsers as well as Safari etc..
function swapAdsSpecialCase()
{
        document.getElementById('350TowerAd').style.position='absolute';
        document.getElementById('sponsorAdsDisplay').style.position='absolute';
        document.getElementById('towerAd').style.position='absolute';

        document.getElementById('sponsorAdsDisplay').style.top='60px';
        document.getElementById('350TowerAd').style.top='210px';
        document.getElementById('towerAd').style.top='194px';

        document.getElementById('350TowerAd').style.right='0px';
        document.getElementById('towerAd').style.right='0px';

}

function swapAdsNormalCase()
{
        document.getElementById('350TowerAd').style.position='absolute';
        document.getElementById('sponsorAdsDisplay').style.position='absolute';
        document.getElementById('towerAd').style.position='absolute';

        document.getElementById('sponsorAdsDisplay').style.top='340px';
        document.getElementById('350TowerAd').style.top='17px';
        document.getElementById('towerAd').style.top='0px';

        document.getElementById('350TowerAd').style.right='0px';
        document.getElementById('towerAd').style.right='0px';

}
//////////////////////////////////////////////////////////////////////////

function trimString(str) {
    return str.replace(/^[\s|\n]|[\s|\n]$/g,''); //ckeen Performance Tuning
}

function updateSponsors(id,req) {
    clearSponsorshipContent();
    /*
        DEF_10481 - Firefox won't give access to responseXML.documentElement
        when document.domain is set, so we have to us a different method
        to access the XML returned from the AJAX response.
    */
    BrowserDetect.init();
    if (BrowserDetect.browser == "Firefox") {
        response = (new DOMParser()).parseFromString(req.responseText, "text/xml");
    } else {
        response = req.responseXML.documentElement;
    }

    var sponsorElements = response.getElementsByTagName('sponsor');
    var sponsorContent = '';
    if(sponsorElements.length > 0){
        if (sponsorElements.item(0).getElementsByTagName('sponsor_content').item(0).firstChild) {
            sponsorContent = sponsorElements.item(0).getElementsByTagName('sponsor_content').item(0).firstChild.data;
        }
        sponsorContent = trimString(sponsorContent);
        var sponsorSize = '';
        if (sponsorElements.item(0).getElementsByTagName('sponsor_size').item(0).firstChild) {
            sponsorSize = sponsorElements.item(0).getElementsByTagName('sponsor_size').item(0).firstChild.data;
        }
        if (document.getElementById) {
            if (sponsorContent != '') {
                  if (document.getElementById('sponsorAdsDisplay')) {
                     document.getElementById('sponsorAdsDisplay').innerHTML = sponsorContent;
                  }
            } else {
                clearSponsorshipContent();
            }
        }
    }
    var certElements = response.getElementsByTagName('certifiedText');
    if (certElements.length > 0) {
        var certContent = certElements.item(0).firstChild.data;
        if (document.getElementById) {
            document.getElementById('certifiedTextContent').innerHTML = certContent;
        }
    }
}

function clearSponsorshipContent() {
    if (document.getElementById('sponsorAdsDisplay')) {
        document.getElementById('sponsorAdsDisplay').innerHTML = '';
        document.getElementById('sponsorAdsDisplay').style.display = 'none';
    }
}

function clearCertifiedContent() {
    if (document.getElementById) {
        document.getElementById('certifiedTextContent').innerHTML = '';
    }
}

// Get form value regarless of input type
function getFormValue(e) {
    var v = "";
    if (e) {
        if ((e.type == 'select-one')
            || (e.type == 'text')
            || (e.type == 'hidden')
            || (e.type == 'checkbox' && e.checked=="1")) {
            v = e.value;
        } else {
            for (var i = 0; i < e.length; i++) {
                if ((e[i].type == 'hidden')
                     || (e[i].type == 'radio' && e[i].checked==true)
                     || (e[i].type == 'checkbox' && e[i].checked=="1")) {
                    v += ',' + e[i].value;
                }
            }
            if (v.length > 0) {
                v = v.substring(1);
            }
        }
    }
    return v;
}

// Changes the ad parameters for Leader, Tower and Footer1x1 ad placements
var adUrlQueryString = ''; // Set on calling page to access dma, state, etc.
function changeAdPlacement(make, formObj, baseUrl, locationParam, Leader, Sponsor, Tower, lnxCode, isMediaPartner) {
    var makeForAd = make;
    var modelForAd = "none";

    if (isDefaultValue(make)) {
        makeForAd = "none";
        modelForAd = "none";
    }

    var searchTypeForAd = getSearchTypeString();
    if(searchTypeForAd == ""){ searchTypeForAd = "used"; }
    if(searchTypeForAd == "both"){ searchTypeForAd = "all"; } // Due to Non-ISP/ISP codes.

    var certifiedForAd = "n";
    if (searchTypeForAd == "certified") { certifiedForAd = "y"; }

    var advancedForAd = "quick";
    if (isAdvanced()) { advancedForAd = "power"; }

    var startYearForAd = getFormValue(formObj.start_year);
    var endYearForAd = getFormValue(formObj.end_year);
    var startPriceForAd = getFormValue(formObj.min_price);
    var endPriceForAd = getFormValue(formObj.max_price);
    var addressForAd = getFormValue(formObj.address);
    var langForAd = getFormValue(formObj.search_lang);

    var ordForAd = new Date().getTime();

    var DMAForAd = '', regionForAd = '', stateForAd = '', yearRangeForAd = '', tile = '';
    var args = adUrlQueryString.split('&');

    for (var i=0; i<args.length; i++) {
        var arg = args[i].split('=');
        if (arg[0] == 'dma') {
            DMAForAd = arg[1];
        } else if (arg[0] == 'region') {
            regionForAd = arg[1];
        } else if (arg[0] == 'state') {
            stateForAd = arg[1]
        } else if (arg[0] == 'yearrange') {
            yearRangeForAd = arg[1];
        } else if(arg[0] == 'tile') {
            tile = arg[1];
        }
    }

    var cobrandCox = false;
    var queryStringForAd = '&tile=' + tile + '&page=' + locationParam + '&ord=' + ordForAd + '&zip='
            + addressForAd + '&state=' + stateForAd + '&dma=' + DMAForAd + '&region=' + regionForAd + '&make='
            + makeForAd + '&model=' + modelForAd + '&type=' + searchTypeForAd + '&start_year=' + startYearForAd
            + '&end_year=' + endYearForAd + '&from_price=' + startPriceForAd + '&to_price=' + endPriceForAd
            + '&yearrange=' + yearRangeForAd + '&certified=' + certifiedForAd + '&language=' + langForAd
            + '&search=' + advancedForAd;

      if(lnxCode !=null && lnxCode.indexOf("COXTV") > -1){
            cobrandCox = true;
     }

    /*if we need to add partner, as for cpp
    cobrandMSN defined in util.js and also switched in header.jsp*/

    if (cobrandMSN) {
        queryStringForAd += '&partner=msn&site=msn';
    } else if (cobrandMSNLA) {
        queryStringForAd += '&partner=msnlatino&site=ntl';

    } else {
        //Ad Strategies CR, added 1/18/2008 - no CR number, however the title of the CR is
        // 'Add "partner=atc" as default to all ad tags'"
        // defaulting the partner value to 'atc' when not cobranded.
        queryStringForAd += '&partner=atc&site=ntl';
    }

    try {
        //if in frames (initially for CPP)
        //Hard coding the flip values for CR#36959; have to be removed on the next CR
        if (top.location != location) {
            if (window.top.frames[1].frames['headerLeader'] != null && window.top.frames[1].frames.display != 'none') {
                document.getElementById('headerLeader').setAttribute('adtagrequest', 'adsize=728x90' + queryStringForAd + '&flip=a'+ Leader);
                document.getElementById('headerLeader').src="/inc/ad.html?Log=0";
            }
            if (window.top.frames[1].frames['350TowerAd'] != null) {

                if (location.replace) {
                   if(cobrandCox) {
                       window.top.frames[1].frames['350TowerAd'].location.replace( "/cobrand/cox_ads.jsp?width=300&height=250&LNX="+lnxCode);
                   } else if(isMediaPartner) {
                       window.top.frames[1].frames['350TowerAd'].location.replace( "/cobrand/partner_ads.jsp?Log=0&width=300&height=250&LNX="+lnxCode);
                   } else {
                       document.getElementById('350TowerAd').setAttribute('adtagrequest', 'adsize=300x250' + queryStringForAd+'&flip=a' + Tower);
                       document.getElementById('350TowerAd').src="/inc/ad.html";
                   }
                } else {
                    document.getElementById('350TowerAd').setAttribute('adtagrequest', 'adsize=300x250' + queryStringForAd+'&flip=a' + Tower);
                    document.getElementById('350TowerAd').src="/inc/ad.html";
                }
            }

          } else {
            //if not in frames
            if (window.top.frames['headerLeader'] != null && window.top.frames.display != 'none') {
                document.getElementById('headerLeader').setAttribute('adtagrequest', 'adsize=728x90' + queryStringForAd + '&flip=a'+ Leader);
                document.getElementById('headerLeader').src="/inc/ad.html?Log=0";
            }
            if (window.top.frames['350TowerAd'] != null) {

                if (location.replace) {
                  if(cobrandCox) {
                    window.top.frames['350TowerAd'].location.replace( "/cobrand/cox_ads.jsp?width=300&height=250&LNX="+lnxCode);
                  } else if(isMediaPartner) {
                      window.top.frames[1].frames['350TowerAd'].location.replace( "/cobrand/partner_ads.jsp?Log=0&width=300&height=250&LNX="+lnxCode);
                  } else {
                      document.getElementById('350TowerAd').setAttribute('adtagrequest', 'adsize=300x250' + queryStringForAd+'&flip=a' + Tower);
                      document.getElementById('350TowerAd').src="/inc/ad.html";
                  }
                } else {
                    document.getElementById('350TowerAd').setAttribute('adtagrequest', 'adsize=300x250' + queryStringForAd+'&flip=a' + Tower);
                    document.getElementById('350TowerAd').src="/inc/ad.html";
                }
            }
            //Defect 23622 / 24277 - DO NOT REMOVE THIS.  AdServing needs it to count ad impressions.
            if (window.top.frames['footer1x1'] != null) {
                document.getElementById('footer1x1').setAttribute('adtagrequest', 'adsize=1x1' + queryStringForAd);
                document.getElementById('footer1x1').src="/inc/ad.html";
            }
          }
    } catch (e) {
        //do nothing. This is here to catch the exceptions that occur when ad blocking is enabled.
    }
}

// Container function
function ajaxEngine() {
}

var SPONSOR_PAGE = '/ajax/retrieveCertifiedAndSponsorshipContent.jsp';

/*
 * id = form element object name
 * url = url for server request
 * callbackFunction = function to send returned data
 * loadMsg = show "loading" message (boolean) - needs work
*/
ajaxEngine.call = function(id,url,callbackFunction,loadMsg,extraParams) {
    try {
        var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    } catch(err){
         return; //no Ajax...
    }
    req.onreadystatechange = function(){ajaxEngine.handleRequest(id,req,callbackFunction,loadMsg,extraParams);};
    req.open("GET", url, true);
    req.send(null);
}
ajaxEngine.handleRequest = function(id,req,callbackFunction,loadMsg,extraParams) {
    if (req.readyState == 1 && loadMsg) {
        loading(id);
    } else if (req.readyState == 4) {
        if (req.status == 200) {
            // send data to callback function
            eval(callbackFunction + '(id,req,extraParams)');
        } else {
            if (id == "0") {
                form.model.options[0].text = 'All Models';
                form.make.selectedIndex = 0;
                alert("We're sorry, there was an error while retrieving a relevant model list. Please select your Make again.");
                form.make.focus();
            } else if (id == "1") {
                form.model2.options[0].text = 'Select one';
                form.make2.selectedIndex = 0;
                alert("We're sorry, there was an error while retrieving a relevant model list. Please select your Make again.");
                form.make2.focus();
            } else if (id == "2") {
                form.model3.options[0].text = 'Select one';
                form.make3.selectedIndex = 0;
                alert("We're sorry, there was an error while retrieving a relevant model list. Please select your Make again.");
                form.make3.focus();
            } else if (id == 'allMakes') {
                makeDropDownObjArray[0].options[0].text = 'All Makes';
                makeDropDownObjArray[0].selectedIndex = 0;
                if (makeDropDownObjArray.length > 1) {
                    if (makeDropDownObjArray[1].selectedIndex > 0 || makeDropDownObjArray[2].selectedIndex > 0) {
                         makeDropDownObjArray[0].options[0].text = 'Select one';
                         makeDropDownObjArray[0].selectedIndex = 0;
                    }
                    makeDropDownObjArray[1].options[0].text = 'Select one';
                    makeDropDownObjArray[1].selectedIndex = 0;
                    makeDropDownObjArray[2].options[0].text = 'Select one';
                    makeDropDownObjArray[2].selectedIndex = 0;
                }
                alert("We're sorry, there was an error while retrieving relevant make and model information. Please select your Search Type or Body Style again.");
            }
        }
    }
}

function nonNull(value) {
    if (value == null) {
        return '';
    }
    return value;
}

function isNumeric( str ) {
    str = new String( str );
    return str.match( /^\d+$/ );
}

function trim( str ) {
    str = new String( str );
    return str.replace( /^\s+/g, '' ).replace( /\s+$/g, '' );
}

function getBkmsFromURL()
{
    var nameValues = document.location.href.split( "&" );

    for( var i = 0; i < nameValues.length; i++ )
    {
        if ( nameValues[ i ].indexOf( "bkms" ) != "-1" )
        {
            var bkmsVal = nameValues[ i ].split( "=" )[ 1 ];
            if (bkmsVal != null) {
                bkmsVal = trim(bkmsVal);
                if (bkmsVal.length > 0 && isNumeric(bkmsVal)) {
                    return bkmsVal;
                }
            }
            break;
        }
    }
    return 0;
}

function doPopulateFromCookie( cookieTime, urlTime )
{
    if (urlTime != null) {
        urlTime = trim(urlTime);
        if (urlTime.length <= 0 || !isNumeric(urlTime)) {
            return true;
        }
    } else {
        return true;
    }

    if (cookieTime != null) {
        cookieTime = trim(cookieTime);
        if (cookieTime.length <= 0 || !isNumeric(cookieTime)) {
            return false;
        }
    } else {
        return false;
    }

    if ( urlTime < cookieTime ) {
        return true;
    }

    return false;
}

function populateFormUsingCookie() {

    var zipValFromCookie = '';

    if (getCookie("ISP_SF")) {
        var zipCookieQueryString = getCookie("ISP_SF");

        if (zipCookieQueryString != null && zipCookieQueryString.length > 0) {
            zipValFromCookie = getCookieKey("ISP_SF","zip");

            if (zipValFromCookie == null) {
                zipValFromCookie = '';
            }
        }
    }

    var callback = function(formInfo) {
        if (formInfo) {
            /** Defect 10348, we need to check
            /* to see if this is the AOL cobrand and
            /* if so look at the url first not the cookie
            /* for the search make. -sggentner 2007-Sep-10
            /* Note: AOL partnership ended, took out aol
            /* check for 2_26 release. -sjohnson
            **/
            var cobrand = getCookie("CBRND");
            var useCookie = true;
            var form = document.forms['searchForm'];
            formInfo = formInfo.replace(/^\s+/, "");
            formInfo = formInfo.substring(1,formInfo.length); //Kill the first ampersand
            var formArray = formInfo.split('&');

            var cookieHash = new Array( formInfo );

            for (var i=0; i<formArray.length; i++) {
                var values = formArray[i].split('=');

                cookieHash[values[0]] = values[1];
            }
            // Defect 10348, special case when the search may be coming from AOL and we do not use the cookie.
            if ( doPopulateFromCookie( cookieHash[ 'bkms' ], getBkmsFromURL() ) && useCookie ) {
                // clear any possible error messages for zip code - you could not get to the search_form via the back button
                // and have had a zip code error
                hideZipErrorMessage();
                //let's use the cookie values to end this madness
                var searchTypeValue = cookieHash['searchtype'];
                var sellerTypeValue = cookieHash['sellertype'];
                var styleFlagValue = cookieHash['style_flag'];
                var bodyStyleValue = cookieHash['bodystyle'];
                var make1Value = cookieHash['make1'];
                var make2Value = cookieHash['make2'];
                var make3Value = cookieHash['make3'];
                var model1Value = cookieHash['model1'];
                var model2Value = cookieHash['model2'];
                var model3Value = cookieHash['model3'];

                var startYearValue = cookieHash['startyear'];
                var endYearValue = cookieHash['endyear'];
                var mileageValue = cookieHash['mileage'];
                var onlyPriceValue = cookieHash['only_price'];
                var onlyPhotoValue = cookieHash['only_photo'];
                var onlySpecialValue = cookieHash['only_special'];
                var sortTypeValue = cookieHash['sorttype'];
                var minPriceValue = nonNull(cookieHash['startprice']);
                var maxPriceValue = nonNull(cookieHash['endprice']);
                var distanceValue = cookieHash['distance'];
                var engineValue = URLDecode(nonNull(cookieHash['engine']));
                var fuelValue = URLDecode(nonNull(cookieHash['fuel']));
                var driveValue = URLDecode(nonNull(cookieHash['drive']));
                var transmissionValue = cookieHash['transmission'];
                var doorsValue = cookieHash['doors'];
                var color1Value = cookieHash['color1'];
                var color2Value = cookieHash['color2'];
                var color3Value = cookieHash['color3'];
                var keywordValue = cookieHash['keywords'];

                var makeField   = document.getElementById('make');
                var modelField  = document.getElementById('model');
                var make2Field  = document.getElementById('make2');
                var model2Field = document.getElementById('model2');
                var make3Field  = document.getElementById('make3');
                var model3Field = document.getElementById('model3');
                var startYearField  = document.getElementById('start-year');
                var endYearField    = document.getElementById('end-year');
                var keywordField = document.getElementById('keywords-display');

                var searchTypeFields= form.search_type;
                for(x = 0; x < searchTypeFields.length; x++) {
                    if(searchTypeFields[x].value == searchTypeValue){
                        searchTypeFields[x].checked=true;
                    }
                }

                var sellerTypeFields= form.seller_type;
                for(x = 0; x < sellerTypeFields.length; x++) {
                    if(sellerTypeFields[x].value == sellerTypeValue){
                        sellerTypeFields[x].checked=true;
                    }
                }

                populateBodyStyle(getBodyStyle(bodyStyleValue), styleFlagValue);
                form.address.value = zipValFromCookie;
                form.min_price.value = minPriceValue;
                form.max_price.value = maxPriceValue;
                setDropdown(form.distance, distanceValue);

                // defect 6217 revisited: in the case where endYearValue is
                // "not available", set the endYearValue to the current year
                // so that the list population works regardless.  This is necessary
                // because depending from the origin of the search (normal search
                // versus SEO search) the cookies that get populated are named differently
                if ( endYearValue == "null" || endYearValue == null || endYearValue == undefined ){
                    var d = new Date();
                    endYearValue = d.getFullYear().toString();
                }

                FycSearchForm.getMakeAndModelLists(
                        getSearchType(searchTypeValue),
                        getBodyStyle(bodyStyleValue),
                        make1Value,
                        make2Value,
                        make3Value,
                        {
                            callback:function(makesAndModels) {
                                populateSelectCallback(makesAndModels.makeSelectOptions, makeField, make1Value);
                                populateSelectCallback(makesAndModels.modelSelectOptions, modelField, model1Value);
                                populateSelectCallback(makesAndModels.make2SelectOptions, make2Field, make2Value);
                                if (!isDefaultValue(make2Value)) {
                                    populateSelectCallback(makesAndModels.model2SelectOptions, model2Field, model2Value);
                                    populateSelectCallback(makesAndModels.make3SelectOptions, make3Field, make3Value);
                                    if (!isDefaultValue(make3Value)) {
                                        populateSelectCallback(makesAndModels.model3SelectOptions, model3Field, model3Value);
                                    }
                                }
                                updateAds();
                                updateMakeAndModelState();
                            }
                        }
               );

                //defect 7761. Need to provide makes and models when populating Certified years
                FycSearchForm.getToYearsWithMakesModels(
                    getSearchType(searchTypeValue),
                    startYearValue,
                    make1Value,
                    make2Value,
                    make3Value,
                    model1Value,
                    model2Value,
                    model3Value,
                    false,
                    {
                        callback:function(list) {
                            populateSelectCallback(list, endYearField, endYearValue);
                        }
                    }
                );

                FycSearchForm.getFromYearsWithMakesModels(
                    getSearchType(searchTypeValue),
                    endYearValue,
                    make1Value,
                    make2Value,
                    make3Value,
                    model1Value,
                    model2Value,
                    model3Value,
                    false,
                        {
                            callback:function(list) {
                            populateSelectCallback(list, startYearField, startYearValue);
                        }
                    }
                );

                var sortTypeIndex = document.getElementById('sort_type').selectedIndex;
                if (!isDefaultValue(onlyPriceValue) || !isDefaultValue(onlyPhotoValue) || (sortTypeValue != null && form.sort_type.options[sortTypeIndex].value != "priceDESC") ||
                        !isDefaultValue(mileageValue) || !isDefaultValue(engineValue) || !isDefaultValue(fuelValue) ||
                        !isDefaultValue(driveValue) || !isDefaultValue(transmissionValue) || !isDefaultValue(doorsValue) ||
                        !isDefaultValue(color1Value) || !isDefaultValue(color2Value) || !isDefaultValue(color3Value) ||
                        !isDefaultValue(keywordValue) || featuresAreSelected( cookieHash ) ){

                    if ( featuresAreSelected( cookieHash ) ) {
                        populateFeaturesFromCookie( cookieHash )
                    }

                    if (!isDefaultValue(keywordValue)) {
                        keywordField.value = decode64(keywordValue);
                        if (isDefaultValue(keywordValue)) {
                            keywordField.value = keywordValue;
                        }
                    }

                    form.advanced.value = 'y';

                    showMoreCriteria();

                    if (!isDefaultValue(onlyPriceValue)) {
                        form.only_price.checked = true;
                    }

                    if (!isDefaultValue(onlyPhotoValue)) {
                        form.only_photo.checked = true;
                    }

                    if (!isDefaultValue(onlySpecialValue)) {
                        form.only_special.checked = true;
                        form.advanced.value="y";
                    }

                    setDropdown(form.max_mileage, mileageValue);
                    setDropdown(form.engine, engineValue);
                    setDropdown(form.fuel, fuelValue);
                    setDropdown(form.drive, driveValue);
                    setDropdown(form.transmission, transmissionValue);
                    setDropdown(form.doors, doorsValue);
                    setDropdown(form.color, color1Value);
                    setDropdown(form.color2, color2Value);
                    setDropdown(form.color3, color3Value);
                    setDropdown(form.sort_type, sortTypeValue);
                } else {
                    form.advanced.value = '';
                    hideMoreCriteria();
                }
            } else {
                populateForm(zipValFromCookie);
            }
        } else {
            populateForm(zipValFromCookie);
        }
        hideShowSellerType();
    }

    getSessionAttribute("LAST_SEARCH_PARAMS", callback);
}

function popluateFromResearchCompare(searchType, make, model, startYear, endYear) {
    var makeField   = document.getElementById('make');
    var modelField  = document.getElementById('model');
    var startYearField  = document.getElementById('start-year');
    var endYearField    = document.getElementById('end-year');

    FycSearchForm.getMakeAndModelLists(
            getSearchType(searchType),
            getBodyStyle(null),
            make,
            null,
            null,
            {
                callback:function(makesAndModels) {
                    populateSelectCallback(makesAndModels.makeSelectOptions, makeField, make);
                    populateSelectCallback(makesAndModels.modelSelectOptions, modelField, model);
                    updateAds();
                    updateMakeAndModelState();
                }
            }
   );

    FycSearchForm.getToYearsWithMakesModels(
        getSearchType(searchType),
        startYear,
        make,
        null,
        null,
        model,
        null,
        null,
        false,
        {
            callback:function(list) {
                populateSelectCallback(list, endYearField, endYear);
            }
        }
    );

    FycSearchForm.getFromYearsWithMakesModels(
        getSearchType(searchType),
        endYear,
        make,
        null,
        null,
        model,
        null,
        null,
        false,
            {
                callback:function(list) {
                populateSelectCallback(list, startYearField, startYear);
            }
        }
    );
}

/*Added for defect 12531.*/
function populateAwspForm(){
    var cookieName="ISP_AWS_SF";
    if(getCookie(cookieName)){

        var make= getCookieKey(cookieName,"make");
        var make2=getCookieKey(cookieName,"make2");
        var make3= getCookieKey(cookieName,"make3");

        var model=getCookieKey(cookieName,"model");
        var model2=getCookieKey(cookieName,"model2");
        var model3=getCookieKey(cookieName,"model3");

        var searchType=getCookieKey(cookieName,"search_type");
        var endYearValue=getCookieKey(cookieName,"end_year");
        var startYearValue=getCookieKey(cookieName,"start_year");
        var toPriceVal=getCookieKey(cookieName,"max_price");
        var fromPriceVal=getCookieKey(cookieName,"min_price");
    }

    var makeField   = document.getElementById('make');
    var make2Field  = document.getElementById('make2');
    var make3Field  = document.getElementById('make3');

    var modelField  = document.getElementById('model');
    var model2Field = document.getElementById('model2');
    var model3Field = document.getElementById('model3');

    var startYearField=document.getElementById('start-year');
    var endYearField = document.getElementById('end-year');
    var toPriceField=document.getElementById('highest-price');
    var fromPriceField=document.getElementById('lowest-price');

    /* populate make/model drop downs with cookie values */
    FycSearchForm.getMakeAndModelLists(
            getSearchType(searchType),
            getBodyStyle(null),
            make,
            make2,
            make3,
            {
                callback:function(makesAndModels) {
                populateSelectCallback(makesAndModels.makeSelectOptions, makeField, make);
                populateSelectCallback(makesAndModels.modelSelectOptions, modelField, model);
                populateSelectCallback(makesAndModels.make2SelectOptions, make2Field, make2);
                if (!isDefaultValue(make2)) {
                    populateSelectCallback(makesAndModels.model2SelectOptions, model2Field, model2);
                    populateSelectCallback(makesAndModels.make3SelectOptions, make3Field, make3);
                    if (!isDefaultValue(make3)) {
                        populateSelectCallback(makesAndModels.model3SelectOptions, model3Field, model3);
                    }
                }
                    updateAds();
                    updateMakeAndModelState();
                }
            });

    /*populate year range drop downs*/
    FycSearchForm.getFromYearsWithMakesModels(
            getSearchType(searchType),
            endYearValue,
            make,
            make2,
            make3,
            model,
            model2,
            model3,
            false,
    {
        callback:function(list) {
            populateSelectCallback(list, startYearField, startYearValue);
        }
    } );

    FycSearchForm.getToYearsWithMakesModels(
            getSearchType(searchType),
            startYearValue,
            make,
            make2,
            make3,
            model,
            model2,
            model3,
            false,
    {
        callback:function(list) {
            populateSelectCallback(list, endYearField, endYearValue);
        }
    });

    /* populate price ranges if any*/
    if(!isDefault(toPriceField)){
        toPriceField.value=toPriceVal;
    }

    if(!isDefault(fromPriceField)){
        fromPriceField.value=fromPriceVal;
    }
}

function featuresAreSelected( cookieHash )
{
    for( var i = 1; i <= 11; i++ )
    {
        if ( cookieHash[ "feature" + i ] )
        {
            return true;

        }
    }
    return false;

}

function populateFeaturesFromCookie( cookieHash )
{
    var featureMap = new Array();
    featureMap['cd'] = 'cd-player';
    featureMap['cruise control'] = 'cruise-control';
    featureMap['handicap'] = 'handicap-equipped';
    featureMap['leather seats'] = 'leather-seats';
    featureMap['power door locks'] = 'power-door-locks';
    featureMap['power mirrors'] = 'power-mirrors';
    featureMap['power windows'] = 'power-windows';
    featureMap['rear window defroster'] = 'rear-window-defroster';
    featureMap['side air bag'] = 'side-air-bags';
    featureMap['tilt wheel'] = 'tilt-telescope-wheel';
    featureMap['tinted glass'] = 'tinted-glass';

    for( var i = 1; i <= 11; i++ )
    {
        var featureIndex = "feature" + i;
        if ( cookieHash[ featureIndex ] )
        {
            var featureId = featureMap[ URLDecode( cookieHash[ featureIndex ] ) ];
            document.getElementById( featureId ).checked = true;
        }
    }
}

function URLDecode(input) {
    var plusReplaceRegExp = /\+/g;
    var slashReplaceRegExp = /%2F/g;

    return String(unescape(input)).replace(plusReplaceRegExp, " ").replace(slashReplaceRegExp, "/");
}

function showTopOfPage()
{
    document.getElementById( 'search-form' ).scrollIntoView();
}

/*  begin flash movie javascript section */
function btnRollOver(name, over) {
            if (document.images) {
                if (over) {
                    document.images[name].src = "/img/fyc/btn_" + name + "_down_367x44.gif";
                } else {
                    document.images[name].src = "/img/fyc/btn_" + name + "_up_367x44.gif";
                }
            }
        }

        function openSearchDiv(id) {
            var idName = id;
            document.getElementById(idName).style.display = 'block';

            document.getElementById("searchFormMovie").focus();
            document.getElementById("sponsorAdsDisplay").style.display = 'none';
            for (f = 0; f < document.forms.length; f++)
            {
                var elements = document.forms[f].elements;
                //capture form elements and hide all except clear form button
                //stops at 25 - the number of elements above "view more search criteria" link"

                for (e = 0; e < 25; e++)
                {
                    if ( elements[e] )
                    {
                        if(elements[e].type != 'button') {
                            elements[e].style.visibility = 'hidden';
                        }
                    }
                }//inner for

            }//outer for

        }//function openSearchDiv

        function closeSearchDiv() {
            if(!isAWSP) {
                document.getElementById("sponsorAdsDisplay").style.display = 'block';
            }

            for (f = 0; f < document.forms.length; f++)
            {
                var elements = document.forms[f].elements;
                //capture form elements and show all
                for (e = 0; e < elements.length; e++)
                {
                        elements[e].style.visibility = 'visible';
                }//inner for
            }//outer for
        }//function closeSearchDiv
/*  end flash movie javascript section */
