var isAOpen;
var oPopup = null;
var IEFixLeft = 36;
var oQuery; var oACcont; var vEntryID = 0; var vEntryCount = 0; var vEntryHeight=22; var vFieldHeight = 19;
var vBg; var vFont; var vBgOver; var vFontOver;
var vQueryData = new Array();
var documentRef = null;
var vInCycle = false;	// boolean bouncer - stops incoming requests until current request handling finishes
var vReadyTimes = 0;
var xmlhttp;
var xmlfile = null;

function installAC(oQuery, url, bg, font, bgOver, fontOver, field, exWidth, adjustXIE, adjustYIE, adjustXFF, adjustYFF){
	  
	
	oQuery.id = oQuery.name;
	if (!adjustYIE) adjustYIE=0; if (!adjustXIE) adjustXIE=0; if (!adjustYFF) adjustYFF=0; if (!adjustXFF) adjustXFF=0;
	
	// create a span to envelope the query-field and auto-complete div
	var oEnvSpan = document.createElement("SPAN");
	oEnvSpan = oQuery.parentNode.insertBefore(oEnvSpan, oQuery);
	//oEnvSpan.style.border="1px solid red";
	if (browser != 'msie')
	{
	
		if(oEnvSpan.offsetTop < oQuery.offsetTop)
			adjustYFF = oQuery.offsetHeight;//adjustYFF = oQuery.offsetTop - oEnvSpan.offsetTop ; 			
		else
			adjustYFF = 8;
	}
	
	
	oEnvSpan.id = '_env'+oQuery.id;
	oQuery = oQuery.parentNode.removeChild(oQuery);
	oQuery = oEnvSpan.appendChild(oQuery);

	//oEnvSpan.style.border="1px solid red;";
	
	// create container for auto-complete options
	if (browser == 'msie'){
		if (!oPopup){
			oPopup = window.createPopup();
			oPopup.document.body.style.direction = 'rtl';
			documentRef = oPopup.document;
		}
    } else {
		documentRef = document;
	}
	oACcont = documentRef.createElement("DIV");
	oACcont.id = "_ac"+oQuery.id;
	oACcont.style.border = "1px solid black";
	oACcont.style.color = font;
	oACcont.style.backgroundColor = bg;
	oACcont.style.textAlign = "right";
	oACcont.style.zIndex = "1500";
	oACcont.style.padding = "0px";
	oACcont.style.marginTop = "1px";
	oACcont.style.display="none";
	oACcont.style.position="absolute";
	oACcont.style.overflow = 'hidden';
	
	oACcont.style.width = oQuery.offsetWidth + exWidth;
	//oACcont.style.width = "200px";
	oACcont.style.height = "0px";
	var vEnvPosition = calcPosition(oQuery);
	if (browser == 'msie'){
		oACcont.style.left = 0;
		oACcont.style.top = 0;
		oACcont = documentRef.body.appendChild(oACcont);
    } else {
        //oACcont.style.right = (oQuery.id == "_where_name") ? "640px" : "220px";
        //oACcont.style.right = "0px";
		oACcont.style.top = vEnvPosition.offsetTop;//+oEnvSpan.offsetHeight + adjustYFF;
		oACcont = oEnvSpan.appendChild(oACcont);
	}
	
	// attach events
	var vOnEventStr = 'on';
	if (!oQuery.attachEvent && oQuery.addEventListener){ oQuery.attachEvent = oQuery.addEventListener; vOnEventStr = ''; }	// Mozilla
	oQuery.attachEvent(vOnEventStr+"keydown", setValue, false);
	oQuery.attachEvent(vOnEventStr+"keyup", acClicked, false);
	oQuery.attachEvent(vOnEventStr+"beforepaste", prePaste, false);
	oQuery.attachEvent(vOnEventStr+"paste", paste, false);
	oQuery.attachEvent(vOnEventStr+"blur", queryLoseFocus, false);
	oQuery.attachEvent(vOnEventStr+"focus", queryGetFocus, false);
	
	var vSS;
	if (browser == 'msie'){
		vSS = documentRef.createStyleSheet();
	} else {
		if (document.styleSheets.length==0){
			vSS = document.createElement("STYLE");
			vSS = document.getElementsByTagName("HEAD").item(0).appendChild(vSS);
		}
		vSS = document.styleSheets[0];
	}
	var vStyleEntry;
	var vStyleEntryOn;
	if(oQuery.id=="headingNameBubble")
	{
		vStyleEntry = 'color:'+font+';font-family:Arial;font-size:12px;background-color:'+bg+'; cursor:pointer; padding-right:2px; padding-left:2px;';
		vStyleEntryOn = 'color:'+fontOver+';font-family:Arial;font-size:12px;background-color:'+bgOver+'; cursor:pointer; padding-right:2px; padding-left:2px;';
	}
	else
	{
		vStyleEntry = 'color:'+font+';font-family:Arial;font-size:18px;background-color:'+bg+'; cursor:pointer; padding-right:2px; padding-left:2px;';
		vStyleEntryOn = 'color:'+fontOver+';font-family:Arial;font-size:18px;background-color:'+bgOver+'; cursor:pointer; padding-right:2px; padding-left:2px;';
	}
	if (vSS.addRule){	// IE
		vSS.addRule('.entry'+oQuery.id, vStyleEntry);
		vSS.addRule('.entryOn'+oQuery.id, vStyleEntryOn);
	} else {	 // Mozilla
		vSS.insertRule('.entry'+oQuery.id+'{'+vStyleEntry+'}', 0);
		vSS.insertRule('.entryOn'+oQuery.id+'{'+vStyleEntryOn+'}', 0);
	}
	// array items: vEntryID, vEntryCount, url, str, vBg, vFont, vBgOver, vFontOver, field, vLeft, vTop, exWidth
	vQueryData[oQuery.id] = new ACcontObject(0, 0, url, '', bg, font, bgOver, fontOver, field, vEnvPosition.offsetLeft+2-exWidth, vEnvPosition.offsetTop+oEnvSpan.offsetHeight, exWidth, adjustXIE, adjustYIE, adjustXFF, adjustYFF);
	
}

