var offersSearch;
var newInvSearch;
var prevZipCodeStyle;

/**
 * Object to hold some relevant information about a model
 * @param strId the id 
 * @param strModelName the vechicle model name
 * @param strYear the vehicle year
 * @param strLocateId the locate id
 * @param strMake the vehicle make
 * @param strBasePrice the base proce
 * @param image the image
 * 
 */
function IncentivesModelInfo(strId, strModelName, strYear, strLocateId, strMake, strBasePrice, image) 
{
  this.id = strId;
  this.name = strModelName;
  this.year = strYear;
  this.locateId = strLocateId;
  this.make = strMake;
  this.basePrice = strBasePrice;
  this.image = image;
}

/**
 * Function used to init form selects
 */
function initSelects()
{
  var locateVehicleSearch;

  var flowExecutionId = "${flowExecutionKey}";
  
  var makeSelect = new SelectBox('make', 'make', 'make', true, ' ', true);
  var yearSelect = new SelectBox('yearSelect', 'year', 'year', true);
  var modelSelect = new SelectBox('name', 'name', 'id',  true);
  
  offersSearch = new ModelSearch('incentivesSelections', [makeSelect, modelSelect, yearSelect], arrModels,true);
  offersSearch.init();
  offersSearch.selectionChanged(1);
  populateYearSelect();
  
  //priority of defaults selection:
  //1. User selection on Special offers page
  //2. User selection on any other page leading to Special offers page (deep linking)
  //3. Inventory Defaults
  //4. Arbitrary defaults
  
  if(incentiveSelection)
  {
    setModelDefaults(selectedBrand, selectedModelName, selectedYears);
    selectOption('financeType', selectedFinance);
    YAHOO.util.Dom.get('incPostalCode').value = givenPostalCode;
  }
  else if(deepLinking)
  {
    setModelDefaults(deepLinkedIncMake, deepLinkedIncVehicle, deepLinkedIncYear);
  }
  else if(invDefaultsArr)
  {
    setInventoryDefaults(invDefaultsArr, defaultSelectedMake);   
  }
  else
  {
    selectOption('yearSelect', 'all');
  }
  
  setVehicleImage();
  var postalCode = YAHOO.util.Dom.get('incPostalCode');
  if(postalCode.value == '')
  {
    postalCode.focus();
  }
}

/**
 * set defaults for Special offers page model filters
 * @param brand the vehicle brand
 * @param name the vehicle name
 * @param year the vehicle year
 */
function setModelDefaults(brand, name, year)
{
  selectOption('makeSelect', brand);
  offersSearch.selectionChanged(0);
  selectOption('nameSelect', name);
  offersSearch.selectionChanged(1);
  populateYearSelect();
  selectOption('yearSelect', year);
}

/**
 * select the inventory defaults vehicles
 * @param invDefaultsArray the inventory default array
 * @param invSelectedMake the inventory selected make
 */
function setInventoryDefaults(invDefaultsArray, invSelectedMake)
{
  var defaultYear = invDefaultsArray[invSelectedMake].year;
  var defaultVehicle = invDefaultsArray[invSelectedMake].name;
  selectOption('nameSelect', defaultVehicle);
  offersSearch.selectionChanged(1);
  populateYearSelect();
  selectOption('yearSelect', defaultYear);
}

/**
 * Function used to init vehicle model select
 * @param allModelDisplayText the all models display text
 * @param allVehicleTrims the vehicle trims
 */
function initVehicleModelSelect(allModelDisplayText, allVehicleTrims)
{
  if(allModelDisplayText && allVehicleTrims)
  {
    allVehicleTrims.sort();
    var vehicleSelect = YAHOO.util.Dom.get('vehicleModelsSelect');
  
    var option = document.createElement('option');
    option.value = 'all'
    option.text = allModelDisplayText;
    option.innerHTML = allModelDisplayText; 
    vehicleSelect.appendChild(option);
  
    for(var i in allVehicleTrims)
    {
      var option = document.createElement('option');
      option.value = allVehicleTrims[i];
      option.text = allVehicleTrims[i];
      option.innerHTML = allVehicleTrims[i];
      vehicleSelect.appendChild(option);
    }
  }
}

/**
 * Action handler for brand select
 */
function vehicleMakeChanged()
{
  offersSearch.selectionChanged(0);
  
  if(invDefaultsArr)
  {
    setInventoryDefaults(invDefaultsArr, YAHOO.util.Dom.get('makeSelect').value);
  }
  else
  {
    offersSearch.selectionChanged(1);
    populateYearSelect();
  }
}

/**
 * Action handler for vehicle name select
 */
function vehicleNameChanged()
{
  offersSearch.selectionChanged(1);
  populateYearSelect();
}

/**
 * Function used to generate year select values
 */
function populateYearSelect()
{
  var makeSelect = YAHOO.util.Dom.get('makeSelect');
  var nameSelect = YAHOO.util.Dom.get('nameSelect');
  
  var selectedMake = makeSelect.options[makeSelect.selectedIndex].value;
  var selectedName = nameSelect.options[nameSelect.selectedIndex].text;
  
  var yearArray = new Array();
  
  for(model in arrModels)
  {
    var make = arrModels[model].make;
    var name = arrModels[model].name;
    var year = arrModels[model].year;
    
    if(make == selectedMake && name == selectedName)
    {
      var present = false;
      // add to year list
      for(i in yearArray)
      {
        if(yearArray[i] == year){
          present = true;
        }
      }
      if(! present){
        yearArray.push(year);
      }
    }
  }

  var yearSelect = YAHOO.util.Dom.get('yearSelect');
  while (yearSelect.hasChildNodes())
  {
    yearSelect.removeChild(yearSelect.childNodes[0]);
  }
  
   
  yearArray.sort();
  yearArray.reverse();
  
  // add all years from yearArray to year select
  var len = yearArray.length >= 2 ? 2 : yearArray.length;

  var option = document.createElement('option');
  option.value = "all";
  option.text = allModelYears;
  option.innerHTML = allModelYears;
  yearSelect.appendChild(option);
  
  for(var i=0; i<len; i++)
  {
    option = document.createElement('option');
    option.value = yearArray[i];
    option.text = yearArray[i];
    option.innerHTML = yearArray[i];
    yearSelect.appendChild(option);
  }
  setVehicleImage();
}

