var req;
var response;
var strSenderId;
var eventKeyCode;
var timeouts;
var iLastStart;
var sLastSearch;
var sLastSenderId;

function eventHandler(evt)
{
	try
	{
		if(is_ie)
		{
			eventKeyCode = event.keyCode;
		}
		else
		{
			eventKeyCode = evt.keyCode;
		}
		return locationSuggestAreaEventHandler();
	}
	catch(e)
	{
		alert(e.message + " x1")
	}
}

function locationSuggestAreaEventHandler()
{ 
	try
	{
		if(document.getElementById("div" + strSenderId).className.indexOf("displayOn") >= 0)
		{
			switch(eventKeyCode)
			{
				case(27):
					///esc, will close objLocationSuggestAreaId
					hideArea(strSenderId);
				break;
				case(33):
					///page up
				break;
				case(34):
					///page down
				break;
				case(38):
					///up
						objUL = document.getElementById("ul" + strSenderId);
						var i;
						for(i = 0; i < objUL.childNodes.length; i++)
						{
							if(objUL.childNodes[i].className == "hilightOn")
							{
								if((i - 1) >= 0)
								{
									objUL.childNodes[i].className = "";
									objUL.childNodes[i - 1].className = "hilightOn";
									break;
								}
							}
						}
						if(i > 0 && i < objUL.childNodes.length)
						{
							addSuggestion(objUL.childNodes[i - 1])
							document.getElementById("div" + strSenderId).scrollTop -= (document.getElementById("div" + strSenderId).scrollHeight / (objUL.childNodes.length * 1.5));
						}
				break;
				case(40):
					///down
					if(document.getElementById("ul" + strSenderId) != null)
					{
						objUL = document.getElementById("ul" + strSenderId);
						var isSelected	= false
						var isLast		= false;
						var i
						for(i = 0; i < objUL.childNodes.length; i++)
						{
							if(objUL.childNodes[i].className == "hilightOn")
							{
								if((i + 1) < objUL.childNodes.length)
								{
									objUL.childNodes[i].className = "";
									objUL.childNodes[i + 1].className = "hilightOn";
									isSelected = true;
									addSuggestion(objUL.childNodes[i + 1])
									break;
								}
								else
								{
									isLast = true;
									break;	
								}
							}
						}
						if(isSelected == false && isLast == false)
						{
							objUL.childNodes[0].className = "hilightOn";
							addSuggestion(objUL.childNodes[0])
						}
						else
						{
							if((i + 1) < objUL.childNodes.length)
							{
								addSuggestion(objUL.childNodes[i + 1])
								document.getElementById("div" + strSenderId).scrollTop += (document.getElementById("div" + strSenderId).scrollHeight / (objUL.childNodes.length * 1.5));
							}
						}
					}
					
				break;
				case(13):
					///enter, can only load action if item is selected
					hideArea(strSenderId);
					return false;
				break;
			}
		}
	}
	catch(e)
	{
		alert(e.message + " x2")
	}
} 
		

function createList(response)
{
	try
	{
		var objUL	= document.createElement('UL');
		var	objLI;
			
		objUL.id = "ul" + strSenderId;
		
		if	(
				response.getElementsByTagName('LL_ID').length	== 1
			&&	document.getElementById(strSenderId).value		!= null
			&&	document.getElementById(strSenderId).value		== response.getElementsByTagName("LL_Name")[0].firstChild.data
			)
		{
			return null;
		}
		else
		{		
			for(var i = 0; i < response.getElementsByTagName('LL_ID').length; i++)
			{
				objLI = document.createElement("LI");
				objLI.id = "li" + response.getElementsByTagName("LL_ID")[i].firstChild.data;
				objLI.innerHTML = response.getElementsByTagName("LL_Name")[i].firstChild.data;
				objLI.onclick = function()
				{
						document.getElementById(strSenderId).value = this.innerHTML;
						document.getElementById(strSenderId + "Id").value = this.id.slice(2);
						hideArea(strSenderId);
				};
				objLI.onmouseover	= function()
				{
						this.className = "hilightOn";
				};
				objLI.onmouseout	= function()
				{
						this.className = "";
				};
				objUL.appendChild(objLI);
			}
		
			return objUL;
		}
	}
	catch(e)
	{
		alert(e.message + " x3")
	}
}

