/* pchiu: worldwheel */

/*
Wordwheel JS

Create and set the following variables on the page where the wordwheeljs.js file is called:

(These are vital to basic wordwheel functionality)
var mainSuggestionBoxContainerId = 'mainContainer';
var selectedSearchResultClass = 'selectedSearchResult';
var searchFieldId = 'searchField';
var mainSuggestionBoxBackgroundId = 'underlayer';
var requestInfoURL = 'https://www.hertz.com/rentacar/playground/wordwheelRequest.jsp';
var noSearchResultsMessage = 'No Search Results';

(These are necessary for submit)
var stateCodeId = 'stateCode';
var countryCodeId = 'countryCode';

var countrySearchOnlyId = 'isCountryOnlySearch';
var autoFillId = 'isAutoFill';
var searchTypeId = 'searchType';

/////////////////////////////////////////////////////////////////////////////////////////////////

SET FOLLOWING IF MULTIPLE INPUTS NEED WORDWHEEL (see: /reservation/wordwheelJSandStyleConstants.jsp)


*********************************************************************************************************************************
var multipleWordwheelsArray = new Array();

multipleWordwheelsArray['searchField'+'mainSuggestionBoxContainerId'] = 'mainContainer';
multipleWordwheelsArray['searchField'+'selectedSearchResultClass'] = 'selectedSearchResult';
multipleWordwheelsArray['searchField'+'searchFieldId'] = 'searchField';
multipleWordwheelsArray['searchField'+'mainSuggestionBoxBackgroundId'] = 'underlayer';
multipleWordwheelsArray['searchField'+'dialectId'] = 'dialect';
multipleWordwheelsArray['searchField'+'stateCodeId'] = 'stateCode';
multipleWordwheelsArray['searchField'+'countryCodeId'] = 'countryCode';
multipleWordwheelsArray['searchField'+'stateSearchOnlyId'] = 'isStateOnlySearch';
multipleWordwheelsArray['searchField'+'countrySearchOnlyId'] = 'isCountryOnlySearch';
multipleWordwheelsArray['searchField'+'searchTypeId'] = 'searchType';
multipleWordwheelsArray['searchField'+'autoFillId'] = 'isAutoFill';
multipleWordwheelsArray['searchField'+'oagValueHolderId'] = '<%=ReservationFormConstants.FORMFIELD_PICKUP_HIDDEN_EOAG_CODE%>';

multipleWordwheelsArray['searchField2'+'mainSuggestionBoxContainerId'] = 'mainContainer2';
multipleWordwheelsArray['searchField2'+'selectedSearchResultClass'] = 'selectedSearchResult2';
multipleWordwheelsArray['searchField2'+'searchFieldId'] = 'searchField2';
multipleWordwheelsArray['searchField2'+'mainSuggestionBoxBackgroundId'] = 'underlayer2';
multipleWordwheelsArray['searchField2'+'dialectId'] = 'dialect2';
multipleWordwheelsArray['searchField2'+'stateCodeId'] = 'stateCode2';
multipleWordwheelsArray['searchField2'+'countryCodeId'] = 'countryCode2';
multipleWordwheelsArray['searchField2'+'stateSearchOnlyId'] = 'isStateOnlySearch2';
multipleWordwheelsArray['searchField2'+'countrySearchOnlyId'] = 'isCountryOnlySearch2';
multipleWordwheelsArray['searchField2'+'searchTypeId'] = 'searchType2';
multipleWordwheelsArray['searchField2'+'autoFillId'] = 'isAutoFill2';
multipleWordwheelsArray['searchField2'+'oagValueHolderId'] = '<%=ReservationFormConstants.FORMFIELD_DROPOFF_HIDDEN_EOAG_CODE%>';

var dialectId = '';
var stateCodeId = '';
var countryCodeId = '';
var stateSearchOnlyId = '';
var countrySearchOnlyId = '';
var searchTypeId = '';
var autoFillId = '';
var oagValueHolderId = '';

var requestInfoURL = 'https://www.hertz.com/rentacar/playground/wordwheelRequest.jsp';
var noSearchResultsMessage = 'No Search Results';
var suggestionString = "";
var indent;
var breakIndex;
var lineCount = 0;
var totalLineCount = 0;
*****************************************************************************************************************************

*/

