﻿
/* basic ajax stuff */


var xmlRequester=null;

function xmlClearRequests()
{
	if(xmlRequester)
	{
		xmlRequester.abort();
		xmlRequester=null;
	}
	
}

function xmlCallServer(URL,handler)
{
	
	try 
	{ 
		xmlRequester = new XMLHttpRequest(); 
	} 
	catch (error) 
	{ 
		try 
		{ 
		
			xmlRequester = new ActiveXObject("Microsoft.XMLHTTP"); 
		} 
		catch (error) 
		{ 
			return false;
		} 
	}
	
	xmlRequester.open("GET",URL);
	xmlRequester.send(null);
	xmlRequester.onreadystatechange=handler;

	return true;

}


function xmlCheckStatus()
{
	
	if(xmlRequester.readyState==4)
	{
		if(xmlRequester.status==200) return 1; // success
		else return 2; // failure
	}
	
	return 0; // still working

}
	
	



/* autocomplete code */
	
	
	
function ac_chooseItem(textfield,fillextradata)
{


	var querydiv = ac_getAcDiv();

//	textfield.value = querydiv.childNodes(	querydiv.highlightindex).childNodes(0).childNodes(0).innerText;
	textfield.value = querydiv.childNodes(querydiv.highlightindex).attributes.getNamedItem("value").value;
	if(fillextradata)
	{
		if(textfield.onAutoComplete)
		{
			var scr = new String(textfield.onAutoComplete);
			if(scr.indexOf("(")<0) scr += "(%index%)";
			scr= scr.replace("%index%",textfield.sourceIndex);
			window.execScript(scr);
		}
	}

}


function ac_onBlur()
{
	
	var querydiv = ac_getAcDiv();
	var querydiv2 = ac_getAcDiv2();

	textfield = window.event.srcElement;
	
	if(querydiv.style.visibility=="visible")
	{
		if(querydiv.highlightindex>=0)
		{
			ac_chooseItem(textfield,true);
		}
		querydiv.style.visibility="hidden";
		querydiv2.style.visibility="hidden";
		document.getElementById("autocomplete").lastquery="";
		
	}
	
	return true;

}


function ac_onKeyDown(textfield)
{

	//if(textfield.autocomplete!="off") textfield.autocomplete="off";

	var querydiv = ac_getAcDiv();
	var querydiv2 = ac_getAcDiv2();

	if(querydiv.style.visibility=="visible")
	{
		if ( window.event.keyCode==27 )
		{
			textfield.value="";
			querydiv.style.visibility="hidden";
			querydiv2.style.visibility="hidden";
			return false;
		}
		
		if ( window.event.keyCode==13 )
		{
			ac_onBlur(textfield);
			return false;
		}
		
		if ( window.event.keyCode==8 || window.event.keyCode==38 || window.event.keyCode==40)
		{
			ac_highlight(window.event.keyCode, textfield);
		}
	}
	else if (window.event.keyCode==40)
	{
		var autocomplete = document.getElementById("autocomplete");

		
		var url = "../query.aspx?action=" + textfield.lookupaction;
		url += "&data=%";
		url += "&source=" + textfield.sourceIndex;
		
		if(textfield.param1) url += "&p1=" + textfield.param1;
		if(textfield.param2) url += "&p2=" + textfield.param2;
		
		xmlClearRequests();
		xmlCallServer(url,ac_queryReturn);
		autocomplete.lastquery = textfield.value;

	}
		
	return true;
	
}

function ac_onKeyUp(textfield)
{

	var querydiv = ac_getAcDiv();
	var querydiv2 = ac_getAcDiv2();

	if (window.event.keyCode==8 || window.event.keyCode==38 || window.event.keyCode==40)
	{
		// ignore these, let keydown handle
	}
	else
	{
		if(textfield.value=="")
		{
			querydiv.style.visibility="hidden";
			querydiv2.style.visibility="hidden";
		}
		else
		{
			var autocomplete = document.getElementById("autocomplete");
			if(textfield.value != autocomplete.lastquery)
			{
			
				var url = "../query.aspx?action=" + textfield.lookupaction;
				url += "&data=" + textfield.value;
				url += "&source=" + textfield.sourceIndex;
				
				if(textfield.param1) url += "&p1=" + textfield.param1;
				if(textfield.param2) url += "&p2=" + textfield.param2;
				
				xmlClearRequests();
				xmlCallServer(url,ac_queryReturn);
				autocomplete.lastquery = textfield.value;
			}
		}			
	}	
		
	return true;	
}