function addSuggestion(objLI)
{
	try
	{
		//document.getElementById(strSenderId).value = selectedSugestionText;
		document.getElementById(strSenderId).value = objLI.innerHTML; 
		if(document.getElementById(strSenderId + "Id"))
		{
			document.getElementById(strSenderId + "Id").value	= objLI.id.slice(2)
		}
		else
		{
			alert("Error!!! cant find locationId")
		}
		
	}
	catch(e)
	{
		alert(e.message + " x4")
	}
}

function loadXMLDoc(url) 
{
	try
	{

		if	(
				document.getElementById("div" + strSenderId) == null
			||	(
					document.getElementById("div" + strSenderId) != null
				&&	document.getElementById("div" + strSenderId).className == "locationSuggest displayOff"
				)	
			)
		{
			if(document.getElementById("div" + strSenderId) == null)
			{
				///add loading indication
				objLocationSuggestArea = document.createElement("div");
				objLocationSuggestArea.id = "div" + strSenderId;
				///add style to objLocationSuggestArea
				document.body.appendChild(objLocationSuggestArea)
				
				if(is_buggy_ie)
				{
					///this is a IE bug for overlapping a select with a div layer
					objIFrame = document.createElement("iframe");
					objIFrame.id = "iframe" + strSenderId;
					objIFrame.src = "blank.html";
					objIFrame.className = "locationSuggest displayOff"
					objIFrame.frameborder = "0";
					objIFrame.scrolling = "no";
					document.body.appendChild(objIFrame)
				}	
			}
			else
			{
				objLocationSuggestArea = document.getElementById("div" + strSenderId);
			}
			
			objLocationSuggestArea.className = "locationSuggest displayOn";
			
			///will pos suggestion layer at the right spot
			objLocationSuggestArea.style.left	= (getOffsetLeft(document.getElementById(strSenderId), false))	+ "px";
			objLocationSuggestArea.style.top	= (getOffsetTop(document.getElementById(strSenderId), false)	+ document.getElementById(strSenderId).offsetHeight) + "px";
			objLocationSuggestArea.style.height	= "20px";
			objLocationSuggestArea.style.width	=  (document.getElementById(strSenderId).offsetWidth) + "px";
			///append list to div layer
			
			objLocationSuggestArea.innerHTML = "Loading locations...";
		}
		
		
	
		// branch for native XMLHttpRequest object
		if (window.XMLHttpRequest) 
		{
			req = new XMLHttpRequest();
			req.onreadystatechange = processReqChange;
			req.open("GET", url, true);
			req.send(null);
		// branch for IE/Windows ActiveX version
		} 
		else if (window.ActiveXObject) 
		{
			isIE = true;
			req = new ActiveXObject("Microsoft.XMLHTTP");
			if (req) 
			{
				req.onreadystatechange = processReqChange;
				req.open("GET", url, true);
				req.send();
			}
		}
	}
	catch(e)
	{
		alert(e.message + " x5")
	}
}

