function Trim(TRIM_VALUE){if(TRIM_VALUE.length < 1){return"";}TRIM_VALUE = RTrim(TRIM_VALUE);TRIM_VALUE = LTrim(TRIM_VALUE);if(TRIM_VALUE==""){return "";}else{return TRIM_VALUE;}} //End Function
function RTrim(VALUE){var w_space = String.fromCharCode(32);var v_length = VALUE.length;var strTemp = "";if(v_length < 0){return"";}var iTemp = v_length -1;while(iTemp > -1){if(VALUE.charAt(iTemp) == w_space){}else{strTemp = VALUE.substring(0,iTemp +1);break;}iTemp = iTemp-1;} return strTemp;} 
function LTrim(VALUE){var w_space = String.fromCharCode(32);if(v_length < 1){return"";}var v_length = VALUE.length;var strTemp = "";var iTemp = 0;while(iTemp < v_length){if(VALUE.charAt(iTemp) == w_space){}else{strTemp = VALUE.substring(iTemp,v_length);break;}iTemp = iTemp + 1;} return strTemp;}

function AutoSuggest(elem)
{
this.getKeyCode = function(ev){if(ev){return ev.keyCode;}if(window.event){return window.event.keyCode;}};
this.getEventSource = function(ev){if(ev){return ev.target;}if(window.event){return window.event.srcElement;}};
this.cancelEvent = function(ev){if(ev){ev.preventDefault();ev.stopPropagation();}if(window.event){window.event.returnValue = false;}}
this.createXMLHttpRequest = function()
  {
  try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
  try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
  try { return new XMLHttpRequest(); } catch(e) {}
  alert("XMLHttpRequest not supported");
  return null;
  }
var me = this;
this.elem = elem;
this.suggestions = null;
this.inputText = null;
this.highlighted = -1;
this.lastHighLighted=-1;
this.myScrollHeight=0;
this.JSONLabelField=null;
this.JSONObjectName=null;
this.visible=true;
this.getSuggestions = function()
  {
  return this.suggestions;
  }
this.setSuggestions = function(s)
  {
  this.suggestions=s;
  }  
this.div = document.getElementById("autosuggest");
this.div.onblur = function()
  {
  if(navigator.appName=="Microsoft Internet Explorer")
    {
    me.hideDiv();
    }
  else
    {
    me.useSuggestion();
    me.hideDiv();
    }
  };
  
var TAB = 9;var ESC = 27;var KEYUP = 38;var KEYDN = 40;var SHIFT = 16;var ALT=18;var CAPS=20;var CTRL=17;var ENTER=13;
elem.onblur = function()
	{
    me.useSuggestion();
    me.hideDiv();
	};
elem.onclick = function(ev)
	{
	me.hideDiv();
	me.cancelEvent(ev);
	return false;
	};	
elem.onkeydown = function(ev)
	{  
	var key = me.getKeyCode(ev);
	switch(key)
		{
		case ENTER:
		case TAB:
			me.useSuggestion();
			me.cancelEvent(ev);
		break;
		case ESC:
			me.cancelEvent(ev);me.hideDiv();break;
		case KEYUP:
			if (me.highlighted>0)
				{
				me.lastHighLighted=me.highlighted;
				me.highlighted--;
				me.myScrollHeight-=me.div.getElementsByTagName('LI')[me.highlighted].offsetHeight;
				}
			me.changeHighlightKey(key);
			break;
		case KEYDN:
			if (me.highlighted<(me.suggestions.length - 1))
				{
				me.lastHighLighted=me.highlighted;
				me.highlighted++;
				if(me.highlighted>0)
					{me.myScrollHeight+=me.div.getElementsByTagName('LI')[me.highlighted].offsetHeight;}
				}
			me.changeHighlightKey(key);
			break;
		}
	};
elem.onkeyup = function(ev) 
	{
	me.keyPressed();
	var key = me.getKeyCode(ev);
	switch(key)
		{
		case TAB:
		case ENTER:
		case ESC:
		case SHIFT:
		case ALT:
		case CAPS:
		case CTRL:
			return;
		case KEYUP:
		case KEYDN:
			return;
		default:
			if ( this.value.length > 0 )
				{
	    		me.inputText = this.value;
				me.getHTTPData();
				}
			else
				{me.hideDiv();}
		}
	};
this.getAllData = function()
	{
	document.getElementById("autosuggest").scrollTop=parseInt("0",10);
	me.highLighted=-1;
	me.lastHighLighted=-1;
	me.myScrollHeight=0;
	me.elem.focus();
	me.inputText = "";
	me.getHTTPData();
	}
this.useSuggestion = function()
	{
	if (this.highlighted > -1)
		{
		this.elem.value = eval('this.suggestions[this.highlighted].' + as1.JSONLabelField);
	    this.elementClick(this.suggestions[this.highlighted]);
		this.hideDiv();
		setTimeout("document.getElementById('" + this.elem.id + "').focus()",0);
		}
	};
this.showDiv = function()
  {
  if(this.visible)
    {
    this.div.style.display = 'block';
    }
  };
this.elementClick = function(item){alert("Warning:No Handler Defined for suggestion selection");};
this.hideDiv = function()
	{
	this.div.style.display = 'none';
	this.highlighted = -1;
	};
this.changeHighlightMouse = function()
	{
	var lis = this.div.getElementsByTagName('LI');
	var li;
    for(var k=0;k<lis.length;k++)
	  {	
	  li = lis[k];
	  li.className = (this.highlighted == k) ?  "selected" : "";
      }
	};
this.changeHighlightKey = function()
	{
	var lis = this.div.getElementsByTagName('LI');		
	if(this.highlighted>-1 && this.highlighted<=(me.suggestions.length - 1)){lis[this.highlighted].className="selected";}
	if(this.lastHighLighted>-1 && this.lastHighLighted<=(me.suggestions.length - 1)){lis[this.lastHighLighted].className="";}
	document.getElementById("autosuggest").scrollTop=parseInt((this.myScrollHeight),10);
	};
this.positionDiv = function()
	{
	var el = this.elem;
	var x = 0;
	var y = el.offsetHeight;
	while (el.offsetParent && el.tagName.toUpperCase() != 'BODY')
		{
		x += el.offsetLeft;
		y += el.offsetTop;
		el = el.offsetParent;
		}
	x += el.offsetLeft;
	y += el.offsetTop;
	this.div.style.left = x + 'px';
	this.div.style.top = y + 'px';
	this.div.style.width = this.elem.offsetWidth;
	};
this.insertHTML = function(html){}
this.keyPressed=function(){};
this.createDiv = function(theSuggestions)
	{
	me.suggestions=theSuggestions;
	var ul = document.createElement('ul');
	me.div.scrollTop=0;
	var counter=0;
	for(i=0;i<me.suggestions.length;i++)
	  {
	  var li = document.createElement('li');
	  li.onblur = function()
	    {
		if(navigator.appName=="Microsoft Internet Explorer")
		  {
		  me.hideDiv();
		  }
		else
		  {
		  me.useSuggestion();
		  me.hideDiv();
		  }
		};
		li.innerHTML=eval('me.suggestions[i].' + me.JSONLabelField);	
		if (me.highlighted == i){li.className = "selected";} 
		ul.appendChild(li);
		counter++; 
	  }
	this.div.replaceChild(ul,this.div.childNodes[0]);
	ul.onmouseover = function(ev)
		{
		var target = me.getEventSource(ev);
		while (target.parentNode && target.tagName.toUpperCase() != 'LI'){target = target.parentNode;}
		var lis = me.div.getElementsByTagName('LI');
		me.myScrollHeight=0;
		var counter=0;
		
		if(navigator.appName=="Netscape")
		  {
		  for(var k=0;k<lis.length;k++)
		    {
			var li = lis[k];
			if(li == target)
				{
				if(navigator.appName=="Microsoft Internet Explorer")
					{
					if(counter<lis.length-1)
					{
					me.myScrollHeight-=me.div.getElementsByTagName('LI')[counter].offsetHeight;
					}
					}
				me.highlighted = k;
				break;
				}
			else
			  {
			  if(me.div.getElementsByTagName('LI')[counter] !=null)
			    {
			    me.myScrollHeight+=me.div.getElementsByTagName('LI')[counter].offsetHeight;
			    }
			  }
			counter++;
		    }
		  }

		for (i in lis)
			{
			var li = lis[i];
			if(li == target)
				{
		
				if(navigator.appName=="Microsoft Internet Explorer")
					{
					if(counter<lis.length-1)
					{
					me.myScrollHeight-=me.div.getElementsByTagName('LI')[counter].offsetHeight;
					}
					}
				me.highlighted = i;
				break;
				}
			else
			  {
			  if(me.div.getElementsByTagName('LI')[counter] !=null)
			    {
			    me.myScrollHeight+=me.div.getElementsByTagName('LI')[counter].offsetHeight;
			    }
			  }
			counter++;
			}
		me.changeHighlightMouse();
		};
	ul.onclick = function(ev)
		{
		me.useSuggestion();
		me.hideDiv();
		me.cancelEvent(ev);
		return false;
		};
	this.div.className="suggestion_list";
	this.div.style.position = 'absolute';
	};


this.getHTTPData= function()
	{
	var sURL = this.getUrl(me.inputText)
	var xhReq = this.createXMLHttpRequest();
    xhReq.open("GET", sURL, true);
    xhReq.onreadystatechange = function () 
	  {
	  if (xhReq.readyState == 4) 
	    {
		myString =Trim(xhReq.responseText);
		if(myString != "0")
		  {
		  var myJSONObject = eval('(' + myString  + ')');
		  var suggestions=eval('myJSONObject.' + me.JSONObjectName);
		  me.createDiv(suggestions);	
		  me.positionDiv();
		  me.showDiv();
		  }
		}
	  };
      xhReq.send(null);
	  delete xhReq;  
	}

}