function ac_highlight (keycode, textfield )
{

	var querydiv = document.getElementById("autocomplete");
	
	var currentindex = querydiv.highlightindex;
	var newindex = currentindex;
	
	if ( keycode==8 )
		newindex=-1;
	else if ( keycode==38 )
		if ( newindex>0 ) newindex--;	
		else newindex = querydiv.itemcount-1;
	else if ( keycode==40 )
		if ( newindex<=querydiv.itemcount-2 ) newindex++;
		else newindex=0;
		
	if ( newindex != currentindex )
	{
		if ( currentindex >= 0 ) querydiv.childNodes[currentindex].style.backgroundColor="white";
		if ( newindex >= 0 ) querydiv.childNodes[newindex].style.backgroundColor = "yellow";
		querydiv.highlightindex = newindex;
		if( newindex>=0 ) 
		{
			ac_chooseItem(textfield,false);
		}
	}

}


function ac_queryReturn()
{
	
	var stat=xmlCheckStatus();
	
	if (stat==0)
	{
		// busy
	}
	else if (stat==2)
	{
		// error
	}
	else
	{
	
	
		//var querydiv = document.getElementById("autocomplete");
		var querydiv = ac_getAcDiv();
		var querydiv2 = ac_getAcDiv2();
		var returns = xmlRequester.responseXML.getElementsByTagName("item").length;
		
		if(returns==0)
		{
			querydiv.style.visibility = "hidden";
			querydiv2.style.visibility = "hidden";
		}
		else
		{
		
			while(querydiv.childNodes.length>0)
			{
				querydiv.removeChild(querydiv.childNodes[0]);
			}
			
			var searchterm = xmlRequester.responseXML.getElementsByTagName("data")(0).attributes.getNamedItem("value").value;
			var sourceindex = xmlRequester.responseXML.getElementsByTagName("data")(0).attributes.getNamedItem("source").value;
			var textfield = document.all[sourceindex];

			var columncount = xmlRequester.responseXML.getElementsByTagName("format").length;
		
			try { textfield.detachevent("onblur", ac_onBlur); } catch(e) {}
			textfield.attachEvent("onblur", ac_onBlur);
			
			querydiv.highlightindex = -1;
			querydiv.itemcount = returns;

			
			for(var x=0;x<returns;x++)
			{
				var div = document.createElement("DIV");
				var spmain = document.createElement("SPAN");

				spmain.style.display="block";
				spmain.style.paddingLeft="2";
				spmain.style.paddingRight="4";

				for(var xx=0;xx<columncount;xx++)
				{
					var colattrs = xmlRequester.responseXML.getElementsByTagName("format")(xx).attributes;
					
					var sp = document.createElement("SPAN");
					
					sp.innerHTML = "<nobr>" + xmlRequester.responseXML.getElementsByTagName("item")(x).attributes.getNamedItem(colattrs.getNamedItem("column").value).value + "</nobr>";
					
					for(var z=0;z<xmlRequester.responseXML.getElementsByTagName("item")(x).attributes.length;z++)
					{
						var attr = document.createAttribute(xmlRequester.responseXML.getElementsByTagName("item")(x).attributes[z].name);
						attr.value = xmlRequester.responseXML.getElementsByTagName("item")(x).attributes[z].value;
						div.attributes.setNamedItem(attr);
					}
					
					sp.style.fontSize = "11px";
					sp.style.fontFamily = "arial,sans-serif";
					sp.style.color = colattrs.getNamedItem("color").value;
					sp.style.textAlign = colattrs.getNamedItem("align").value;
					sp.style.verticalAlign = "top";
					sp.style.width=colattrs.getNamedItem("width").value;

					sp.style.textOverflow="ellipsis";					
					sp.style.overflow="hidden";					
			
				
					spmain.appendChild(sp);
				}

				div.appendChild(spmain);

				if(x==0)
				{
					div.style.backgroundColor="yellow";
					querydiv.highlightindex=0;
				}

		
				querydiv.appendChild(div);
				

			}
			

			querydiv.style.left=calculateOffsetLeft(textfield)+"px";
			querydiv.style.top=calculateOffsetTop(textfield)+textfield.offsetHeight-1+"px";
			
			var varwidth;
			if(textfield.acwidth==null) varwidth = new String("");
			else varwidth = new String(textfield.acwidth);

			if(varwidth=="") varwidth=calculateWidth(textfield)+"px";
			else if(varwidth.indexOf("%")>0)
			{
				varwidth = varwidth.replace("%","");
				varwidth = calculateWidth(textfield) * (varwidth/100);
			}

			querydiv.style.width=varwidth;
			//querydiv.style.width=calculateWidth(textfield)+"px";

			querydiv.style.visibility = "visible";


			var querydiv2 = document.getElementById("autocomplete2");
			querydiv2.style.left=querydiv.style.left;
			querydiv2.style.top=querydiv.style.top;
			querydiv2.style.width=querydiv.style.width;
			querydiv2.style.height = querydiv.offsetHeight;
	
			querydiv2.style.visibility = "visible";
			

			// scroll if necessary
			
			var bottomOfDiv = calculateOffsetTop(textfield)+textfield.offsetHeight-1+querydiv.offsetHeight;
			var bottomOfPage = document.body.clientHeight+document.body.scrollTop;
			
			if(bottomOfDiv>bottomOfPage)
				window.scrollBy(0,bottomOfDiv-bottomOfPage);
				
			
			
		}
	}			

	/*					
			
				if x=0 then
					y=len(form1.tbFirstLevelOrganizationName.value)
					z=len(sp.innerHTML)
					form1.tbFirstLevelOrganizationName.value = sp.innerHTML
					setSelectionRange form1.tbFirstLevelOrganizationName,y,z
				end if
	*/

}