function processReqChange()
{
	try
	{
		if (req.readyState == 4) 
		{
			if (req.status == 200)
			{
				response = req.responseXML.documentElement;

				if(response.getElementsByTagName('LL_ID').length > 0)
				{
					if(document.getElementById("div" + strSenderId) != null)
					{					
						objLocationSuggestArea = document.getElementById("div" + strSenderId);
					}
					else
					{
						//alert("div" + strSenderId + " " + document.getElementById("div" + strSenderId))
						///create div
//						objLocationSuggestArea = document.createElement("div");
//						objLocationSuggestArea.id = "div" + strSenderId;
//						///add style to objLocationSuggestArea
//						objLocationSuggestArea.className = "locationSuggest displayOff"
//						document.body.appendChild(objLocationSuggestArea)
//						
//						if(is_buggy_ie)
//						{
//							///this is a IE bug for overlapping a select with a div layer
//							objIFrame = document.createElement("iframe");
//							objIFrame.id = "iframe" + strSenderId;
//							objIFrame.src = "blank.html";
//							objIFrame.className = "locationSuggest displayOff"
//							objIFrame.frameborder = "0";
//							objIFrame.scrolling = "no";
//							document.body.appendChild(objIFrame)
//						}					
					}
					
					///will pos suggestion layer at the right spot
					objLocationSuggestArea.style.left	= (getOffsetLeft(document.getElementById(strSenderId), false))	+ "px";
					objLocationSuggestArea.style.top	= (getOffsetTop(document.getElementById(strSenderId), false)	+ document.getElementById(strSenderId).offsetHeight) + "px";
					objLocationSuggestArea.style.height	= "";
					///append list to div layer
					
					objLocationSuggestArea.innerHTML = "";
					
					var oList = createList(response);
					
					response = null;	
					
					if(oList == null)
					{	
						hideArea(strSenderId);
					}
					else
					{
						///reset scoll poss to top
						objLocationSuggestArea.scrollTop = 0;
						
						objLocationSuggestArea.appendChild(oList);
						///reset oList
						oList = null;
						objLocationSuggestArea.style.width = "";
						objLocationSuggestArea.className = objLocationSuggestArea.className.replace("displayOff", "displayOn");					
						objLocationSuggestArea.style.width = objLocationSuggestArea.offsetWidth + "px";

						///IE BUG
						if(is_buggy_ie && document.getElementById("iframe" + strSenderId) != null)
						{
							objIFrame = document.getElementById("iframe" + strSenderId);
							objIFrame.style.left = objLocationSuggestArea.style.left;
							objIFrame.style.top = objLocationSuggestArea.style.top;
							if (objLocationSuggestArea.offsetWidth) objIFrame.style.width = objLocationSuggestArea.offsetWidth;
							if (objLocationSuggestArea.offsetHeight) objIFrame.style.height = objLocationSuggestArea.offsetHeight;
							objIFrame.className = objIFrame.className.replace("displayOff", "displayOn");
						}
					
						///control key event for layer
						document.onkeydown = eventHandler;

						addEvent(objLocationSuggestArea, "mouseover", function() { blockClose[this.id] = true; });
						addEvent(objLocationSuggestArea, "mouseout", function() { blockClose[this.id] = false; });
						addEvent(objLocationSuggestArea, "mouseup", function() { document.getElementById(this.id.replace("div", "")).focus(); });
						
	/					///if there is more or equal to 19 li items add onscroll event
	//					if(objLocationSuggestArea.getElementsByTagName("li").length >= 19)
	//					{
	//						//objLocationSuggestArea.onscroll = function() 
	//						{			
	//							if(objLocationSuggestArea.scrollTop > (objLocationSuggestArea.scrollHeight / 2))
	//							{
	//								var oLocationUL = objLocationSuggestArea.getElementsByTagName("UL");
	//								
	//								var iStart		= oLocationUL[0].childNodes.length;
	///								var iEnd		= iStart + 19;
	//								
	//								if(iStart != iLastStart)
	//								{
	//									iLastStart = iStart;
	//									loadXMLDoc("service/BudgetLocationSuggest.asmx/LocationSuggestBySiteNew?strLocationName=&intSiteId=1&intStart="+ iStart +"&intEnd="+ iEnd +"");
	//									
	///									
	//									//objLocationSuggestArea.scrollTop --;
	//								}
	//								else
	//								{
	//									window.status = iStart + "," + iLastStart + "," + oLocationUL[0].childNodes.length;
	//								}
	//							}
	//							else
	//							{
	//								window.status = objLocationSuggestArea.scrollTop + ", " + (objLocationSuggestArea.scrollHeight / 2) + ", ";
	//							}
	//					
	//						};
	//					}
	//					else
	//					{
	//						alert('test')
	//					}
					}
				}
				else
				{
					hideArea(strSenderId);
				}
			} 
			else 
			{
				//alert("error, status code from WS " + req.status)
				hideArea(strSenderId);
			}
		}
	}
	catch(e)
	{
		alert(e.message + " x6")
	}
}



