// Database Lookup component V.1.0.0  By Alex Platt (May 18 2010)
// Usage:
// var look = new Lookup("text_input_id","<?= encrypt_string("SELECT value_field,caption_field FROM table WHERE caption_field LIKE \"@value@%\" ORDER BY caption_field LIMIT 5") ?>","<?= encrypt_string("SELECT caption_field FROM table WHERE value_field = @value@" ?>");

    var lookup_instances = new Array();
	
	
	function update_lookup_list ( uniqueId ) {
	    lookup_instances[uniqueId].update_lookup_list();
	}
	
	function isEnterKey (evt) {
			var charCode = (evt.which) ? evt.which : event.keyCode
			// if not a digit or arrow key abort
			if ( charCode == 13) {
			  return true
			} else {
			  return false
			}
	}
	
	
	function addListener(element, event, listener, bubble) {
	  if(element.addEventListener) {
		if(typeof(bubble) == "undefined") bubble = false;
		element.addEventListener(event, listener, bubble);
	  } else if(this.attachEvent) {
		element.attachEvent("on" + event, listener);
	  }
	}
	

    function Lookup(txt_input_id, enc_query, default_query, skin ) {
		
		this.lookup_update_timer = null;
		this.uniqueId = txt_input_id;
		this.mouseOverList = false;
		this.ignoreTxt = "Zipcode or City (optional)";
		
		lookup_instances[ this.uniqueId ] = this;
		
		if (skin == null) {
			this.skin = true;
		}
		else {
			this.skin = skin;
		}
		
		
		
		
 
		
		////////// AJAX FUNCTIONS //////////////////
		this.getAjaxHttp = function ()
		{  
			 var xmlHttp;
			 try
			 {    // Firefox, Opera 8.0+, Safari    
				xmlHttp=new XMLHttpRequest();    
			 }
			 catch (e)
			 {    // Internet Explorer    
				  try
				  {      
					  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");      
				  }
				  catch (e)
				  {      
					   try
					   {        
							xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");        
					   }
					   catch (e)
					   {        
							alert("Your browser does not support AJAX!");        
							return false;        
					   }      
				  }    
			}  
			return xmlHttp;
			
		}
		
		this.getResult = function ( phpFile )
		{
			var xmlHttp = this.getAjaxHttp();	
	
							
			var dummy = "&dummy=" + new Date().getTime();
			if (phpFile.indexOf("?") > 0) {
			  dummy = "&dummy=" + new Date().getTime();
			}
			else {
			  dummy = "?dummy=" + new Date().getTime();
			}
			
			xmlHttp.open("GET",phpFile + dummy,false);
			xmlHttp.send(null);
			
			if(xmlHttp.readyState==4)
			{
					return (xmlHttp.responseText);
			}
			
			return null;
		}

		/////////// END OF AJAX FUNCTIONS
		
		
		/// Finds element position on screen returns [x,y] array
		this.findPos = function ( obj ) {
			var curleft = curtop = 0;
			if (obj.offsetParent) {
				 do {
					curleft += obj.offsetLeft;
					curtop += obj.offsetTop;
				 } while (obj = obj.offsetParent);
			}
			return [curleft,curtop];
		}
		
		// Get Element Heigth in pixels
		this.getElementHeight = function ( Elem ) {
			if(document.getElementById) {
				var elem = document.getElementById(Elem);
			} else if (document.all) {
				var elem = document.all[Elem];
			}
			xPos = elem.offsetHeight;
			return xPos;
		}
		
		// Get Element Width in pixels
		this.getElementWidth = function ( Elem ) {
			if(document.getElementById) {
				var elem = document.getElementById(Elem);
			} else if (document.all){
				var elem = document.all[Elem];
			}
			xPos = elem.offsetWidth;
			return xPos;
		}
		
		// Add event listeners to an element
		this.addListener = function (element, event, listener, bubble) {
			if(element.addEventListener) {
				if(typeof(bubble) == "undefined") bubble = false;
					element.addEventListener(event, listener, bubble);
				} else if(this.attachEvent) {
				element.attachEvent("on" + event, listener);
		  	}
		}
		
		// Loads content for the lookup list
		this.update_lookup_list = function () {
			var container = document.getElementById(txt_input_id + "_list_container");
			var input = document.getElementById(txt_input_id + "_input");
			var output = document.getElementById(txt_input_id);
			if ((input.value != "") && (input.value != this.ignoreTxt)) {
				container.innerHTML = this.getResult("Scripts/lookup_populate.php?instance=" + this.uniqueId  + "&input=" + input.value + "&output=" + output.id + "&query=" + escape(enc_query) );
			}
			else {
				container.style.display = "none";
			}
		}
		
        
		this.update_lookup_values = function ( value, caption ) {

			
			var input = document.getElementById(txt_input_id + "_input");
			var output = document.getElementById(txt_input_id);
			
			input.value = caption;
			output.value = value;
			
			/// UPDATE SESSION VAR FOR ZIPCODE
			var sv = this.getResult("update_session_zipcode.php?zip=" + value);
			
			//hide list
			var container = document.getElementById(txt_input_id + "_list_container");
			container.style.display = "none";
			
		}
		
		
		// Constructor Method
		this.create_lookup = function ( txt_input_id, enc_query, default_query ) {
			
			//remove original txt_input
		    
			orig = document.getElementById(txt_input_id);
	
			var wrap = document.createElement('span');
				
			var input = document.createElement('input');
			input.setAttribute('type',"text");
			input.setAttribute('id', txt_input_id + "_input");
			input.setAttribute('name', txt_input_id + "_input");
			
			
			if (this.skin == true) {
			//copy original css for textfield
			if (navigator.appName == 'Netscape') {    
				input.setAttribute('style',orig.getAttribute('style'));        
			}
			else {
	
				if (orig.style != null) {
					var s = orig.style;
					for (var p in s) {
						try {
							input.style[p] = orig.style[p]
						}
						catch (e) {					   
						}
					}
				}
			}
			
			
				input.style.background = "url('Scripts/lookup_imgs/magnifier.png') no-repeat right center #FFF";
				input.style.border = "solid 1px #000";
				input.style.paddingRight = "18px";
			}
			
			input.setAttribute('autocomplete', 'off');
			
			try {
			//orig.setAttribute("type","hidden");
			  orig.style.display = "none";
			} catch (err) {
				
			}
			
			
			//// get default value
			if ((orig.value != "") && (orig.value != this.ignoreTxt)) {
				input.value = this.getResult("Scripts/lookup_default.php?value=" + escape(orig.value) + "&query=" + escape(default_query));
			}
			
			
			wrap.appendChild(input);
			
	
			orig.parentNode.insertBefore(wrap,orig);
			
			var listContainer = document.createElement("div");
			listContainer.setAttribute("id",txt_input_id + "_list_container");
			listContainer.setAttribute("name",txt_input_id + "_list_container");
			listContainer.style.backgroundColor = "#FFF";
			listContainer.style.border = "Solid 1px #CCC";
			var width = this.getElementWidth(input.id) - 2;
			
			listContainer.style.width = width + "px";
			
			listContainer.style.minHeight = "0px";
			listContainer.style.display = "none";
			listContainer.style.position = "absolute";
			listContainer.style.zIndex = 2000;
			
			var pos  =  this.findPos(input);
			var height = this.getElementHeight(input.id);
			listContainer.style.top = pos[1] + height + "px";
			listContainer.style.left =  pos[0] + "px";
			document.body.appendChild(listContainer);
			
			var uniqueId = this.uniqueId;
			ignoreTxt = this.ignoreTxt;
			
			
			
			addListener(input,"blur", function (e) {
               if (lookup_instances[uniqueId].mouseOverList == false) {
					listContainer.style.display = "none";
					
					//get selected value
					if ((input.value != "") && (input.value != ignoreTxt)) {
						input.value = lookup_instances[uniqueId].getResult("Scripts/lookup_get_selection.php?value=" + escape(document.getElementById(uniqueId).value) + "&input=" + escape(input.value) + "&field=caption&query=" + escape(enc_query) );
						document.getElementById(uniqueId).value = lookup_instances[uniqueId].getResult("Scripts/lookup_get_selection.php?value=" + escape(document.getElementById(uniqueId).value) + "&input=" + escape(input.value) + "&field=value&query=" + escape(enc_query) );
						//// UPDATE SESSION
						var sv = lookup_instances[uniqueId].getResult("update_session_zipcode.php?zip=" + document.getElementById(uniqueId).value);
			
					}

				}
            });
			
			
			
			listContainer.onmouseover = function (e) {
				lookup_instances[uniqueId].mouseOverList = true;
			}
			
			listContainer.onmouseout = function (e) {
				lookup_instances[uniqueId].mouseOverList = false;
			}
			
			input.onkeydown = function (evt) {
				listContainer.style.display = "block";
				listContainer.innerHTML = "Updating...";
				clearTimeout(this.lookup_update_timer);
				this.lookup_update_timer = setTimeout("update_lookup_list('" + uniqueId + "')",500);
				
				if (!evt) {
					evt = event;
				}
				
				charCode = (evt.which) ? evt.which : event.keyCode ;
				
				if (charCode == 13) {
				
						listContainer.style.display = "none";
					
						//get selected value
						if ((input.value != "") && (input.value != ignoreTxt)) {
						input.value = lookup_instances[uniqueId].getResult("Scripts/lookup_get_selection.php?value=" + escape(document.getElementById(uniqueId).value) + "&input=" + escape(input.value) + "&field=caption&query=" + escape(enc_query) );
						document.getElementById(uniqueId).value = lookup_instances[uniqueId].getResult("Scripts/lookup_get_selection.php?value=" + escape(document.getElementById(uniqueId).value) + "&input=" + escape(input.value) + "&field=value&query=" + escape(enc_query) );
						/// UPDATE SESSION VARIABLE 
						var sv = lookup_instances[uniqueId].getResult("update_session_zipcode.php?zip=" + escape(document.getElementById(uniqueId).value));
						}
						
				}
				
			}
			
			input.onkeyup = function (e) {
				if (input.value == "") {
					/// UPDATE SESSION VARIABLE 
					var sv = lookup_instances[uniqueId].getResult("update_session_zipcode.php?zip=");
					listContainer.style.display = "none";
				}
			}
			
			input.onclick = function (e) {
				if ((input.value != "") && (input.value != ignoreTxt)) {									 
					listContainer.style.display = "block";
				}
				else {
					listContainer.style.display = "none";
				}
			}
			
			
			
			input.onfocus = function (e) {
				if ((input.value != "") && (input.value != ignoreTxt)) {
					var pos  =  lookup_instances[uniqueId].findPos(this);
					var height = lookup_instances[uniqueId].getElementHeight(this.id);
					listContainer.style.top = pos[1] + height + "px";
					listContainer.style.left =  pos[0] + "px";
					
					listContainer.style.display = "block";
					listContainer.innerHTML = "Updating...";
					
					clearTimeout(this.lookup_update_timer);
					this.lookup_update_timer = setTimeout("update_lookup_list('" + uniqueId + "')",100);
				}
				else {
					listContainer.style.display = "none";
				}
			}
			
			
			
			
		}
		
		
		this.create_lookup(txt_input_id, enc_query, default_query );
	} // end of class