var originalValue = '';
var timeCounter = null;
var searchInitiated = false;
var searchDelay = 40;
var timeoutFactor = 5;
var cancelSearch = false;
var searchFieldFocused = false;
var suggestionBoxFocused = false;

var previousSearchPrefix = 'PreviousSearch';

var previousSearches = new Array();
//previousSearches['min'] = '';
//previousSearches['max'] = '';
///////////////////////////////////////////////////////////
var previousSearchesSuggestionBoxHeight = new Array();
//previousSearchesSuggestionBoxHeight['min'] = '';
//previousSearchesSuggestionBoxHeight['max'] = '';
///////////////////////////////////////////////////////////

function handleKeyDownEvent(e)
{
	var code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
	var containerDiv = $(mainSuggestionBoxContainerId);
	searchFieldFocused = true;
	$(autoFillId).value = '';

	if (e.type == "keydown") 
	{    			

		// BEGIN IF diretional key, or ENTER
		if(code == 40 || code == 38 || code == 13  || code == 37)
		{

			// This is for when the user presses the DOWN key	
			var children = Element.Methods.immediateDescendants(containerDiv);
			var selectedElement = containerDiv.select('.'+selectedSearchResultClass);		
			var hasChildren = false;
			if(children.length > 0)
			{
				hasChildren = true;
			}
			if(code == 40 && hasChildren)
			{   
				if(selectedElement.length == 0)
				{
					Element.Methods.addClassName(children[0], selectedSearchResultClass);
					//$(searchFieldId).value = children[0].innerHTML;
					extractSearchVariables(children[0]);
					var offset = positionedOffset(children[0]);
					containerDiv.scrollTop = offset.top;
				}
				else
				{
					Element.Methods.removeClassName(selectedElement[0], selectedSearchResultClass);

					if(Element.Methods.next(selectedElement[0]))
					{
						var newSelectedElement = Element.Methods.next(selectedElement[0]);
						Element.Methods.addClassName(newSelectedElement, selectedSearchResultClass);
//						$(searchFieldId).value = newSelectedElement.innerHTML;
						setSearchVariables(newSelectedElement);
						
						var offset = positionedOffset(newSelectedElement);
						containerDiv.scrollTop = offset.top - 25;

					}
					else
					{
						$(searchFieldId).value = originalValue;
					}
					
				}

			}
			
			// This is for when the user presses the UP key
			if(code == 38 && hasChildren)
			{   
				if(selectedElement.length == 0)
				{
					Element.Methods.addClassName(children[children.length-1], selectedSearchResultClass);
					//$(searchFieldId).value = children[children.length-1].innerHTML;
					extractSearchVariables(children[children.length-1]);
					var offset = positionedOffset(children[children.length-1]);
					containerDiv.scrollTop = offset.top;

				}
				else
				{
					Element.Methods.removeClassName(selectedElement[0], selectedSearchResultClass);
					
					if(Element.Methods.previous(selectedElement[0]))
					{
						var newSelectedElement = Element.Methods.previous(selectedElement[0]);
						Element.Methods.addClassName(newSelectedElement, selectedSearchResultClass);
//						$(searchFieldId).value = newSelectedElement.innerHTML;
						setSearchVariables(newSelectedElement);

						var offset = positionedOffset(newSelectedElement);
						containerDiv.scrollTop = offset.top - 25;

					}
					else
					{
						$(searchFieldId).value = originalValue;
					}

				}
			}

			// This is for when the user presses the ENTER key
			if(code == 13)
			{   
				if(selectedElement.length != 0)
				{
					selectHighlighted();
				}
			}
		// END IF diretional key, or ENTER
		}
		else
		{
			if(code != 33 && code != 34 && code != 35 && code != 36 && code != 27 && code != 45)
			{
				$(oagValueHolderId).value = '';
				$(stateCodeId).value = '';
				$(countryCodeId).value = '';
				$(searchTypeId).value = '';
				$(autoFillId).value = '';
				if($(isServedById))
					$(isServedById).value = '';
			}
		}
	}		
}


