var editInputHasFocus = false;
var selectInputHasFocus = false;
var lastEditValue = "";

var alwaysVisible = false;
var bIsTabPressed = false;

var arrayOfAutoCompleteData = new Array();

var textArrayForCombo   = null;
var valueArrayForCombo  = null;
var CurrentComboDivId   = null;
var CurrentTextInputId  = null;
var CurrentUrlForUpdate = null;

function EditInputOnKeyDownWithIDs(textInputID,  completeDivID, url, e)
{	
    EditInputOnKeyDown(fetch_object(textInputID), fetch_object(completeDivID), url, e);
}

function EditInputOnKeyDown(textInput, completeDiv, url, e)
{	
	CurrentComboDivId   = completeDiv.id;
	CurrentTextInputId  = textInput.id;
	CurrentUrlForUpdate = url;
	editInputHasFocus = true;
	selectInputHasFocus = false;

	e = (e ? e : window.event);
	var keycode = (e.which ? e.which : (e.keyCode ? e.keyCode : (e.charCode ? e.charCode : 0)));

	switch (keycode)
	{
		case 13: //ENTER
			textInput.blur();
		case 9: //TAB
			return;
			break;
		case 40: //Down Arrow

			if (completeDiv.style.visibility == 'visible')
			{
				setTimeout("SetFocusToComboDelayed();", 10);
			}

			break;
	}

	lastEditValue = textInput.value;
	setTimeout("updateAutoComplete();", 10);
}

function SetFocusToComboDelayed()
{
	var completeDiv = fetch_object(CurrentComboDivId);
	var selects     = completeDiv.getElementsByTagName("SELECT");

	selects[0].focus();
	editInputHasFocus = false;
	selectInputHasFocus = true;
}

function updateAutoComplete()
{
	var textInput = fetch_object(CurrentTextInputId);
	
	if( lastEditValue == textInput.value )
		return;
	
	if( textInput.value == "" )
	{
		var completeDiv = fetch_object(CurrentComboDivId);
		var selects     = completeDiv.getElementsByTagName("SELECT");
		
		completeDiv.style.visibility = "hidden";
		selects[0].selectedIndex = 0; // prevent the value to get back to the textbox if the user erases it
	}
	
	editInputHasFocus = true;
	selectInputHasFocus = false;

	updateAutoCompleteWithAjaxRequest();
}

function updateAutoCompleteWithAjaxRequest()
{
	http_ac_request = new vB_AJAX_Handler(true);

	http_ac_request.onreadystatechange(function()
	{
		if (http_ac_request.handler.readyState == 4)
		{
			if (http_ac_request.handler.status == 200)
			{
				eval(http_ac_request.handler.responseText);
				RefreshAutoCompleteCombo();
			}
			else
			{
				alert('There was a problem with the result of this AJAX request.');
				alert(http_ac_request.responseText);
			}
		}
	});

	http_ac_request.send('http://www.cheapticketscanada.com/forum/cities.php', 'do=citysuggest&text=' + escape(fetch_object(CurrentTextInputId).value));
	return true;
}

function RefreshAutoCompleteCombo()
{
	var completeDiv = fetch_object(CurrentComboDivId);
	var textInput   = fetch_object(CurrentTextInputId);
	var newsize = textArrayForCombo.length;
	var newtext;

	if (!textArrayForCombo || !valueArrayForCombo)
	{
		return;
	}
	if (newsize > 20 )
	{
		newsize = 20;
	}
	else if (newsize < 2)
	{
		newsize = 2;
	}
	if (CurrentTextInputId == 'depart_txt')
	{
		newtext = '<select name="air.m.leg0.departLocationCode" size="' + newsize + '" id="depart">';
	}
	else if (CurrentTextInputId == 'arrive_txt')
	{
		newtext = '<select name="air.m.leg0.arrivalLocationCode" size="' + newsize + '" id="arrive">';
	}
	else if (CurrentTextInputId == 'origin_txt')
	{
		newtext = '<select name="tour.m.originCode" size="' + newsize + '" id="origin">';
	}
	else if (CurrentTextInputId == 'destin_txt')
	{
		newtext = '<select name="tour.m.destinationCode" size="' + newsize + '" id="destin">';
	}
	else if (CurrentTextInputId == 'destination_txt')
	{
		newtext = '<select name="hotel.m.locationCode" size="' + newsize + '" id="destination">';
	}
	else if (CurrentTextInputId == 'pickup_txt')
	{
		newtext = '<select name="car.m.pickupLocation" size="' + newsize + '" id="pickup">';
	}
	else if (CurrentTextInputId == 'dropoff_txt')
	{
		newtext = '<select name="car.m.dropoffLocation" size="' + newsize + '" id="dropoff">';
	}
	else if (CurrentTextInputId == 'air_depart_text')
	{
		newtext = '<select name="depart_city" id="air_depart_city" size="' + newsize + '">';
	}
	else if (CurrentTextInputId == 'air_arrive_text')
	{
		newtext = '<select name="arrive_city" id="air_arrive_city" size="' + newsize + '">';
	}
	
	var colorings = ['', ' style="background: #FFFF00;"', ' style="background: #00CC00;"'];

	for (var i = 0; i < textArrayForCombo.length; i++)
	{
		newtext += '<option value="' + valueArrayForCombo[i] + '"' + colorings[styleArrayForCombo[i]] + ( !i ? ' selected="selected"' : '' ) + '>' + textArrayForCombo[i] + '</option>';
	}

	completeDiv.innerHTML = newtext + '</select>';
	var selects = completeDiv.getElementsByTagName("SELECT");
	selects[0].ondblclick = function() { selectInputHasFocus = false; HideAutoComplete(textInput, completeDiv); }
	selects[0].onmousedown = function() { selectInputHasFocus = true; editInputHasFocus = false; }
	selects[0].onblur = function() { selectInputHasFocus = false; HideComboOnBlur(completeDiv); }

	if (textInput.value.length > 1)
	{
		completeDiv.style.visibility = 'visible';
	}
	else
	{
		completeDiv.style.visibility = 'hidden';		
	}
}