// Overload: for extended filtering required by Deals
function loadxml(objSender, intSiteId, intDealId, bIsPickup)
{
	alert(objSender.value);
	
	try
	{
		strSenderId = objSender.id;
		addEvent(objSender, "blur", function() { if(!blockClose['div' + this.id]) hideArea(this.id); });

		if(objSender.value.length > -1)
		{
				
			if(eventKeyCode != 27 && eventKeyCode != 40 && eventKeyCode != 38 && (sLastSearch != objSender.value || objSender.value == "" || sLastSenderId != objSender.id))
			{
				sLastSearch		= (sLastSenderId != objSender.id) ?  "" : objSender.value;
				sLastSenderId	= objSender.id;
				
				
				if ((intSiteId == null) || (intSiteId == ""))
				{
					
					// Results filtered only by location name
					loadXMLDoc("/Service/BudgetLocationSuggest.asmx/LocationSuggest?strLocationName=" + objSender.value);
				} else {
					if ((intDealId == null) || (intDealId == ""))
					{
						// Results filtered by location name, and "Allow Booking" settings of the current site
						loadXMLDoc("/service/BudgetLocationSuggest.asmx/LocationSuggestBySite?strLocationName="+ objSender.value +"&intSiteId=" + intSiteId + "");
						//loadXMLDoc("/Service/BudgetLocationSuggest.asmx/LocationSuggestBySite?strLocationName=" + objSender.value + "&intSiteId=" + intSiteId);
					} else {
						// Results filtered by location name, "Allow Booking" settings of current site, and Deal criteria
						loadXMLDoc("/Service/BudgetLocationSuggest.asmx/LocationSuggestBySiteAndDeal?strLocationName=" + objSender.value + "&intSiteId=" + intSiteId + "&intDealId=" + intDealId + "&bIsPickup=" + (bIsPickup == "1"));
					}
				}
			}		
		}
		else
		{
			hideArea(objSender.id);
		}
	}
	catch(e)
	{
		alert(e.message + " x7")
	}
}


function hideArea(id)
{
	try
	{
		if(document.getElementById(id) != null)
		{
			removeEvent(document.getElementById(id), "blur", function() { if(!blockClose['div' + this.id]) hideArea(this.id); });
		}
		if(document.getElementById("div" + id) != null)
		{
			objLocationSuggestArea = document.getElementById("div" + id);
			objLocationSuggestArea.className = objLocationSuggestArea.className.replace("displayOn", "displayOff");
			objLocationSuggestArea.innerHTML = "";
			removeEvent(objLocationSuggestArea, "mouseover", function() { blockClose[this.id] = true; });
			removeEvent(objLocationSuggestArea, "mouseout", function() { blockClose[this.id] = false; });
			removeEvent(objLocationSuggestArea, "mouseup", function() { document.getElementById(this.id.replace("div", "")).focus(); });
			

			// IE Frame Bug
			if(is_buggy_ie && document.getElementById("iframe" + id) != null)	objIFrame.className = objIFrame.className.replace("displayOn", "displayOff");
		}
		
		///reset document event handler
		document.onkeydown = null;
	}
	catch(e)
	{
		//alert(e.message + " x8")
	}
}

// written by Dean Edwards, 2005
// with input from Tino Zijdel - crisp@xs4all.nl
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler)
{
	if (element.addEventListener)
		element.addEventListener(type, handler, false);
	else
	{
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];
		if (!handlers)
		{
			handlers = element.events[type] = {};
			if (element['on' + type]) handlers[0] = element['on' + type];
			element['on' + type] = handleEvent;
		}
	
		handlers[handler.$$guid] = handler;
	}
}
addEvent.guid = 1;

function removeEvent(element, type, handler)
{
	if (element.removeEventListener)
		element.removeEventListener(type, handler, false);
	else if (element.events && element.events[type] && handler.$$guid)
		delete element.events[type][handler.$$guid];
}

function handleEvent(event)
{
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];

	for (var i in handlers)
	{
		if (!Object.prototype[i])
		{
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
}

function fixEvent(event)
{
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}
fixEvent.preventDefault = function()
{
	this.returnValue = false;
}
fixEvent.stopPropagation = function()
{
	this.cancelBubble = true;
}

// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
// previous attached events on the window object for the onload event
if (!window.addEventListener)
{
	document.onreadystatechange = function()
	{
		if (window.onload && window.onload != handleEvent)
		{
			addEvent(window, 'load', window.onload);
			window.onload = handleEvent;
		}
	}
}