function setSearchTimer()
{
	timeCounter = $('searchDelay').value;
//			$('countDownDiv').innerHTML = 'Searching in: ' + timeCounter;
	if (!searchInitiated)
	{
		searchInitiated = true;
		setTimeout("searchForSuggestions()", $('timeOutFactor').value);
	}

}


function searchForSuggestions()
{

//alert(timeCounter + ' ' + searchInitiated + ' ' + cancelSearch);
//			$('infoDiv').innerHTML = $('infoDiv').innerHTML + '<br />' + timeCounter + ' ' + searchInitiated + ' ' + cancelSearch;
	if(cancelSearch)
	{
		timeCounter == null;
		searchInitiated = false;
		cancelSearch = false;
//				$('countDownDiv').innerHTML = 'Search Cancelled';
	}
	else
	{
		if(timeCounter == 0)
		{
			timeCounter == null;
			searchInitiated = false;
//					$('countDownDiv').innerHTML = 'Search Running';

			if($(searchFieldId).value != '' && $(searchFieldId).value.length > 2)
			{
				if(previousSearches[previousSearchPrefix+$(searchFieldId).value] != null)
				{
					showCachedSuggestionBox($(searchFieldId).value);
				}
				else
				{
					startSuggestionsSearch();
				}
			}
			else
			{
				timeCounter == null;
				searchInitiated = false;
				cancelSearch = false;
//					$('countDownDiv').innerHTML = 'Resetting';
			}
			
		}
		else
		{
			timeCounter--;
//					$('countDownDiv').innerHTML = 'Searching in: ' + timeCounter;
			setTimeout("searchForSuggestions()", $('timeOutFactor').value);
		}
	}
}

function startSuggestionsSearch()
{
	var requestURL = requestInfoURL + '?searchText=' + $(searchFieldId).value + '&dialect=' + $(dialectId).value;
	var myRequest = new Ajax.Request(requestURL, {
		method: 'get',
		onSuccess:	function(transport) {
						if (transport.responseText)
						{
							populateSuggestionBox(transport.responseText);
						}
					}
		});
}

function populateSuggestionBox(responseText)
{
	var containerDiv = $(mainSuggestionBoxContainerId);
	containerDiv.innerHTML = '';

	var requestElement = document.createElement('div');
	requestElement.innerHTML = responseText;
	var reuturnBlock = Element.Methods.childElements(requestElement);
	
	var children = Element.Methods.childElements(reuturnBlock[0]);
	var searchText = reuturnBlock[0].readAttribute('searchText');
	var newSuggestions = '';
	totalLineCount = 0;

	for(i = 0 ; i < children.length ; i++)
	{
		var preferredOag = children[i].readAttribute('preferredOag');
		var locationTitle = children[i].readAttribute('locationTitle');
		var stateCode = children[i].readAttribute('stateCode');
		var countryCode = children[i].readAttribute('countryCode');
		var searchType = children[i].readAttribute('searchType');
		var isServedBy = children[i].readAttribute('isServedBy');

		/////////////////////////////////////////////
		suggestionString = "";
		indent = false;
		breakIndex = 0;
		lineCount=0;
		formatSuggestionString(children[i].innerHTML);
		if(i<10)
		{
			totalLineCount += lineCount;
		}
		$(mainSuggestionBoxContainerId).style.height = (totalLineCount * 21) - 5 + "px";
//		$(mainSuggestionBoxBackgroundId).style.height = (totalLineCount * 21) - 5 + "px";
		$(mainSuggestionBoxBackgroundId).style.height = (totalLineCount * 21) + 1 + "px";

		newSuggestions = newSuggestions + '<div class="clickable suggestionContainer" locationTitle="' + locationTitle + '" searchType="' + searchType + '" preferredOag="' + preferredOag + '" stateCode="' + stateCode 
										+ '" countryCode="' + countryCode + '" isServedBy="' + isServedBy + '" onmouseover="highlightSelection(this)" onclick="selectHighlighted();">'
										+ suggestionString +'</div>';
		/////////////////////////////////////////////
	}

/*
	if(newSuggestions == '')
	{
		$(mainSuggestionBoxContainerId).style.height = 17 + "px";
		$(mainSuggestionBoxBackgroundId).style.height = 17 + "px";		
		newSuggestions = '<div class="suggestionContainer">' + noSearchResultsMessage + '</div>';
	}
*/	

	previousSearches[previousSearchPrefix+searchText] = newSuggestions;
	previousSearchesSuggestionBoxHeight[previousSearchPrefix+searchText] = totalLineCount;

	if($(searchFieldId).value == searchText && newSuggestions != '')
	{
		containerDiv.innerHTML = newSuggestions;
		showSuggestionContainer();
	}
	else
	{
		searchFieldFocused = false;
		suggestionBoxFocused = false;
		hideSuggestionContainer();
	}
}


