var autoSuggest = {
				//variables
				active : -1,
				callSpeed: 500,
				charsToStartCall: 2,
				hideSpeed : 500,
				inputId: '',
				inputStyles : "display:block;float:left;top:24px;left:218px;width:144px;overflow:visible;position:absolute;background-color:#fff;border:1px solid silver;border-top:none;",
				preSuggest : '',
				sentSearchStr : 'a',
				t: '',
				t2: '',
				tags : [],
				//methods
				callback: function () { 	
					var ajaxResponse = document.getElementById(autoSuggest.inputId+"_tempResponse");
					eval(ajaxResponse.innerHTML);
					var displayHTML = autoSuggest.getDisplayHTML();
					document.getElementById(autoSuggest.inputId+"_response").innerHTML = displayHTML;
					autoSuggest.registerEntites();
					//document.getElementById(autoSuggest.inputId+"_response").style.cssText = autoSuggest.inputStyles;
					autoSuggest.preSuggest = document.getElementById(autoSuggest.inputId).value;
					if(autoSuggest.tags.length > 0) {
							document.getElementById(autoSuggest.inputId+"_response").style.cssText = autoSuggest.inputStyles;
					}
				},
				clearActive : function () {
					var responseDiv = document.getElementById(this.inputId+"_response");
					var entityDivs = responseDiv.getElementsByTagName("div");
					for(var i=0;i<entityDivs.length;i++) {
						entityDivs[i].setAttribute("class", "suggestLink");
						entityDivs[i].className = "suggestLink";
					}
				},
				doAjaxCall : function () {		
					document.getElementById(autoSuggest.inputId+"_response").innerHTML = "";
					if(document.getElementById(autoSuggest.inputId).value != autoSuggest.sentSearchStr || autoSuggest.sentSearchStr != autoSuggest.preSuggest) {
						com.reuters.rcom.utils.replaceContent(autoSuggest.inputId+"_tempResponse", "/news/yourView/JSON?search="+document.getElementById(autoSuggest.inputId).value, null, autoSuggest.callback);
						//document.getElementById(autoSuggest.inputId+"_response").style.cssText = autoSuggest.inputStyles;
					} else if(document.getElementById(autoSuggest.inputId).value == autoSuggest.sentSearchStr) {
						var displayHTML = autoSuggest.getDisplayHTML();
						document.getElementById(autoSuggest.inputId+"_response").innerHTML = displayHTML;
						autoSuggest.registerEntites();
						if(autoSuggest.tags.length > 0) {
							document.getElementById(autoSuggest.inputId+"_response").style.cssText = autoSuggest.inputStyles;
						}
					}
				},
				event_onblur : function (e) {
					if(document.getElementById(this.id+"_response").getAttribute("style") != "display: none;") {
						autoSuggest.t = setTimeout ("autoSuggest.hideResponse();", autoSuggest.hideSpeed); //this gives	onclickEventEntity half sec. to do its work		
					}
				},
				event_onclickEntity : function (e) {
					clearTimeout(autoSuggest.t); //this gives this function some time to do its work
					var newId = document.getElementById(this.id).parentNode.getAttribute("id");
					autoSuggest.active = -1;
					autoSuggest.hideResponse();
					document.getElementById(autoSuggest.inputId).value = document.getElementById(this.id).innerHTML;
					autoSuggest.preSuggest = document.getElementById(this.id).innerHTML;
				},
				event_onclickSubmit : function (e) {
					document.getElementById("autoSuggestForm").setAttribute("action", "/news/yourView/gallery?tag="+document.getElementById(autoSuggest.inputId).value);
					return true;
				},
				event_onkeydown : function (e) {					
					var e = e || window.event;
					if (e.keyCode == 13) {
						document.getElementById("autoSuggestForm").setAttribute("action", "/news/yourView/gallery?tag="+document.getElementById(autoSuggest.inputId).value);
					}
				},
				event_onkeyup : function (e) {					
					clearTimeout(autoSuggest.t2); //kills the last call to doAjaxCall. user wants to add more chars so wait till they are done typing.
					var e = e || window.event;
					var inputText = document.getElementById(this.id).value;
					var responseDiv = document.getElementById(this.id+"_response");
					if(autoSuggest.isSafeKeyCode(e.keyCode) && inputText.length > autoSuggest.charsToStartCall) {					
						autoSuggest.t2 = setTimeout ("autoSuggest.doAjaxCall();", autoSuggest.hideSpeed); //this gives server a break so not to do call for every char typed		
					}					
					switch (e.keyCode) {
						 case 8: //backspace
							if(inputText.length > autoSuggest.charsToStartCall) {					
								//do nothing
							} else {
								autoSuggest.hideResponse();
							}
							break;	
						 case 40: //down arrow	
							if(inputText.length > autoSuggest.charsToStartCall) {
								var entityDivs = responseDiv.getElementsByTagName("div");
								var tempActive = autoSuggest.active+1;
								document.getElementById(this.id+"_response").style.cssText = autoSuggest.inputStyles;
								autoSuggest.active = -1;
								if(tempActive < entityDivs.length) { //highlight next item below
									autoSuggest.active = tempActive;
									autoSuggest.makeActive();
								} else if (tempActive == entityDivs.length) { //jump to begining
									autoSuggest.active = -1;
									document.getElementById(this.id).value = autoSuggest.preSuggest;
									autoSuggest.clearActive();
								}
							}
							break;
						 case 38: //up arrow	
							if(inputText.length > autoSuggest.charsToStartCall) {  
								var entityDivs = responseDiv.getElementsByTagName("div");
								var tempActive = autoSuggest.active-1;
								document.getElementById(this.id+"_response").style.cssText = autoSuggest.inputStyles;
								autoSuggest.active = -1;
								if(tempActive > -1) { //highlight next item above
									autoSuggest.active = tempActive;
									autoSuggest.makeActive();
								} else if (tempActive == -1) { //replace input with original value
									autoSuggest.clearActive();
									autoSuggest.active = autoSuggest.active-1;
									document.getElementById(this.id).value = autoSuggest.preSuggest;
		
								} else if (tempActive == -2) {//jump to end
									autoSuggest.active = entityDivs.length-1;
									autoSuggest.makeActive();
								}
							}
							break;		
						case 13: //enter	
							autoSuggest.active = -1;
							autoSuggest.hideResponse();
							autoSuggest.preSuggest = document.getElementById(this.id).value;
							document.getElementById("autoSuggestForm").setAttribute("action", "/news/yourView/gallery?tag="+document.getElementById(autoSuggest.inputId).value);
							return false;
							break;		
						 default:
					}
				},
				event_onmouseoverEntity : function (e) {
					var newId = document.getElementById(this.id).parentNode.getAttribute("id");
					autoSuggest.clearActive();
					document.getElementById(this.id).setAttribute("class", "suggestLink active");
					document.getElementById(this.id).className = "suggestLink active";	//ie friendly				
				},
				fixStyles : function () {
					document.getElementById("autoSuggest").parentNode.style.cssText = "overflow:visible;"; //otherwise autosuggest drop-down gets shy
				},
				getDisplayHTML : function () {
					var returnHTML = '';
					for(var i =0;i<this.tags.length;i++) {
						returnHTML += '<div class="suggestLink" id="suggestLink'+i+'">'+this.tags[i].tag+'</div>';
					}
					return returnHTML;
				},
				hideResponse : function () {
					document.getElementById(this.inputId+"_response").style.cssText = "display: none;";
				},
				init : function (sId) {
					this.charsToStartCall = this.charsToStartCall-1, //humans tend to start things at 1, computers it seems like things to start at 0
					this.inputId = sId;
					this.fixStyles();
					//lets register some events
					document.getElementById(this.inputId).onkeyup  = this.event_onkeyup; 
					document.getElementById(this.inputId).onblur = this.event_onblur;    
					document.getElementById(this.inputId+"_submit").onclick = this.event_onclickSubmit;  
					document.getElementById(this.inputId).onkeydown = this.event_onkeydown;
				},
				isSafeKeyCode : function (iKeyCode) {
					switch (iKeyCode) {
					       case 38: //up arrow  
					       case 40: //down arrow
					       case 37: //left arrow
					       case 39: //right arrow
					       case 33: //page up  
					       case 34: //page down  
					       case 36: //home  
					       case 35: //end                  
					       case 13: //enter  
					       case 9: //tab  
					       case 27: //esc  
					       case 16: //shift  
					       case 17: //ctrl  
					       case 18: //alt  
					       case 20: //caps lock
					       case 46: //delete
					        return false;
					        break;					
						   default:
   			           	  	return true;
					}

				},
				makeActive : function () {
					try {
						var responseDiv = document.getElementById(this.inputId+"_response");
						var entityDivs = responseDiv.getElementsByTagName("div");
						this.clearActive();
						entityDivs[this.active].setAttribute("class", "suggestLink active");
						entityDivs[this.active].className = "suggestLink active";
						document.getElementById(this.inputId).value = entityDivs[this.active].innerHTML;
					} catch (e) { //donothing
					}
				},
				registerEntites: function () {
					var responseDiv = document.getElementById(this.inputId+"_response");
					var entityDivs = responseDiv.getElementsByTagName("div");
					for(var i=0;i<entityDivs.length;i++) {
						entityDivs[i].onclick = this.event_onclickEntity;
						entityDivs[i].onmouseover = this.event_onmouseoverEntity;
					}
				},
				selectActive : function () {
					var responseDiv = document.getElementById(this.inputId+"_response");
					var entityDivs = responseDiv.getElementsByTagName("div");
					var activeDiv = null;
					for(var i=0;i<entityDivs.length;i++) {
						if(entityDivs[i].getAttribute("class") == "suggestLink active") {
							activeDiv = entityDivs[i];
						}
					}
					return activeDiv;
				}
};