/**
 * Function submits incentive selection form
 */
function submitForm()
{
  if(validator.checkZip(document.forms['incentivesSelections']['postalCode'].value))
  {
    var yearSelect = YAHOO.util.Dom.get('yearSelect');
    var yearSelectHidden = YAHOO.util.Dom.get('yearSelectHidden');
 
    YAHOO.util.Dom.get('allYearSelected').value = yearSelect.selectedIndex == 0 ? 'true' : 'false'; 

    for(var i=1; i<yearSelect.options.length; i++)
    {
      var option = yearSelect.options[i];
      
      if(option.selected || yearSelect.selectedIndex == 0)
      {
        var optionNew = document.createElement('option');
        optionNew.value = option.value;
        optionNew.text = option.text;
        optionNew.selected = true;
        yearSelectHidden.appendChild(optionNew);
      }
    }
    document.forms['incentivesSelections'].submit();
  }
}

/**
 * Function shows all vehicle trims
 */
function showAllOptions(display)
{
  for(var i in modelDivs)
  {
    var divIdArray = modelDivs[i];
    for(var j in divIdArray)
    {
      var divId = divIdArray[j];
      YAHOO.util.Dom.get(divId).style.display = display;
    }
  }
}

/**
 * Function to remove all whitespaces in a string
 */
function trimWhiteSpace(string)
{
  var trimmedString =  string;
  if(trimmedString)
  {
    return trimmedString.replace(/\s+/g,'');
  }
  return trimmedString;
}

/**
 * Function show select model divs
 */
function showAllModelOptions(modelName)
{          
  var trimmedModelName = trimWhiteSpace(modelName);
  var divIdArray = modelDivs[trimmedModelName];
  for(var i in divIdArray)
  {
    var divId = divIdArray[i];
    YAHOO.util.Dom.get(divId).style.display = "block";
  }
}

/**
 * Action handler for vehicle model select
 */
function onVehicleModelChange()
{
    var select = YAHOO.util.Dom.get('vehicleModelsSelect')
    var index = select.selectedIndex;
    var modelName = select.options[index].value;
    
    if(index == 0){
      showAllOptions("block");
    } else {
      showAllOptions("none");
      showAllModelOptions(modelName);
    }
}

/**
 * Function to remove multiple whitespaces by replacing all multiple whitespaces with single white space.
 */
function removeMutipleWhiteSpaces(string)
{
  var modifiedString = string;
  if(modifiedString)
  {
    modifiedString = modifiedString.replace(/\s+/g,' ');
  }
  return modifiedString;
}

/**
 * Adds vehicle trim to model list
 */
function addModel(modelName, divId)
{
  var present = false;
  for(i in allVehicleModel)
  {
    if(allVehicleModel[i] == modelName)
    {
      present = true;
      break;
    }
  }

  if(! present)
  {
    modelName = removeMutipleWhiteSpaces(modelName);
    allVehicleModel.push(modelName);
  }

  var trimmedModelName = trimWhiteSpace(modelName);

  if(modelDivs[trimmedModelName])
  {
    modelDivs[trimmedModelName].push(divId);
  }
  else
  {
    //create an associative array, based on modelname
    modelDivs[trimmedModelName] = new Array();
    modelDivs[trimmedModelName].push(divId);
  }
}

/**
 * Function used to select an option in select element
 */
function selectOption(selectId, value)
{
  var select = YAHOO.util.Dom.get(selectId);
  for(var i=0; i<select.options.length; i++)
  {
    if(select.options[i].value == value)
    {
      select.options[i].selected = true;
    }
  }
}

/**
 * Function used to display vehicle image
 */
function setVehicleImage()
{
  var yearSelect = YAHOO.util.Dom.get('yearSelect');
  var makeSelect = YAHOO.util.Dom.get('makeSelect');
  var nameSelect = YAHOO.util.Dom.get('nameSelect');

  var year = yearSelect.options[yearSelect.selectedIndex].value;
  var make = makeSelect.options[makeSelect.selectedIndex].value;
  var name = nameSelect.options[nameSelect.selectedIndex].value;
  
  for(var i in arrModels)
  {
    var modelInfo = arrModels[i];
    if(make == modelInfo.make && name == modelInfo.name && (year == 'all' || year == modelInfo.year))
    {
      YAHOO.util.Dom.get('vehicleImage').src = modelInfo.image;
      break;
    }
  }
}

/**
 * Method to modify the textbox style containing the postal code.
 */
function setZipCodeStyle(el)
{
  prevZipCodeStyle = el.className;
  el.className = prevZipCodeStyle + ' zipCodeFocus';
}

/**
 * Method to revert the textbox style containing the postal code to previous.
 */
function restoreZipCodeStyle(el)
{
  el.className = prevZipCodeStyle;
}
