var	controlSets = new Array();
var strCurrentModelYear = strDefYear;

var DefaultMake;
var DefaultModel;
var DefaultYear;

// Public methods that may be called from outside...
function InitializeControlSets()
{
//	alert("Initializing " + controlSets.length + " controls");
	
	if (DefaultMake != null && DefaultMake != "")
	{
		strDefMake = DefaultMake;
	}
	if (DefaultModel != null && DefaultModel != "")
	{
		strDefModel = DefaultModel;
	}

	for (i = 0; i < controlSets.length; i++)
	{
		PopulateMake(controlSets[i]);
	}
}

function RegisterControlSet(setName, makeControlId, modelNoYearControlId, trimControlId, trimImageControlId, 
    selectedMake, selectedModel, selectMakeImage, selectModelImage, imageWidth)
{
	//alert("regstering control set " + setName);
	controlSet = GetControlSet(setName);
	if (controlSet == null)
	{
		// Create a new registry...
		controlSet = CreateNewControlSet(setName);
	}

	controlSet.makeId = makeControlId;
	controlSet.modelNoYearId = modelNoYearControlId;
	controlSet.trimId = trimControlId;
	controlSet.trimImageId = trimImageControlId;	
	if (makeControlId!=null) controlSet.makeControl = document.getElementById(makeControlId);
	if (modelNoYearControlId!=null) controlSet.modelNoYearControl = document.getElementById(modelNoYearControlId);
	if (trimControlId!=null) controlSet.trimControl = document.getElementById(trimControlId);
	if (trimImageControlId!=null) controlSet.trimImageControl = document.getElementById(trimImageControlId);
	controlSet.selectedMakeName = selectedMake;
	controlSet.selectedModelName = selectedModel;
	controlSet.selectMakeImage = selectMakeImage;
	controlSet.selectModelImage = selectModelImage;
	controlSet.imageWidth = imageWidth;
	controlSet.additionalInfo = "";
}

function OnMakeChange(setName)
{
	controlSet = GetControlSet(setName);
	if (controlSet != null)
	{
		if (controlSet.modelNoYearControl != null)
		{
			PopulateModelNoYear(controlSet);
		}
	}
	else
	{
		alert("ERROR: Could not locate controlSet " + setName + " in controlSets array");
	}
}

function OnModelChange(setName)
{
	controlSet = GetControlSet(setName);
	if (controlSet != null)
	{
		if (controlSet.trimControl != null)		    
		{
			PopulateTrim(controlSet);
		}
		else
		{
		  var make = controlSet.makeControl.options[controlSet.makeControl.selectedIndex].text;
            var model = controlSet.modelNoYearControl.options[controlSet.modelNoYearControl.selectedIndex].text;
            
            AJAX(controlSet, "NewVehicleTrim.ashx?method=get_trim&make=" + URLEncode(make) + "&model=" + URLEncode(model), AJAXCallback );
		}
	}
	else
	{
		alert("ERROR: Could not locate controlSet " + setName + " in controlSets array");
	}
}


// Private methods that should NOT be called from your web page...
function GetControlSet(setName)
{
//	alert("GetControlSet(" + setName + ") from controlSets[" + controlSets.length + "]");
	for (i = 0; i < controlSets.length; i++)
	{
		if (controlSets[i] != null)
		{
			if (controlSets[i].setName == setName)
			{
				return (controlSets[i]);
			}
		}
	}
	
	return (null);
}

function CreateNewControlSet(setName)
{
//	alert("CreateNewControlSet(" + setName + ")");
	controlSet = new Object;
	controlSet.setName = setName;
	controlSets[controlSets.length] = controlSet;
	return (controlSet);
}