////////////////////////////////////////////////////////////////
function formatSuggestionString(string)
{
	var SUGGESTION_WIDTH = 104;
	var tempString = "";
	if (indent)
	{
		if (string.length < SUGGESTION_WIDTH + 1)
		{
			suggestionString += "<div class='indentText'>" + string + "</div>";
			lineCount++;
		}
		else
		{
			tempString = string.substring(0, SUGGESTION_WIDTH);
			breakIndex = searchBreakIndex(tempString)+1;
			
			suggestionString += "<div class='indentText'>" + string.substring(0, breakIndex) + "</div>";
			tempString = string.substring(breakIndex , string.length);
			lineCount++;
			formatSuggestionString(tempString);
		}	
	}
	else
	{
		if (string.length < SUGGESTION_WIDTH + 1)
		{
			suggestionString += string;		
			lineCount++;
		}
		else
		{
			tempString = string.substring(0, SUGGESTION_WIDTH);
			breakIndex = searchBreakIndex(tempString)+1;

			suggestionString += "<div>" + string.substring(0, breakIndex) + "</div>";
			tempString = string.substring(breakIndex, string.length);
			indent = true;
			lineCount++;
			formatSuggestionString(tempString);
			
		}	
	}
}

function searchBreakIndex(str)
{
	var maax=0;
	var arr = new Array();
	arr[arr.length] = str.lastIndexOf(" ");
	arr[arr.length] = str.lastIndexOf(",");
	arr[arr.length] = str.lastIndexOf(".");
	arr[arr.length] = str.lastIndexOf("-");
	
	for (var i=0;i<arr.length;i++)
	{	
		if(maax < arr[i])
		{
			maax = arr[i];
		}		
	}
	return maax;
}
////////////////////////////////////////////////////////////////

function showCachedSuggestionBox(searchTerm)
{
	var lineCount = previousSearchesSuggestionBoxHeight[previousSearchPrefix+searchTerm];
	var containerDiv = $(mainSuggestionBoxContainerId);
	var backgroundFrame = $(mainSuggestionBoxBackgroundId)

	containerDiv.innerHTML = previousSearches[previousSearchPrefix+searchTerm];
	if(lineCount > 0)
	{
		containerDiv.style.height = (lineCount * 21) - 5 + "px";
	}
//	backgroundFrame.style.height = (lineCount * 21) - 5 + "px";
	backgroundFrame.style.height = (lineCount * 21) + 1 +"px";


	if(previousSearches[previousSearchPrefix+searchTerm] != ''){
		showSuggestionContainer();
	}
	else
	{
		searchFieldFocused = false;
		suggestionBoxFocused = false;
		hideSuggestionContainer();
	}
}

function handleKeyUpEvent(e)
{
	var code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
	var containerDiv = $(mainSuggestionBoxContainerId);
	if (e.type == "keyup") 
	{    
		if(code != 40 && code != 38 && code != 13 && code != 37)
		{
//					$('countDownDiv').innerHTML = 'Makes it here';
			originalValue = $(searchFieldId).value;

			if($(searchFieldId).value != '' && $(searchFieldId).value.length > 2)
			{
				setSearchTimer();
			}
			else
			{
				searchFieldFocused = false;
				suggestionBoxFocused = false;
				hideSuggestionContainer();
			}
		}
	}
}

