// remove this after Tig.Prototype is deployed
String.prototype.escapeQuerySymbol = function()
{
	return this.replace(/[&=]/g, "-");
}

/************************************************************************
	Built-in Methods for CARSALES
 ************************************************************************/
 
 var AJAX_PLACEHOLDER = "";
 var TRACK_CS_AJAX = true;
 var AJAX_ENABLED = true;
 
 var LOADING_MESSAGE = "*** LOADING ***";
 
 function SetAjaxPlaceHolder(str)
 {
	if (str)
		AJAX_PLACEHOLDER = str;
 }
 
 function DoPostBack(btnTarget, args)
 {
  	var navID = "";
 	var text = "";
	for (i=0; i<args.length; i++)
	{	
		var item = GetItemValue(args[i]);				
		var textVal = GetItemText(args[i]);		
		if ((navID.length > 0 && item.length > 0) || (textVal.indexOf("Region") > -1))
		{		
			if (navID.length > 0 && item.length > 0)
				navID = navID + "+";
				
			if (text.length > 0 && textVal.length > 0)
				text = text + "&";				
		}	
		navID = navID + item;		
		text = text + textVal;
	}	
	
	// Assume, text never exists if navID is not there
	__doPostBack(PostBackControl(btnTarget), navID + ";" + text);
 }
 
 function PostBackControl(btn)
 {
	var button = document.getElementById(btn);
	var btnName = button.name;
	if (btnName)
		return btnName.replace(/:/g, "$");
	else
		return btn;
 }
 
 function PopulateAjaxEndecaValue()
 {
	var model = GetHash("Model");
	var region = GetHash("Region");
	var state = GetHash("State");
	
	var newN = "";
	if (model.length > 0)
		newN = model;
	
	if (newN.length > 0 && region.length > 0)
		newN = newN + "+" + region;
	else if (region.length > 0)
		newN = region;
		
	return newN + ";" + state;
 }
 
 /************************************************************************
	Get all selected value of DropDownList or ListBox 
 ************************************************************************/
 function GetItemValue(cboName)
 {
	var cbo = document.getElementById(cboName);		
	
	// Don't add it to N if the cbo is region
	// Because if postcode selected region will be removed from N
	// Region N val, will be added in GetItemText in separated key
	if (cbo.id.indexOf("Region") > -1)
		return "";
	
	//If it is listbox
	if (cbo.multiple == true)
	{		
		var multiVal = "";
		for (j=0; j<cbo.length; j++)
		{
			if (cbo.options[j].selected == true)
			{
				if (multiVal.length > 0)
					multiVal = multiVal + "+";
				multiVal = multiVal + cbo.options[j].value;								
			}	
		}		
		return multiVal;
	}
	else
		return cbo.options[cbo.selectedIndex].value;
 }
 
 /************************************************************************
	Get all selected text of DropDownList or ListBox 
 ************************************************************************/
 function GetItemText(cboName)
 {	
 	var cbo = document.getElementById(cboName);	 	
	if (cbo == null) return "";
	
	// This value refers to GlobalInternalString	
	if ((cbo.id.indexOf("Model") > -1) && (cbo.selectedIndex > 0))
	{		
		var text = cbo.options[cbo.selectedIndex].text;
		if (text.indexOf(LOADING_MESSAGE) > -1) return "";
		var index = text.indexOf("(");
		if (index > 0)
			text = text.substring(0, index-1);
		return "Model=" + text.escapeQuerySymbol();
	} 	
	else if ((cbo.id.indexOf("Region") > -1))  // region index 0 is statewide
	{
		// Also attach Region N value, because GetItemValue ignore the region N
		// In some case, user provide valid postcode, Region N will be omitted regardless selected		
		var text = cbo.options[cbo.selectedIndex].text;
		if (text.indexOf(LOADING_MESSAGE) > -1) return "";
		var value = cbo.value;
		return "Region=" + text.escapeQuerySymbol() + "&RegionID=" + value;
	}
	return "";
 }
 
 /************************************************************************
	DropDownList Client Event
 ************************************************************************/
 function DropDownList_onBeforeChange(cboSender, cboTarget)
 {
	var sender = document.getElementById(cboSender);
  	var target = document.getElementById(cboTarget);
		
	if (sender.selectedIndex > 0 || sender.selectedIndex == sender.options.length-1)  	
	{
		target.size = 1;
		target.options.length = 0;
		target.options[0] = new Option(LOADING_MESSAGE, "");	
		target.disabled = true;
	}	
 }
 
 function DropDownList_onBindSubtype(cboType, cboSubtype, response)
 {
	DropDownList_Generic(cboType, cboSubtype, response, "subtypes")
 }
 
 function DropDownList_onBindModel(cboMake, cboModel, response)
 {
	DropDownList_Generic(cboMake, cboModel, response, "models")	
 }
 
 function DropDownList_Generic(cboMake, cboModel, response, prefix)
 {
	//reset everything
	cboModel.options.length = 0;
	cboModel.disabled = false;

	if (cboMake.selectedIndex == 0)
	{
		cboModel.options[0] = new Option("Any model", "");
		return;
	}	
	else
	{	
		var indexToParse = cboMake.options[cboMake.selectedIndex].text.lastIndexOf("(");		
		var selectedMake;
		if (indexToParse > -1)
			selectedMake = cboMake.options[cboMake.selectedIndex].text.substring(0, indexToParse);
		else 
			selectedMake = cboMake.options[cboMake.selectedIndex].text + " ";
			
		var optionText = "(all " + selectedMake + " " + prefix + ")";
		cboModel.options[0] = new Option(optionText, "");		
	}

	if (response == null) return;
	
	for (i=0; i<response.length; i++)
	{
		var separator = response[i].indexOf(";");
		var value = response[i].substring(0, separator);
		var text = response[i].substring(separator+1);
		cboModel.options[cboModel.options.length] = new Option(text, value);
	}
	
	// Set selected value if any
	DropDown_onSetSelectedValue(cboModel, GetHash("Model"));	
 }
 
 function DropDownList_onBindVersion(cboModel, cboVersion, response)
 {
 	//reset everything
	cboVersion.options.length = 0;
	cboVersion.disabled = false;
	cboVersion.options[0] = new Option("Any version", "");

	if (response == null) return;
	
	for (i=0; i<response.length; i++)
	{
		var separator = response[i].indexOf(";");
		var value = response[i].substring(0, separator);
		var text = response[i].substring(separator+1);
		cboVersion.options[cboVersion.options.length] = new Option(text, value);
	}
	
	// Set selected value if any
	DropDown_onSetSelectedValue(cboVersion, GetHash("Version"));	
 }
 
 function ListBox_onBindVersion(cboModel, lbVersion, response)
 {
	ListBox_onClear(lbVersion);
	
	if (response == null || cboModel.value.length <= 0) return;
	
	var optBase = "";
	for (i=0; i<response.length; i++)
	{
		var separator = response[i].indexOf(";");
		var value = response[i].substring(0, separator);
		var text = response[i].substring(separator+1);
		
		// if it is Base Version, dont't added it first, instead put in the last record
		if (text.indexOf("Base Version") > 0)
			optBase = new Option(text, value);
		else 
			lbVersion.options[lbVersion.options.length] = new Option(text, value);
	}
	
	if (optBase != "")
		lbVersion.options[lbVersion.options.length] = optBase;
	
	if (response.length >= 5)
		lbVersion.size = 5;
	else
		lbVersion.size = response.length+1;
		
	// Set selected value if any
	ListBox_onSetSelectedValue(lbVersion, GetHash("Version"));
 }
 
 function ListBox_onClear(lbVersion)
 { 	
	lbVersion.options.length = 0;
	lbVersion.size = 1;
	lbVersion.disabled = false;
	lbVersion.options[0] = new Option("Any version", "");
 }
 
 function DropDownList_onBindRegion(cboState, cboRegion, response)
 {
	//reset everything
	cboRegion.options.length = 0;
	cboRegion.disabled = false;

	if (cboState.selectedIndex == 0 || cboState.options[cboState.selectedIndex].text == "All States"){
		cboRegion.options[0] = new Option("All Regions", "");
		response = null;
	}
	else
		cboRegion.options[0] = new Option("State Wide", "");	

	if (response == null)  return;
	
	var optStateWide = null;
	for (i=0; i<response.length; i++)
	{
		var separator = response[i].indexOf(";");
		var value = response[i].substring(0, separator);
		var text = response[i].substring(separator+1);

		// if it is State Wide, dont't added it first, instead put in the last record
		if (text.indexOf("State Wide") > -1)
			optStateWide = new Option("State Wide", value);
		else 
			cboRegion.options[cboRegion.options.length] = new Option(text, value);
	}
	
	if (optStateWide != null)
	{
		cboRegion.options[0] = optStateWide;
	}	
	
	// Set selected value if any
	DropDown_onSetSelectedValue(cboRegion, GetHash("Region"));	
 }
 
 /************************************************************************
	Add, Clear, Get value from HASH
 ************************************************************************/ 
 function AddHash(key, value)
 {
	var hash = window.location.hash;
	
	// if key not exists in url, just add it and return
	if (hash.indexOf(key) <= -1)	
	{
		var indexHash = hash.indexOf("#");
		if (indexHash > -1 && indexHash < hash.length-1)
			hash = hash + "&";
		window.location.hash = hash + key + "=" + value;
	} 	
 	else
 	{
 		// if key is exists, replace it
		var regex;
		switch (key)
		{
			case "Version":
				regex = new RegExp("([#&]Version=)([a-zA-Z0-9+]*)([&]*)", "g");
				break;		
			default:
				regex = new RegExp("([#&]" + key + "=)([a-zA-Z 0-9:.]*)([&]*)", "g");			
				break;			
		}
		
		window.location.hash = hash.replace(regex, "$1" + value + "$3");
	}
	
	if (AJAX_PLACEHOLDER.length > 0)
	{
		var element = document.getElementById(AJAX_PLACEHOLDER);
		if (element)
			element.value = window.location.hash;
	}
}
 
 function AddVersionToHash(listbox)
 {
	var value = "";
	for (i=0; i<listbox.length; i++)
	{
		if (listbox.options[i].selected == true)
		{
			if (value.length > 0)
				value = value + "+";
			value = value + listbox.options[i].value;
		}	
	}
	AddHash("Version", value);
 }
 
 function ClearHash()
 {
	if (MSIE)
		window.location.hash = "";
	else
		window.location.hash = "1";
 }
 
 function GetHash(key)
 {
	var hash = window.location.hash;
	var regex = new RegExp("([#&]" + key + "=)([a-zA-Z0-9 +:.]+)([&]*)", "g");
	var match = regex.exec(hash);
	if (match != null)
		// This array 2 based on Regular Expression
		return match[2];
	return "";
 }

 /************************************************************************
	URL JAVASCRIPT CLASS
 ************************************************************************/ 
 function GetQuery(key)
 {
 	var url = window.location.href;
	var regex = new RegExp("([?&]" + key + "=)([a-zA-Z0-9 +]+)([&]*)", "g");
	var match = regex.exec(url);
	if (match != null)
		// This array 2 based on Regular Expression
		return match[2];
	return "";
 }
 
 /************************************************************************
	Set DropDownList Given SelectedValue
 ************************************************************************/
 function DropDown_onSetSelectedValue(cbo, selectedValue)
 {
	cbo.selectedIndex = 0;
	if (typeof(selectedValue) == "undefined" || selectedValue.length <= 0)
	{		
		return;
	}
		
	for (i=0; i<cbo.length; i++)
	{
		if (cbo.options[i].value == selectedValue)
		{		
			// set the index
			cbo.options[i].selected = true;
			break;
		}	
	}
 }
 
 /************************************************************************
	Set ListBox Given SelectedValue
 ************************************************************************/
 function ListBox_onSetSelectedValue(lb, selectedValue)
 { 	
	if (typeof(selectedValue) == "undefined" || selectedValue.length <= 0)
		return;
		
 	var vals = selectedValue.split("+");
 	var match = 0;

	for (i=0; i<lb.length; i++)
	{		
		for (j=0; j<vals.length; j++)
		{
			if (lb.options[i].value == vals[j])
			{
				match = match + 1;
				lb.options[i].selected = true;
				break;
			}
		}	
		if (match == vals.length)
			break;
	}
 }

 /************************************************************************
	Set DropDownList State Given SelectedState from cookie
 ************************************************************************/
 function DropDown_onSetSelectedStateFromCookie(cbo)
 {
	// has selected by someone, so don't ovveride it
 	if (cbo.selectedIndex > 0)
		return;
		
	var selectedState = get_cookie("DefaultState");
	if (typeof(selectedState) == "undefined" || selectedState.length <= 0)
		return;
		
	for (i=0; i<cbo.length; i++)
	{
		if (cbo.options[i].text == selectedState)
		{		
			// set the index
			cbo.options[i].selected = true;
			break;
		}	
	}
 }
 
 /************************************************************************
	RunTime Event Attachment
 ************************************************************************/
 function AttachEventOnChange(element, type)
 {	
	AttachEventOnChangeAndSetDataSource(element, type, "Value");
 }

 function AttachEventOnChangeAndSetDataSource(element, type, datasource)
 {
	if (element.type == "select-multiple")
	{
		if (MSIE)
			element.attachEvent("onchange", function(){AddVersionToHash(element);});
		else
			element.addEventListener("change", function(){AddVersionToHash(element);}, false);
	}	
	else if (element.type == "select-one")
	{					
		var val = "element.value";				
		if (datasource == "Text")
			val = "element.options[element.selectedIndex].text";
		else if (datasource == "SelectedIndex")
			val = "element.selectedIndex";
		
		if (MSIE)
			element.attachEvent("onchange", function(){
				var data = eval(val); 
				AddHash(type, data); 
				if (datasource == "Text")
					set_cookie_persistent("DefaultState", data);
			});
		else
			element.addEventListener("change", function(){
				var data = eval(val); 
				AddHash(type, data); 
				if (datasource == "Text")
					set_cookie_persistent("DefaultState", data);
			}, false);	
	} 
 }
 
 function DetachEventOnChange()
 {
	// REVISIT: need to detach all attached event to avoid DOM memory LEAK
 }