var es_xmlHttp = createXmlHttpRequestObject();
var es_waiter = null;
//smarter creation of XmlHttp request
function createXmlHttpRequestObject()
{
	var es_xmlHttp;
	try
	{
		es_xmlHttp = new XMLHttpRequest();
	}
	catch(e)
	{
		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
			"MSXML2.XMLHTTP.5.0",
			"MSXML2.XMLHTTP.4.0",
			"MSXML2.XMLHTTP.3.0",
			"MSXML2.XMLHTTP",
			"Microsoft.XMLHTTP");
		for (var i=0; i < XmlHttpVersions.length && !es_xmlHttp; i++)
		{
			try
			{
				// try to create XMLHttpRequest object
				es_xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
			catch (e) {}
		}
	}
	if (!es_xmlHttp)
		alert("Error creating the XMLHttpRequest object. Your browser does not support AJAX!");
	else
		return es_xmlHttp;
}
//outputs the exception (for debug)
function writeException(e)
{
	return e.message;
}
//makes an ajax request with given url retries in a second if request is busy
function es_ProcessRequest(url)
{
	if (es_xmlHttp) 	
	{
		if(es_xmlHttp.readyState == 0 || es_xmlHttp.readyState == 4)
		{
			try
			{
				// initiate reading the file from url the server
				es_xmlHttp.open("GET", url, true);
				es_xmlHttp.onreadystatechange = es_handleRequestStateChange;
				es_xmlHttp.send(null);
				writeToDebugDiv("Request sended to " + url);
			}
			catch (e)
			{       	
				alert("Can't connect to server:\n" + writeException(e));
			}
		}
		else
		{
			clearTimeout(es_waiter);
			es_waiter = setTimeout('es_ProcessRequest("' + url + '")', 1000);
			writeToDebugDiv("Request postponed for " + url);
			
		}
	}				
}
//searches the medications (onkeyup event)
function do_request(object,area)
{
	url = "/cgi-bin/erminesearch.pl?area="+area+"&name=" + encodeURIComponent(object.id) + "&query=" + encodeURIComponent(object.value) + "&" + Math.random();
	es_ProcessRequest(url);
}
//handles the request status change, if everything is ok - fills selects with data from script
function es_handleRequestStateChange()
{
	if (es_xmlHttp.readyState == 4)
	{
		if (es_xmlHttp.status == 200)
		{
			try
			{
				response = es_xmlHttp.responseText;
				//writeToDebugDiv("Request status: 4 (complete). Server said:");
				writeToDebugDiv(response);
				var xmlResponse = es_xmlHttp.responseXML;
				xmlRoot = xmlResponse.documentElement;
				//parsing the Xml
				nameArray = xmlRoot.getElementsByTagName("name");
				entryArray = xmlRoot.getElementsByTagName("entry");

				//getting the select name from response
				var name = "";
				if(nameArray.length > 0)
					name = nameArray.item(0).firstChild.data;

				if(name != "" && document.getElementById(name))
				{
					var id = createResults(name);
					for (var i=0; i<entryArray.length; i++)
					{
						var labelNodes = entryArray.item(i).getElementsByTagName("label");
						var urlNodes = entryArray.item(i).getElementsByTagName("url");
						var imageNodes = entryArray.item(i).getElementsByTagName("image_url");
						if(labelNodes.length > 0 && labelNodes.item(0).firstChild)
						{
							var label = labelNodes.item(0).firstChild.data;
							var url = false;
							var image_url = false;

							if(urlNodes.length > 0 && urlNodes.item(0).firstChild)
							{
								url = urlNodes.item(0).firstChild.data;
							}
							if(imageNodes.length > 0 && imageNodes.item(0).firstChild)
							{
								image_url = imageNodes.item(0).firstChild.data;
							}
							setResults(id, label, url, image_url);
						}
					}
					closeResults(id);
					if(entryArray.length == 0)
						hideResults(id);
				}
			}
			catch(e)
			{
				writeToDebugDiv("Error reading the response: \n" + writeException(e));
				
			}
		}
		else
		{
			writeToDebugDiv("There was a problem retrieving the data:\n" +
				es_xmlHttp.status + ": " + es_xmlHttp.statusText);
		}
	}
}
function findPosition(obj) {
	var curleft = curtop = 0;
	if(obj && obj != null)
	{
		curleft = obj.clientWidth / 4;
		curtop = obj.clientHeight;
	}
	while (obj && obj != null)
	{
		curleft += obj.offsetLeft;
		curtop += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return [curleft,curtop];
}
function setPosition(obj,div)
{
	var coords = findPosition(obj);
	div.style.top = coords[1] + 'px';
	div.style.left = coords[0] + 'px';
}
function check(element,area)
{
	do_request(element,area);
}
function createResults(name)
{
	var searchInput = document.getElementById(name);
	var id = "floatDiv";
	if(searchInput)
	{
		var resultsDiv = document.getElementById(id);
		if(resultsDiv)
		{
			setPosition(searchInput,resultsDiv);
			resultsDiv.todiv = "<table width=\"100%\">\n";
		}
	}
	return id;
}
function closeResults(id)
{
	resultsDiv = document.getElementById(id);
	if(resultsDiv)
	{
		resultsDiv.todiv += "</table>";
		resultsDiv.innerHTML = resultsDiv.todiv;
		resultsDiv.style.display = "block";
		resultsDiv.onmouseover=function(){this.style.display='block';}
		resultsDiv.onmouseout=function(){this.style.display='none';}
	}
}
function hideResults(id)
{
	resultsDiv = document.getElementById(id);
	if(resultsDiv)
	{
		resultsDiv.style.display = "none";
	}
}
function setResults(id, label, url, image_url)
{
	resultsDiv = document.getElementById(id);
	if(resultsDiv)
	{
		var img = "&nbsp;";
		var anch = label;
		if(image_url)
		{
			img = "<img src=\"" + image_url + "\" />";
		}
		if(url)
		{
			anch = "<a href=\"" + url + "\">" + label + "</a>";
		}
		resultsDiv.todiv += "<tr><td>" + img + "</td><td>" + anch + "</td></tr>\n";
	}
}
//replaces all entries of string in the string to another strings
function replaceAll(string, from, to)
{
	var str1 = string.toString ? string.toString() : "";
	var str2 = str1 + "!";
	while(str2 != str1)
	{
		str2 = str1;
		str1 = str1.replace(from, to);
	}
	return str1;
}
//outputs debug information to a certain div it is present on the page
function writeToDebugDiv(txt)
{
	DebugDiv = document.getElementById("DebugDivElement");
	if(DebugDiv)
		DebugDiv.innerHTML += replaceAll(
			replaceAll(txt, "<", "&lt;"), 
			"\n","<br/>") + "<br/>";	
}