function ResetMenu(controlSet)
{		
	if (controlSet.yearControl != null)
	{
		controlSet.yearControl.options[0] = new Option(strDefYear, 0);
		controlSet.yearControl.options.length = 1;
		controlSet.yearControl.options.selectedIndex = 0;
		controlSet.yearControl.disabled = true;
	}
	if (controlSet.modelControl != null)
	{
		controlSet.modelControl.options[0] = new Option(strDefYear, 0);
		controlSet.modelControl.options.length = 1;
		controlSet.modelControl.options.selectedIndex = 0;
		controlSet.modelControl.disabled = true;
	}
	if (controlSet.modelYearControl != null)
	{
		controlSet.modelYearControl.options[0] = new Option(strDefYear, 0);
		controlSet.modelYearControl.options.length = 1;
		controlSet.modelYearControl.options.selectedIndex = 0;
		controlSet.modelYearControl.disabled = true;
	}
	if (controlSet.modelNoYearControl != null)
	{
		controlSet.modelNoYearControl.options[0] = new Option(strDefYear, 0);
		controlSet.modelNoYearControl.options.length = 1;
		controlSet.modelNoYearControl.options.selectedIndex = 0;
		controlSet.modelNoYearControl.disabled = true;
	}
}

function PopulateMake(controlSet)
{
	var pageForm = document.forms[0];
	
	with(pageForm)
	{		
		controlSet.makeControl.options[0] = new Option("Select a Make", "");
		for(var i = 0; i < AutoMakeName.length; i++) 
		{
			var makeValue = AutoMakeName[i] + "_" + AutoMakeNumber[i];
			controlSet.makeControl.options[i+1] = new Option(AutoMakeName[i], makeValue);
			if (AutoMakeName[i] == controlSet.selectedMakeName || AutoMakeNumber[i] == controlSet.selectedMakeName)
			{
				controlSet.makeControl.options.selectedIndex = i+1;
			}
		}
		
		// assigning to options[i] increases the length of options control to 201
		// set the length back to the length of the make array
		controlSet.makeControl.options.length = AutoMakeName.length+1;

		// check if we need to scrub any makes for IAV process
		if ( typeof ScrubMakeList == 'function')
		{
		    ScrubMakeList( controlSet.makeControl.id );
		}
		
		if (controlSet.modelNoYearControl != null)
		{
			PopulateModelNoYear(controlSet);
		}
	}
}

function PopulateModelNoYear(controlSet)
{
	var pageForm = document.forms[0];
	with(pageForm)
	{
		controlSet.modelNoYearControl.disabled = false;
		controlSet.modelNoYearControl.options.length = 0;
		nMakeIndex = controlSet.makeControl.options.selectedIndex;
		
		// if no make is selected, then disable model and trim
		if( nMakeIndex == 0 )
		{
		    controlSet.modelNoYearControl.options.length = 0
		    controlSet.modelNoYearControl.disabled = true;
		    if (controlSet.trimImageControl!=null) controlSet.trimImageControl.src = controlSet.selectMakeImage
		    
		    if (controlSet.trimControl!=null) controlSet.trimControl.options.length = 0;
		    if (controlSet.trimControl!=null) controlSet.trimControl.disabled = true;
		    return
		}
		else
		{
		    controlSet.modelNoYearControl.disabled = false;
		}
		// find make index.  do not rely on selectedindex of drop down
		var makeName = controlSet.makeControl.options[nMakeIndex].text;
		
    	for(var i = 0; i < AutoMakeName.length; i++) 
		{
		    if( AutoMakeName[i] == makeName )
		    {
		        nMakeIndex = i;
		        break;
		    }
		}

		// Create unique models array for all years (ex. 2006 and 2005)		
		models = new Array();
		for(var y=0; y<Years.length; y++)
		{
			nYear = Years[y];
			if ( AutoModels[nMakeIndex][nYear] != null )
			{
				for(var i = 0; i<AutoModels[nMakeIndex][nYear].length; i=i+2) 
				{
					// Add models uniquely. So if same model is for 2006 or 2005 then only add for 2006
					var bOptionExist = false;
					for(var k=0; k<models.length; k++)
					{
						if ( models[k][0] == AutoModels[nMakeIndex][nYear][i])
						{
							bOptionExist = true;
							break;
						}
					}
					if ( bOptionExist == false )
					{
						var modelValue = AutoModels[nMakeIndex][nYear][i]+ "_" + AutoModels[nMakeIndex][nYear][i + 1];
						models.push(new Array(AutoModels[nMakeIndex][nYear][i], modelValue));
					}
				}
			}
		}

		// When we combine 2006 and 2005 year data then our unique models lose their sort
		// Sort models array 
		models = models.sort(ModelSort);

		nCounter = 0;
		controlSet.modelNoYearControl.options[nCounter] = new Option("Select a Model", "");
		nCounter++;
		for(var i=0; i<models.length; i++)
		{
			controlSet.modelNoYearControl.options[nCounter] = new Option(models[i][0], models[i][1]);
			if (models[i][0] == controlSet.selectedModelName && controlSet.makeControl.options[controlSet.makeControl.selectedIndex].text == controlSet.selectedMakeName) controlSet.modelNoYearControl.options.selectedIndex = nCounter;
			nCounter++;
		}
		
		if (controlSet.trimControl != null )		
		{
			PopulateTrim(controlSet);
		}		
	}
}