function ac_getAcDiv()
{
	var d = document.getElementById("autocomplete");
	
	if(!d)
	{	
		d = document.createElement("DIV");
	
		d.id = "autocomplete";
		d.highlightindex = -1;
		d.lastquery = "";
		d.itemcount = 0;
		d.style.borderRight="black 1px solid";
		d.style.borderLeft="black 1px solid";
		d.style.borderTop="black 1px solid";
		d.style.borderBottom="black 1px solid";
		d.style.position="absolute";
		d.style.backgroundColor="white";
		d.style.visiblity="hidden";
		d.style.paddingLeft="3px";
		d.style.zIndex="1";
		
		document.body.appendChild(d);
		
	}
		
	return d;
}

function ac_getAcDiv2()
{
	var d = document.getElementById("autocomplete2");
	
	if(!d)
	{	
		d = document.createElement("IFRAME");
		d.id = "autocomplete2";
		d.style.visibility="hidden";
		d.style.position="absolute";
		
		document.body.appendChild(d);
		
	}
		
	return d;
}



function calculateWidth(txtFld) { 
	if(txtFld.getAttribute("acwidth")!=null)
	{
		return txtFld.getAttribute("acwidth");
	}

	if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1) 
	{ 
		return txtFld.offsetWidth-2 
	} 

	return txtFld.offsetWidth 

}

function calculateOffsetLeft(r){
	return calc(r,"offsetLeft")
}

function calculateOffsetTop (r){
	return calc(r,"offsetTop")
}

function calc(r,attr)
{
	var kb=0;
	while(r)
	{
		kb+=r[attr]; 
		r=r.offsetParent
	}
	return kb
}





			

function setSelectionRange(input, selectionStart, selectionEnd) {

  if (input.setSelectionRange) {
    //input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }

}

