/*
 * Please note that the filterLatestModels() funtion is used in modelquote.js of fdapps sub project
 */
 
var latestModels;

/*
 * Filters the models of each MAKE's latest 2 years.
 * For example, if FORD has 2009, 2008 and 2007 and MERCURY has 2008, 2007 and 2006,
 * then we choose FORD models of 2009 and 2008 and MERCURY models of 2008 and 2007.
 * Note: This function is re-used in apps - quickquote - modelquote.ftl
 *
 * @param  models - Set of all models
 * @return Array of Latest Models
 */
function filterLatestModels(models) {
    if (models === null) {
        return null;
    }
    
    //we are going to store the list of latest models in this array
    var latestModels = new Array();
    
    //find list of all possible MAKES
    var makes = new Array();
    for (var v=0; v < modelsDetails.length; v++) {
        var model = modelsDetails[v];
        makes[model.make] = model.make;
    }
    //sort MAKES
    makes = headerSortContents(makes, null);
    
    /*
     * find the latest 2 years for each MAKE 
     * and add the matching models to the latestModels array 
     */
    for (var i=0; i < makes.length; i++) {
        var yearsOfThisMake = new Array(); // this map to the make[i]
        for (var v=0; v < modelsDetails.length; v++) {
            var model = modelsDetails[v];
            if (makes[i] == model.make) {
                yearsOfThisMake[model.year] = model.year;
            }
        }
        //sort years
        yearsOfThisMake = headerSortContents(yearsOfThisMake, headerReverseSort);
        //just keep the latest 2 years if there are more than 2 YEARS for this MAKE
        if (yearsOfThisMake.length > 2) {
            yearsOfThisMake.length = 2;
        }
        
        //add the models of this criteria to the latestModels array
        for (var v=0; v < modelsDetails.length; v++) {
            var yearsOfThisMakeString = yearsOfThisMake.join(' ');
            if (makes[i] == modelsDetails[v].make && yearsOfThisMakeString.match(modelsDetails[v].year) != null) {
                latestModels.push(modelsDetails[v]);
            }
        }
    }
    
    return latestModels;
}

/**
 * Comparator for reverse sorting.
 */
function headerReverseSort(a, b) {
    return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}

/*
 * Return a sorted array from of a set.
 */
function headerSortContents(objectSet, comp) {
    var sortableArray = new Array();
    for (var obj in objectSet) {
        if(obj!=="contains")//In serviceparts.js, "contains" method is added to the basic type Array. So we need to restrict.
        {
            sortableArray[sortableArray.length] = obj;
        }
    }
    if (comp === null) {
        return sortableArray.sort();
    } else {
        return sortableArray.sort(comp);
    }
}

/**
 * Populate the dropdown.
 */
function headerPopulateDropDown(select, values) {
    select.length = 0;
    for (var v = 0; v < values.length; v++) {
        var value = values[v];
        select.options[select.options.length] = new Option(value, value);
    }
    //Select the first element by default.
    select.selectedIndex = 0;
}

/**
 * Populate the dropdowns.
 */
function headerPopulateMakeYearModels() {
    if (modelsDetails == null) {
        return;
    }
    latestModels = filterLatestModels(modelsDetails);
    if ( latestModels == null) {
        return;
    }
     
    var years = new Array();
    for (var v = 0; v < latestModels.length; v++) {
        var model = latestModels[v];
        years[model.year] = model.year;
    }
    var sortedYears = headerSortContents(years, headerReverseSort);
    
    headerPopulateDropDown(YAHOO.util.Dom.get("headerSelect-year"), sortedYears);
    headerFilterMakeDropDown();
    applyInventoryDefaultsForDealer();
}

/**
 * Sets the inventory default vehicle to the drop downs
 */
function applyInventoryDefaultsForDealer()
{
  setInventoryDefaultValue("headerSelect-year", defaultYear);
  setInventoryDefaultValue("headerSelect-make", defaultMake);
}