function ModelSort(a, b)
{
	if ( a[0] < b[0] ) {return -1};
	if ( a[0] > b[0] ) {return  1};
	return -1;
}

// ***** Zip Code Functions *****

function ClearZipText(thisCtrl, strOriginalText)
{	
	if (thisCtrl.value == strOriginalText)
	{
		thisCtrl.value = "";
	}
}
			
function RestoreZipText(thisCtrl, strOriginalText, defaultZipText)
{
	if (thisCtrl.value == "")
	{
		thisCtrl.value = (defaultZipText == "") ? strOriginalText : defaultZipText;
	}
}

function fnTrapKD(btnId, event)
{
	if (document.all)
	{
		if (event.keyCode == 13)
		{
			targetButton = document.all[btnId];
			event.returnValue=false;
			event.cancel = true;
			targetButton.click();
		}
	}
	else if (document.getElementById)
	{
		if (event.which == 13)
		{
			targetButton = document.getElementById(btnId);
			event.returnValue=false;
			event.cancel = true;
			targetButton.click();
		}
	}
	else if(document.layers)
	{
		if(event.which == 13)
		{
			event.returnValue=false;
			event.cancel = true;
			btn.click();
		}
	}
}

/* New functionality for Trim */

function OnTrimChange(setName)
{
	controlSet = GetControlSet(setName);
	if (controlSet != null)
	{
    	PopulateTrimImage(controlSet);
	}
	else
	{
		alert("ERROR: Could not locate controlSet " + setName + " in controlSets array");
	}
}


function PopulateTrim(controlSet)
{
	var pageForm = document.forms[0];
	with(pageForm)
	{
	    if ( controlSet.modelNoYearControl.options[controlSet.modelNoYearControl.selectedIndex].value != "" )
	    {
		    controlSet.trimControl.disabled = false;
		    controlSet.trimControl.options.length = 0;

            var make = controlSet.makeControl.options[controlSet.makeControl.selectedIndex].text;
            var model = controlSet.modelNoYearControl.options[controlSet.modelNoYearControl.selectedIndex].text;
            
            AJAX(controlSet, "NewVehicleTrim.ashx?method=get_trim&make=" + URLEncode(make) + "&model=" + URLEncode(model), AJAXCallback );
	    }
	    else
	    {
	        // No Model selected, disabled trim
		    controlSet.trimControl.options.length = 0;
		    controlSet.trimControl.disabled = true;
		    if (controlSet.trimImageControl!=null) controlSet.trimImageControl.src = controlSet.selectModelImage
	    }
    }	   
}