function ACcontObject(vEntryID, vEntryCount, url, str, vBg, vFont, vBgOver, vFontOver, field, vLeft, vTop, vExWidth, adjustXIE, adjustYIE, adjustXFF, adjustYFF){
	this.entryId = vEntryID;
	this.entryCount = vEntryCount;
	this.url = url;
	this.str = str;
	this.bg = vBg;
	this.font = vFont;
	this.bgOver = vBgOver;
	this.fontOver = vFontOver;
	this.valueField = field;
	this.valuesArr = null;
	this.left = vLeft;
	this.top = vTop;
	this.exWidth = vExWidth;
	this.adjustYIE = adjustYIE;
	this.adjustXIE = adjustXIE;
	this.adjustYFF = adjustYFF;
	this.adjustXFF = adjustXFF;
	return this;
}

function prePaste(event) {
	event.returnValue = false;
}

function paste(event){
	oQuery.value = (window.clipboardData || event.clipboardData).getData("Text") ;
	//fCheckSearch();	// external func
	event.returnValue = false;
	acClicked(event);
}

function normalizeString(str){
	var vReg = new RegExp(/\<\/?b\>/gi);
	return str.replace(vReg, '');
}

function hasQueryValue(str){
	if (str == '') return false;
	if (str.match(/\S/)==null) return false;
	return true;
}

// keyboard enter handler
function setValue(event){
	var cancelEvent = false;
	var kc = event.keyCode;
	var obj = documentRef.getElementById(oACcont.id + "_e" + vEntryID);
	isAOpen = (oACcont.style.display == "block") ? true : false;
	if (kc == 27) acHide();
	if (kc == 13 && (oACcont.style.display == "block")){
		if (vEntryID != 0 && obj != null){
			oQuery.value = normalizeString(obj.innerHTML);
			if (vQueryData[oQuery.id].valueField) vQueryData[oQuery.id].valueField.value = vQueryData[oQuery.id].valuesArr[obj.id];
			if (event.cancelable){ event.preventDefault(); }
			cancelEvent = true;
		}
		acHide();
		if (cancelEvent)
			return false;
	}
}
// keyboard arrow keys handlers
function keyup() {
	if (oACcont.style.display=="none" || vEntryCount==0) return;
	if (vEntryID!=0) documentRef.getElementById(oACcont.id+"_e"+vEntryID).className = 'entry'+oQuery.id;
	if (vEntryID-1<=0) vEntryID=vEntryCount+1;
	documentRef.getElementById(oACcont.id+"_e"+(--vEntryID)).className = 'entryOn'+oQuery.id;
}
function keydown() {
	if (oACcont.style.display=="none" || vEntryCount==0) return;
	if (vEntryID>0) documentRef.getElementById(oACcont.id+"_e"+vEntryID).className = 'entry'+oQuery.id;
	if (vEntryID+1>vEntryCount) vEntryID=0;
	documentRef.getElementById(oACcont.id+"_e"+(++vEntryID)).className = 'entryOn'+oQuery.id;
	
}
// mouse handlers
function entryOver(event){
	if (vEntryID!=0) documentRef.getElementById(oACcont.id+"_e"+vEntryID).className = 'entry'+oQuery.id;
	var obj = (event.srcElement) ? event.srcElement : event.target;
	if (obj.tagName == 'B') obj = obj.parentNode;
	obj.className = 'entryOn'+oQuery.id;
	vEntryID = parseInt(obj.id.substring(obj.id.indexOf('_e')+2));
}
function entryOut(event){
	var obj = (event.srcElement) ? event.srcElement : event.target;
	if (obj.tagName == 'B') obj = obj.parentNode;
	var id = parseInt(obj.id.substring(obj.id.indexOf('_e')+2));
	if (id != vEntryID && vEntryID!=0) documentRef.getElementById(oACcont.id+"_e"+vEntryID).className = 'entry'+oQuery.id;
	obj.className = 'entry'+oQuery.id;
	vEntryID = 0;
}
function entryClick(event) {
	var obj = (event.srcElement) ? event.srcElement : event.target;
	if (obj.tagName == 'B') obj = obj.parentNode;
	if (vEntryID != 0){
		oQuery.value = normalizeString(obj.innerHTML);
		if (vQueryData[oQuery.id].valueField) vQueryData[oQuery.id].valueField.value = vQueryData[oQuery.id].valuesArr[obj.id];
		vEntryID = parseInt(obj.id.substring(obj.id.indexOf('_e')+2));
	}
	if (browser == 'msie'){ acHide(); }
    //findAddress();
}