function highlightSelection(element)
{

	var containerDiv = $(mainSuggestionBoxContainerId);
	var selectedElement = containerDiv.select('.'+selectedSearchResultClass);
	if(selectedElement)
	{
		Element.Methods.removeClassName(selectedElement[0], selectedSearchResultClass);
		Element.Methods.addClassName(element, selectedSearchResultClass);
	}
}

function selectHighlighted()
{
	var containerDiv = $(mainSuggestionBoxContainerId);
	var selectedElement = containerDiv.select('.'+selectedSearchResultClass);
	if(selectedElement)
	{
		
		setSearchVariables(selectedElement[0]);
		searchFieldFocused = false;
		suggestionBoxFocused = false;
		hideSuggestionContainer();

	}
}

////////////////////////////////////////////
function extractSearchVariables(selectedElement)
{
	var selectedElementChildren = "";
	if (selectedElement.childNodes.length > 1)
	{
		for (var i=0; i<selectedElement.childNodes.length; i++ )
		{
			selectedElementChildren += selectedElement.childNodes[i].innerHTML;
		}

		$(searchFieldId).value = selectedElementChildren;
	}
	else
	{
		$(searchFieldId).value = selectedElement.innerHTML;
	}
}
////////////////////////////////////////////

function setSearchVariables(selectedElement)
{
	
	//$(searchFieldId).value = selectedElement.innerHTML;

	if(selectedElement.readAttribute('preferredOag') != 'null')
	{
		$(oagValueHolderId).value = selectedElement.readAttribute('preferredOag');
		$(searchFieldId).value = selectedElement.readAttribute('locationTitle');
	}
	else
	{
		$(oagValueHolderId).value = '';
		extractSearchVariables(selectedElement);
	}

	if(selectedElement.readAttribute('stateCode') != 'null')
	{
		$(stateCodeId).value = selectedElement.readAttribute('stateCode');
	}
	else
	{
		$(stateCodeId).value = '';
	}
	if(selectedElement.readAttribute('countryCode') != 'null')
	{
		$(countryCodeId).value = selectedElement.readAttribute('countryCode');
	}
	else
	{
		$(countryCodeId).value = '';
	}

	if(selectedElement.readAttribute('searchType') != 'null')
	{
		$(searchTypeId).value = selectedElement.readAttribute('searchType');
	}
	else
	{
		$(searchTypeId).value = '';
	}

	if($(isServedById))
		$(isServedById).value = selectedElement.readAttribute('isServedBy');

	$(autoFillId).value = 'Y';
}

function showSuggestionContainer()
{
	
	$(mainSuggestionBoxContainerId).style.display = 'block';
	$(mainSuggestionBoxContainerId).style.zIndex = '999';
	
	$(mainSuggestionBoxBackgroundId).style.display = 'block';
	$(mainSuggestionBoxBackgroundId).style.zIndex = '998';

}

function hideSuggestionContainer()
{
//			$('infoDiv').innerHTML = $('infoDiv').innerHTML + '<br />' + timeCounter + ' ' + searchInitiated + ' ' + cancelSearch;

	if(timeCounter)
	{
//		$('infoDiv').innerHTML = 'Cancelling Search ' + timeCounter;
		cancelSearch = true;
//		$('countDownDiv').innerHTML = 'Last Thing Run';
	}
	timeCounter = null;
	searchInitiated = false;
	if(!searchFieldFocused && !suggestionBoxFocused)
	{
		$(mainSuggestionBoxContainerId).style.display = 'none';
		$(mainSuggestionBoxBackgroundId).style.display = 'none';
		$(mainSuggestionBoxContainerId).innerHTML = '';
	}

}

function setFocusFlag(elementId)
{
	if(elementId == searchFieldId)
	{
		searchFieldFocused = true;
	}
	else
	{
		suggestionBoxFocused = true;
	}
}

