
//manage "autocomplete" for searches - called "suggestions"
//suggetsions are pulled from the database and therefore only work on layers already loaded into sde and part of the app


function IMS2_Suggest(){
	var self = this;
	this.xmlReq;
	this.inputElem;
	this.divfocus = 0;
	this.boxfocus = 0;
	this.getSuggest = false;
	this.preVal;
	this.layerid;
	this.fieldName;
	
	//this.suggestDiv = document.getElementById("suggestDiv");
	
	function HideSuggest()
	{
	    //alert(boxfocus + " " + divfocus);   
	    if(self.boxfocus == 0 && self.divfocus == 0)
	        document.getElementById("suggestDiv").style.display = "none";
	}
	this.HideSuggest = HideSuggest;
	
	function MoveFocus(event)
	{
	    //alert(event.which);
	    var div = document.getElementById("suggestDiv");
	    if(IMS2_isMSIE()){
			if (window.event && window.event.keyCode == 40){
			    //alert(document.getElementById("streets").style.display);
				if(div.style.display == "block")
				{
				    //alert(index);
				    //document.getElementById("street" + ++index).style.backgroundColor='#316AC5';
				    //document.getElementById("street" + index).style.color='#FFFFFF';
				    //alert(index);
				}
				
				return(false);
			}
			else if(window.event && window.event.keyCode == 38)//up
			{
			    if(div.style.display == "block" && index > 0)
				{
				    //document.getElementById("street" + --index).style.backgroundColor='#316AC5';
				    //document.getElementById("street" + index).style.color='#FFFFFF';
				}
				else if(index == 0)
				{
				    index = -1;
				}
				return(false);
			}
			else if(window.event && window.event.keyCode == 13)//enter
			{
			    if(index >= 0 )
			    {
			        //document.getElementById("txtStreet").value = document.getElementById("street" + index).innerHTML;
			        div.style.display = "none";
			        index = -1;
			    }
			}
		}
		else{
			if (event && event.which == 40){
			    if(div.style.display == "block")
				{
				    //document.getElementById("street" + ++index).style.backgroundColor='#316AC5';
				    //document.getElementById("street" + index).style.color='#FFFFFF';
				}
				return(false);
			
			}
			else if(event && event.which == 38)
			{
			    if(div.style.display == "block" && index > 0)
				{
				    //document.getElementById("street" + --index).style.backgroundColor='#316AC5';
				    //document.getElementById("street" + index).style.color='#FFFFFF';
				}
				else if( index == 0 )
				{
				    index = -1;
				}
				return(false);
			}
			else if(event && event.which == 13)
			{
			    if(index >= 0 )
			    {
			        //self.inputElem.value = document.getElementById("street" + index).innerHTML;
			        div.style.display = "none";
			        index = -1;
			    }
			}
		}
		return(true);
	}
	this.MoveFocus = MoveFocus;
	
	function Check(){
		var val = self.inputElem.value;
		
		//alert(val + " " + self.preVal);
		if(self.preVal != val || val == ""){
			return;
		}
		
		if(self.getSuggest && (self.preVal == val) ){
			self.getSuggest = false;
			self.GetSuggestions(self.layerid,self.fieldName,val);
		}
	}
	this.Check = Check;

	function GetSuggestions(layerid,fieldname,sug){		
		
		var elem = self.inputElem;
		
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap("MapControl1")):(null));
		if(!mapctl){
			return;
		}
		
		//if the user hasn't entered a value or the layer is an upload, don't do anything
		if(elem.value == "" || mapctl.layers.Get(layerid).dynamic )//|| elem.value == self.preVal)
			return;
			
//		if(!self.getSuggest || self.preVal != elem.value)
//		{
//			return;
//		}	
		var requestMade = false;
	        
		self.xmlReq = IMS2_createXMLHTTPRequest();
		//self.suggest = elem;
		
		if(self.xmlReq){
			var url = "webservice.asmx/GetSuggest";
			self.xmlReq.onreadystatechange = ProcessGetSuggestions;
			self.xmlReq.open("POST", url, true);
			self.xmlReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			self.xmlReq.send("servicename=" + mapctl.mapdatasource + "&layerid=" + layerid + "&fieldname=" + fieldname + "&sug=" + sug);
			requestMade = true;
		}
		return(requestMade);
	}
	this.GetSuggestions = GetSuggestions;

	function ProcessGetSuggestions(){
        if(self.xmlReq){
            if( self.xmlReq.readyState == 4 )
		    {
			    if( self.xmlReq.status == 200 )
			    {
			        if(self.xmlReq.responseXML.normalize){
			            self.xmlReq.responseXML.normalize();
			        }
			        var root = self.xmlReq.responseXML.documentElement;   
			        
			        if(!root.childNodes[0]){
			            //self.featureResultSet = null;
			        }else{
						var data = null;
						var html = "<table cellpadding=\"2\" cellspacing=\"0\">";
						var div = document.getElementById("suggestDiv");
			            try{
		                    eval("data = " + root.childNodes[0].nodeValue + ";");
		                    for(var i = 0; i < data.length; i++){
								html += "<tr onmouseover=\"this.style.backgroundColor='#cccccc';\" onmouseout=\"this.style.backgroundColor='#ffffff';\" onmousedown=\"document.getElementById('" + self.inputElem.id + "').value='" + data[i] + "';document.getElementById('suggestDiv').style.display='none';\"><td>" + data[i] + "</td></tr>";
								//html += "<span style=\"width:100%;\" onmouseover=\"this.style.backgroundColor='#cccccc';\" onmouseout=\"this.style.backgroundColor='#ffffff';\" onmousedown=\"document.getElementById('" + self.inputElem.id + "').value='" + data[i] + "';document.getElementById('suggestDiv').style.display='none';\">" + data[i] + "</span><br/>";
		                    }
		                    html += "</table>";
		                    
		                    div.innerHTML = html;
		                    div.style.left = findPos(self.inputElem)[0];
		                    div.style.top = parseInt(findPos(self.inputElem)[1]) + 22 + "px";
		                    div.style.display = "block";
		            
		                }catch(e){
		                    ;
		                }
			        }
			    }else{
			        alert("Connection error: " + self.xmlReq.status + "\n" + self.xmlReq.statusText + "\n" + self.xmlReq.responseText);
			    }
			    try{
			        self.xmlReq.abort();
			    }catch(e){;}
			    self.xmlReq = null;
			    //self.UpdateLoadingFeedback();
			}
        }
    }
    this.ProcessGetSuggestions = ProcessGetSuggestions;
}

var IMS2_Suggest = new IMS2_Suggest();