function acClicked(event) {
	vQueryData[oQuery.id].str = oQuery.value;
	var kc = event.keyCode;
	if (kc==32 || kc==189 || kc==8 || kc==16 || kc==46 || kc==45 || kc==186 || kc==188 || kc==190 || (kc>=48 && kc<=57) || (kc>=65 && kc<=90)){
		if (!hasQueryValue(vQueryData[oQuery.id].str)){ acHide(); acClean(); return; }
		acClean();
		vNumOfEntries = 0;
		
		// send string to server - oQuery.value;
		if (!vInCycle){
			vReadyTimes = 0;
			vInCycle = true;
			var max='';
			var areaName = null;
			if(vQueryData[oQuery.id].str == "אז" || vQueryData[oQuery.id].str == "אזו" || vQueryData[oQuery.id].str == "אזור" || vQueryData[oQuery.id].str == "אזור ")
			   max = "&maxResults=15";
			/*if(vQueryData[oQuery.id].str == "איז" || vQueryData[oQuery.id].str == "איזו" || vQueryData[oQuery.id].str == "איזור" || vQueryData[oQuery.id].str == "איזור ")
			{
				var ar = vQueryData[oQuery.id].str.split("י");
				
				areaName = ar[0] + ar[1];
				//vQueryData[oQuery.id].str = areaName; 				

				max = "&maxResults=15";
			}  */

			loadXMLFile(vQueryData[oQuery.id].url+ (areaName ? areaName : encodeURI(vQueryData[oQuery.id].str))+max);
		}
	}
	if (kc == 38) keyup();
	if (kc == 40) keydown();
        if (kc == 27) acHide();
}

function queryLoseFocus(){
	acHide();
}

function acHide(){
	oACcont.style.display="none";
	if (browser == 'msie') oPopup.hide();
}

function queryGetFocus(event){
	oQuery =  (event.srcElement) ? event.srcElement : event.target;
	oACcont = documentRef.getElementById("_ac"+oQuery.id);
	acShow();
}

function acShow(){
	if (hasQueryValue(oQuery.value) && vEntryCount>0){
		var oEnvSpan = document.getElementById('_env'+oQuery.id);
		var vEnvPosition = calcPosition(oQuery);
		if (browser == 'msie'){
			vQueryData[oQuery.id].left = vEnvPosition.offsetLeft - vQueryData[oQuery.id].exWidth + IEFixLeft  ;//vEnvPosition.offsetLeft + 2 -vQueryData[oQuery.id].exWidth + oQuery.offsetWidth;
			 
			vQueryData[oQuery.id].top = vEnvPosition.offsetTop + oQuery.offsetHeight + 2;
			
		} else {
			oACcont.style.left = vEnvPosition.offsetLeft -vQueryData[oQuery.id].exWidth;	//+(oQuery.offsetWidth - vQueryData[oQuery.id].exWidth)
			oACcont.style.top = vQueryData[oQuery.id].top + vQueryData[oQuery.id].adjustYFF;
		}
		oACcont.style.display="block";
		
		// Positioning fix for WebKit.
		if (browser == "safari" && oACcont.id.indexOf("search_text") != -1)
			oACcont.style.marginLeft = (410 - parseInt(window.getComputedStyle(oACcont).width)) + "px";
		if (browser == "safari" && oACcont.id.indexOf("where_name") != -1)
			oACcont.style.marginLeft = (240 - parseInt(window.getComputedStyle(oACcont).width)) + "px";

		if (browser == 'msie')
		{
			var vTopPos = vQueryData[oQuery.id].top + vQueryData[oQuery.id].adjustYIE; // -document.body.scrollTop (removed 25.1.07)
			if (vTopPos + parseInt(oACcont.style.height) > document.body.clientHeight)
			{ 
				vTopPos -= parseInt(oACcont.style.height)+vFieldHeight; 
			}
			oPopup.show(vQueryData[oQuery.id].left , vTopPos, oACcont.style.pixelWidth, oACcont.style.pixelHeight, document.body);
		}
	}
}