function removeFocusFlag(elementId)
{
	if(elementId == searchFieldId)
	{
		searchFieldFocused = false;
	}
	else
	{
		suggestionBoxFocused = false;
	}
}

// copied and slightly modified from protytypejs 1.6.0
function positionedOffset(element) {
	var valueT = 0, valueL = 0;
	do {
		valueT += element.offsetTop || 0;
		valueL += element.offsetLeft || 0;
		element = element.offsetParent;
		if (element) {
			if (element.tagName == 'BODY') break;
			var p = Element.getStyle(element, 'position');
			if (p == 'relative' || p == 'absolute') break;
		}
	} while (element);
	return returnOffset(valueL, valueT);
}

// copied and slightly modified from protytypejs 1.6.0
function returnOffset(l, t) {
	var result = [l, t];
	result.left = l;
	result.top = t;
	return result;
}

function setAsSearchIput(inputObject)
{
	var fieldSearchFieldFocused = inputObject.getAttribute('Id');

	if(searchFieldId != '')
	{
		hideSuggestionContainer();
	}

	mainSuggestionBoxContainerId		= multipleWordwheelsArray[fieldSearchFieldFocused+'mainSuggestionBoxContainerId'];
	selectedSearchResultClass			= multipleWordwheelsArray[fieldSearchFieldFocused+'selectedSearchResultClass'];
	searchFieldId						= multipleWordwheelsArray[fieldSearchFieldFocused+'searchFieldId'];
	mainSuggestionBoxBackgroundId		= multipleWordwheelsArray[fieldSearchFieldFocused+'mainSuggestionBoxBackgroundId'];
	dialectId							= multipleWordwheelsArray[fieldSearchFieldFocused+'dialectId'];
	stateCodeId							= multipleWordwheelsArray[fieldSearchFieldFocused+'stateCodeId'];
	countryCodeId						= multipleWordwheelsArray[fieldSearchFieldFocused+'countryCodeId'];
	searchTypeId						= multipleWordwheelsArray[fieldSearchFieldFocused+'searchTypeId'];
	autoFillId							= multipleWordwheelsArray[fieldSearchFieldFocused+'autoFillId'];
	oagValueHolderId					= multipleWordwheelsArray[fieldSearchFieldFocused+'oagValueHolderId'];
	isServedById						= multipleWordwheelsArray[fieldSearchFieldFocused+'isServedById'];
	requestInfoURL						= multipleWordwheelsArray[fieldSearchFieldFocused+'requestInfoURL'];
}

function setAsSearchIputString(inputString)
{
	var fieldSearchFieldFocused = inputString;

	if(searchFieldId != '')
	{
		hideSuggestionContainer();
	}

	mainSuggestionBoxContainerId		= multipleWordwheelsArray[fieldSearchFieldFocused+'mainSuggestionBoxContainerId'];
	selectedSearchResultClass			= multipleWordwheelsArray[fieldSearchFieldFocused+'selectedSearchResultClass'];
	searchFieldId						= multipleWordwheelsArray[fieldSearchFieldFocused+'searchFieldId'];
	mainSuggestionBoxBackgroundId		= multipleWordwheelsArray[fieldSearchFieldFocused+'mainSuggestionBoxBackgroundId'];
	dialectId							= multipleWordwheelsArray[fieldSearchFieldFocused+'dialectId'];
	stateCodeId							= multipleWordwheelsArray[fieldSearchFieldFocused+'stateCodeId'];
	countryCodeId						= multipleWordwheelsArray[fieldSearchFieldFocused+'countryCodeId'];
	searchTypeId						= multipleWordwheelsArray[fieldSearchFieldFocused+'searchTypeId'];
	autoFillId							= multipleWordwheelsArray[fieldSearchFieldFocused+'autoFillId'];
	oagValueHolderId					= multipleWordwheelsArray[fieldSearchFieldFocused+'oagValueHolderId'];
	isServedById						= multipleWordwheelsArray[fieldSearchFieldFocused+'isServedById'];	
	requestInfoURL						= multipleWordwheelsArray[fieldSearchFieldFocused+'requestInfoURL'];
}