function ResetCombo()
{
	editInputHasFocus = false;
	selectInputHasFocus = false;
	textArrayForCombo  = null;
	valueArrayForCombo = null;
}

function HideAutoComplete(textInput, completeDiv)
{
	var selects = completeDiv.getElementsByTagName('SELECT');
	textInput.value = selects[0].options[selects[0].selectedIndex].text;
	completeDiv.style.visibility = 'hidden';
	ResetCombo();
}

function HideAutoCompleteKeydownWithID(textInputID, completeDivID, e)
{
	HideAutoCompleteKeydown(fetch_object(textInputID), fetch_object(completeDivID), e);
}

function HideAutoCompleteKeydown(textInput, completeDiv, e)
{
	CurrentComboDivId  = completeDiv.id;
	CurrentTextInputId = textInput.id;

	e = (e ? e : window.event);
	var keycode = (e.which ? e.which : (e.keyCode ? e.keyCode : (e.charCode ? e.charCode : 0)));

	if (keycode == 13) //ENTER
	{
		completeDiv.style.visibility = 'hidden';
		ResetCombo();
	}
	else if (keycode == 8) //BACKSPACE
	{
		textInput.value = textInput.value.substring(0, textInput.value.length);
		textInput.focus();
		EditInputOnKeyDown(textInput, completeDiv, CurrentUrlForUpdate, e)
		void(0);
	}
	else
	{
		setTimeout("SetInputTextWithCombo();", 10);
	}
}

function SetInputTextWithCombo()
{
	var textInput   = fetch_object(CurrentTextInputId);
	var completeDiv = fetch_object(CurrentComboDivId);

	if (completeDiv != null)
	{
	    var selects = completeDiv.getElementsByTagName('SELECT');
	    var idxSel  = selects[0].selectedIndex;
	}
	if (idxSel >= 0 && textInput.value != '')
	{
		textInput.value = selects[0].options[idxSel].text;
	}
}

function HideComboOnBlur(completeDiv)
{
	if (!editInputHasFocus && !selectInputHasFocus)
	{   
		completeDiv.style.visibility = 'hidden';
		ResetCombo();
		SetInputTextWithCombo();
	}
	
}

function setAutoCompleteExt(textInputId, divId, url)
{
	var textInput = fetch_object(textInputId);
	var completeDiv = fetch_object(divId);
	var selects = completeDiv.getElementsByTagName('SELECT');

	completeDiv.style.position = 'absolute';
	completeDiv.style.visibility = 'hidden';

	textInput.onkeydown = function(e)
	{
		EditInputOnKeyDown(textInput, completeDiv, url, e);
	}
	textInput.onmousedown = function()
	{
		editInputHasFocus = true;
		selectInputHasFocus = false;
	}
	textInput.onfocus = function()
	{
		editInputHasFocus = true;
		selectInputHasFocus = false;

		if (selects[0].options[0].text == '')
		{
			textInput.value = '';
		}
	}
	textInput.onblur = function()
	{
		if (textInput.value != '' && selects[0].options[0].text == '')
		{
			alert("Please allow a moment for the location dropdown menu to load, and select the airport that you wish to use from it.\n");
			textInput.focus();
			return;
		}

		editInputHasFocus = false;
		HideComboOnBlur(completeDiv);

		if (textInputId == 'pickup_txt')
		{
			swap_car_pickup();
		}
	}
	completeDiv.onkeydown = function(e)
	{
		HideAutoCompleteKeydown(textInput, completeDiv, e);
	}
}