function PopulateTrimImage(controlSet)
{
    if (controlSet.trimImageControl != null)
    {
        // get image for the current trim and display
        var displayURL = "ModelImage.ashx?src=IMAGE_NUM&width=" + controlSet.imageWidth;
        // get selected trim, get image number, change image src url
        var selectedTrim;
        if(controlSet.trimControl != null)
        {
            selectedTrim = controlSet.trimControl.value;
        }
        else
        {
           selectedTrim = controlSet.additionalInfo;
        }
        var arrToken = selectedTrim.split( "_" );
        var imageNum = arrToken[2].replace(".jpg","");
        var imageSrc = displayURL.replace( "IMAGE_NUM", imageNum );
        controlSet.trimImageControl.src = imageSrc;		    
    }
}

function AJAX(controlSet, url, callbackFunction)
{
    var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");

    request.open("GET", url, true);

    request.onreadystatechange = function()
    {
        if (request.readyState == 4 && request.status == 200) 
        {
                if (request.responseText)
                {
                    callbackFunction(controlSet, request.responseText);
                }
        }
    }
    request.send(null);
}

function AJAXCallback(controlSet, responseText)
{
    // get the legmodelid, populate trim
    // show default picture for model
    // objects come as JSON array
    if( responseText.length != 0 )
    {
        var objTrim = controlSet.trimControl;
        var arrTrim = eval( responseText );
        if(objTrim!= null)
        {
            objTrim.options.length=0;
            // add any trim option
            objTrim.options[0] = new Option("No Preference", arrTrim[0].TrimName + "_" + arrTrim[0].VehicleNumber + "_" + arrTrim[0].PhotoTag);
            
            for( var i=0; i < arrTrim.length; i++)
            {
		        objTrim.options[i+1] = new Option(arrTrim[i].TrimName, arrTrim[i].TrimName + "_" + arrTrim[i].VehicleNumber + "_" + arrTrim[i].PhotoTag);
            }
            objTrim.selectedIndex = 0;
        }
        
        else
        { 
            controlSet.additionalInfo = arrTrim[0].TrimName + "_" + arrTrim[0].VehicleNumber + "_" + arrTrim[0].PhotoTag;
        }  
        // I have got the trims now, lets display image for default trim
        PopulateTrimImage(controlSet)
    }
}

function VerifyData(dropdownMake, dropdownModel, dropdownTrim, textBoxZip, DefaultZip)
{
    var ErrMsg = ''
    
    // validate make
    if (document.getElementById(dropdownMake).selectedIndex == 0)
    {
        ErrMsg += "You must select a make and model to proceed.\n"
    }
    else
    {
        // validate model
        if (document.getElementById(dropdownModel).selectedIndex == 0)
        {
     
            ErrMsg += "You must select a model to proceed.\n"
        }
//        else
//        {    
//        //return false;
//         // re-visit  here - Code commented because this throws JS exeception in NCI
//            // validate trim        
//            
//            if (document.getElementById(dropdownTrim).options.length == 0)
//            {
//                ErrMsg += "Your current selection of make and model does not have any trim level data. \nThis problem has been reported, //please change your selections to proceed.";
//            }
//        }
    }    
    // validate Zip 
    // check if zip field is available
    if (document.getElementById(textBoxZip)!=null)
    {
        zipEntered = document.getElementById(textBoxZip).value;
        zipEntered = trim(zipEntered);            
        document.getElementById(textBoxZip).style.backgroundColor = "#FFFFFF";                
        if ( zipEntered == DefaultZip || (zipEntered != DefaultZip && !IsZipCodeValid(zipEntered)) )    
        {
            ErrMsg += "Zip Code entered is not valid.\n"
            document.getElementById(textBoxZip).style.backgroundColor = "#ffd100";                
        }
    }           
    if (ErrMsg.length > 0 )
    {
        alert(ErrMsg);
        return false;
    }
    else
    {
        return true;
    }
}