function addEntry(text, value){    
	var oEntry=documentRef.createElement("DIV");
	oEntry.id = oACcont.id + "_e"+ (++vEntryCount);
	oEntry.style.whiteSpace = 'nowrap';
	oEntry.title = text;
	with (vQueryData[oQuery.id]){ valuesArr[oEntry.id] = value; }
	oEntry.style.lineHeight = "22px";
	oEntry.style.height = "auto";
	oEntry.className = "entry"+oQuery.id;
	oEntry.dir = "rtl";
	oEntry.align = "right";
	var vText = text.slice(0, text.indexOf(oQuery.value))+'<b>'+ oQuery.value + '</b>' + text.slice(text.indexOf(oQuery.value)+ oQuery.value.length);
	oEntry.innerHTML = vText;

	var vOnEventStr = 'on';
	
	if (!oEntry.attachEvent && oEntry.addEventListener){ oEntry.attachEvent = oEntry.addEventListener; vOnEventStr = ''; }	// Mozilla
	oEntry.attachEvent(vOnEventStr+"mouseover", entryOver, false);
	oEntry.attachEvent(vOnEventStr+"mouseout", entryOut, false);
	oEntry.attachEvent(vOnEventStr+"mousedown", entryClick, false);
	
	oACcont.appendChild(oEntry);
	vNumOfEntries++;
}

function acClean(){
	oACcont.innerHTML = "";
	vEntryCount=0;
	vEntryID=0;
	if (vQueryData[oQuery.id].valueField) vQueryData[oQuery.id].valueField.value = '';
}

function calcPosition(obj) {
    var offset = $("#" + obj.id).offset();
    this.offsetTop = offset.top;
    this.offsetLeft = offset.left - 30;
    return this;
}

function findPos(obj) 
{
    var offset = $("#_search_text").offset();
	return [offset.left, offset.top];
}



// XML loader
function loadXMLFile(url){
	// code for Mozilla, etc.
	if (window.XMLHttpRequest){
		xmlhttp=new XMLHttpRequest();
		xmlhttp.onreadystatechange=xmlReady;
		xmlhttp.open("GET",url,true);
		xmlhttp.send(null);
	}
	// code for IE
	else if (window.ActiveXObject){
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		if (xmlhttp){
			xmlhttp.onreadystatechange=xmlReady;
			xmlhttp.open("GET",url,true);
			xmlhttp.send();
		}
	}
}

// if xmlhttp shows "loaded"
function xmlReady(){
	if (xmlhttp.readyState==4 && xmlhttp.status==200){	 // if "OK"
		vReadyTimes++;
		if (vReadyTimes==1 && vQueryData[oQuery.id].str == oQuery.value){	  // make sure getDataFromXML is run only once per request
			xmlfile = xmlhttp.responseXML.documentElement;
			getDataFromXML(xmlfile);
		} else { vInCycle = false; }
	} else {
		//alert("Problem retrieving XML data:" +xmlhttp.status + '  '+ xmlhttp.statusText);
		vInCycle = false;
	}
}
// end XML loader

// XML reader
function getDataFromXML(xmlDoc) {        
	if (!hasQueryValue(oQuery.value)){ acHide(); acClean(); vNumOfEntries = 0; vInCycle = false; return; }
	var vNodeText;
	vQueryData[oQuery.id].valuesArr = new Array();
	for (var i=0; i<xmlDoc.childNodes.length; i++){
		// check if the node type is an element node
		if (xmlDoc.childNodes[i].nodeType == 1){
			with (xmlDoc.childNodes[i]) { vNodeText = (typeof(text) != 'undefined') ? text : (typeof(textContent) != 'undefined') ? textContent : ''; }
			if (xmlDoc.childNodes[i].attributes.length>0){
				addEntry(vNodeText, xmlDoc.childNodes[i].attributes[0].value);
			} else {
				addEntry(vNodeText);
			}
		}
	}
	var vHasChildNodes = 0;
	if (browser != 'msie') vHasChildNodes = 1;
	if (xmlDoc.childNodes.length > vHasChildNodes){
	    oACcont.style.height = vNumOfEntries * vEntryHeight + 2 + "px";
		acShow();
	} else {
		oACcont.style.height = 0;
		oACcont.style.display="none";
		if (browser == 'msie') oPopup.hide();
	}
	vInCycle = false;
}