/**
 * Applies the inventory defaults on the model drop down if applicable in the following case:
 * For the chosen brand, if there exists a model matching the inventory default, it selects the
 * same irrespective of the model year 
 */
function applyInventoryModelDefaultsIfApplicable()
{
   setInventoryDefaultValue("headerSelect-model", invDefaultsByMake[getCurrentSelectedMake()].name);	
}

/**
 * Returns the current selected make
 */
function getCurrentSelectedMake()
{
  var makeDropDownSelect = YAHOO.util.Dom.get("headerSelect-make");
  var brandIndex = makeDropDownSelect.selectedIndex;
  return makeDropDownSelect.options[brandIndex].value;
}

/**
 * Sets the given default value to the select box with the given id 
 */
function setInventoryDefaultValue(selectBoxId, defaultValue)
{
  var selectBox = YAHOO.util.Dom.get(selectBoxId);
  headerSelectValue(selectBox, defaultValue);
  selectBox.onchange();
}

/**
 * Select a value from a select control.
 */
function headerSelectValue(selectControl, value) {
    var options = selectControl.options;
    for (var i = 0; i < options.length; i++) {
        if (options[i].value == value) {
            selectControl.selectedIndex = i;
        }
    }
}

/**
 * To filter the make drop down based on year.
 */
function headerFilterMakeDropDown() {
    var selectedYear = YAHOO.util.Dom.get("headerSelect-year");
    var selectedMakeSet = new Array();
    for (var v = 0; v < latestModels.length; v++) {
        if (latestModels[v].year == selectedYear.value) {
            selectedMakeSet[latestModels[v].make] = latestModels[v].make;
        }
    }
    var selectedMakes = new Array();
    for (var make in selectedMakeSet) {
        selectedMakes[selectedMakes.length] = make;
    }
    var sortedSelectedMakes = selectedMakes.sort();
    var makeSelect = YAHOO.util.Dom.get("headerSelect-make");
    var prevMakeSelect = makeSelect.value;
    headerPopulateDropDown(makeSelect, sortedSelectedMakes);
    //We will retain the previous selection if exists.
    headerSelectValue(makeSelect, prevMakeSelect);
    headerFilterModelDropDown();
}

/**
 * To filter the contents of the model drop down on make & year.
 */
function headerFilterModelDropDown() {
    var selectedMake = YAHOO.util.Dom.get("headerSelect-make");
    var selectedYear = YAHOO.util.Dom.get("headerSelect-year");
    var isAllMakeSelected = (selectedMake.selectedIndex == 0);
    var isAllYearSelected = (selectedYear.selectedIndex == 0);
    var selectedModelsSet = new Array();
    for (var v = 0; v < latestModels.length; v++) {
        if ((latestModels[v].make == selectedMake.value) && (latestModels[v].year == selectedYear.value)) {
            selectedModelsSet[latestModels[v].name] = latestModels[v].name;
        }
    }
    var selectedModels = new Array();
    for (var model in selectedModelsSet) {
        selectedModels[selectedModels.length] = model;
    }
    var sortedSelectedModels = selectedModels.sort();
    var modelSelect = YAHOO.util.Dom.get("headerSelect-model");
    var prevModelSelect = modelSelect.value;
    headerPopulateDropDown(modelSelect, sortedSelectedModels);
    //We will retain the previous selection if exists.
    headerSelectValue(modelSelect, prevModelSelect);
    applyInventoryModelDefaultsIfApplicable();
    ChangeImage();
}

/**
 *This method is used to change the color of the large button text, based on mouse actions.
 */
function changeLargeButtonTextColor(id, state) {
  var f1 = YAHOO.util.Dom.get(id);
  f1.className = "large-button-text-container" + ((state == "over") ? "-over" : "");
}

/**
 *This method is used to change the color of the text, based on mouse actions.
 */
function changeTextColor(id, state) {
    var f1 = YAHOO.util.Dom.get(id);
    f1.className = "wysiwig-home-page-action" + ((state == "over") ? "_Over" : "");
}