// JavaScript Document
// Author     : Gavin
// Create Date: 2006-06-25
var esOptionsArr = new Array();
var esLastValue  = '';
var esCurrentValueSelected = -1;
var esTheTextBox;
var esTheTextInput;
var esContainer;
var esUrlPrefix = genurl('ajax/search_user');
var esStr;
var	esLen;
var esIsonlyone;

function GE( idname ) {
	return document.getElementById(idname);
}
		
function GiveOptions() {
	var event 	 = arguments[0]||window.event;
  var intKey 	 = event.charCode||event.keyCode;
  esTheTextBox = arguments[0]?arguments[0].target:window.event.srcElement;
	
	esStr = esTheTextBox.value.split(';');
	esLen = esStr.length;
	
	if(esStr[esLen-1].length == 0){
		HideTheBox();
		esLastValue = '';
		return false;
	}

	if(intKey == 13){			
		GrabHighlighted();
		//esTheTextBox.blur();
		return false;
	}else if(intKey == 38){		
		MoveHighlight(-1);
		return false;
	}else if(intKey == 40){		
		MoveHighlight(1);
		return false;
	}
/*	
	if(esTheTextBox.value.indexOf(esLastValue)!=0 ||
		 esOptionsArr.length==0 ||
		 (esLastValue.length==0 && esTheTextBox.value.length>0) ||
		 (esTheTextBox.value.length<= esLastValue.length))
*/
	if (esTheTextBox.value != esLastValue)		 
	{
		//esLastValue = esTheTextBox.value;
		esLastValue = esStr[esLen-1];
		TypeAhead(esLastValue);
		BuildList(esLastValue);
		if ( $.browser.msie && $.browser.version==6.0 ) {
			$('.hiddenselect').css('visibility','hidden');
		}
	}else{		
		// BuildList(esTheTextBox.value);
		// esLastValue = esTheTextBox.value;
		BuildList(esStr[esLen-1]);
	}
}

function TypeAhead(xStrText) {

	//new a ajax helper object for ajax component
	var ajaxComponent = new Object();
	ajaxComponent.handleMessage = function(req){ //here can't use prototype way because ajaxComponent has been a "new" object.
		parseMessage( req );
	};
	
	ajaxComponent.handleError = function(req){
		alert("Problem: " + req.statusText);
	};
	
	var url = esUrlPrefix + encodeURI(xStrText);
	var ea = new EashowAjax(ajaxComponent, url, 'GET');
	if (xStrText != '') {
		ea.sendRequest();
	}
}

function parseMessage( req ) {
   
	var xmlDoc = req.responseXML.documentElement;
	
	var node = xmlDoc.getElementsByTagName('item');
	
	esOptionsArr = new Array();
	topsearchOptionsArr = new Array();
	
	for(var i=0;i<node.length;i++) {
		esOptionsArr[i]=node[i].firstChild.nodeValue;
	}
	
	// for top search
	if(is_top_search) {
		var i = 0;
		$(xmlDoc).find('item').each(function(){
			topsearchOptionsArr[i] = $(this).attr('url');
			i++;
	  });
	}
	
	//BuildList(esTheTextBox.value);
	BuildList(esStr[esLen-1]);
	//esLastValue = esTheTextBox.value;
}

function BuildList(theText) {
	
	//SetElementPosition();
	xPosElement = GE("esSpanOutput");
	xPosElement.style.display = "block";
	
	var inner = "";
			
	var theMatches = MakeMatches(theText);
	
	for(var i=0;i<theMatches.length;i++) {
	 inner +=theMatches[i];
	}
					
	if(theMatches.length>0){	
		GE("esSpanOutput").innerHTML = inner;
		GE("OptionsList_0").className ="esSpanHighElement";
		esCurrentValueSelected = 0;
	} else {
		HideTheBox();
	}
}
	
function SetElementPosition() {

	var selectedPosX = 0;
	var selectedPosY = 0;
	var theElement = esTheTextInput;

	if (!theElement) return;
	var theElemHeight = theElement.offsetHeight;
	var theElemWidth = theElement.offsetWidth;
	while(theElement != null) {
		selectedPosX += theElement.offsetLeft;
		selectedPosY += theElement.offsetTop;
		theElement = theElement.offsetParent;
	}
	xPosElement = GE("esSpanOutput");
	xPosElement.style.left = selectedPosX;
	
	xPosElement.style.width = theElemWidth;
	xPosElement.style.top = selectedPosY + theElemHeight
	xPosElement.style.display = "block";
}
	
		
var esCountForId = 0;
	
function MakeMatches(xCompareStr) {
	esCountForId = 0;
	var matchArray = new Array();
	
	for(var i=0;i<esOptionsArr.length;i++) {
		var regExp = new RegExp(xCompareStr,"ig");
		if((esOptionsArr[i].search(regExp))>=0) {			
			matchArray[matchArray.length]=CreateUnderline(esOptionsArr[i],xCompareStr,i);
		} else {
			continue;
		}
	}
	
	return matchArray;
}

var esUndeStart       = "<span class='esSpanMatchText'>";
var esUndeEnd         = "</span>";
var esSelectSpanStart = "<span style='width:100%;display:block;' class='esSpanNormalElement' onmouseover='SetHighColor(this)' ";
var esSelectSpanEnd   = "</span>";
	
function CreateUnderline(xStr,xTextMatch,xVal) {

	selectSpanMid = "onmousedown='SetText(" + xVal + ")'" + " id='OptionsList_" + esCountForId + "' theArrayNumber='"+ xVal +"'>";

	esCountForId++;
	
	var regExp = new RegExp(xTextMatch,"ig");
	
	var start = xStr.search(regExp);
	
	var matchedText = xStr.substring(start,start + xTextMatch.length);
	
	var Replacestr = xStr.replace(regExp,esUndeStart+matchedText+esUndeEnd);
	
	return esSelectSpanStart + selectSpanMid +Replacestr+ esSelectSpanEnd;
}
	
function SetHighColor(theTextBox) {
	if(theTextBox) {
		esCurrentValueSelected = theTextBox.id.slice(theTextBox.id.indexOf("_")+1, theTextBox.id.length);
	}
	for(var i = 0; i < esCountForId; i++) {
		GE('OptionsList_' + i).className = 'esSpanNormalElement';
	}
	GE('OptionsList_' + esCurrentValueSelected).className = 'esSpanHighElement';
}
	
function SetText(xVal) {
	//esTheTextBox = esTheTextInput;
	if ( esIsonlyone ) {
		esTheTextBox.value = esOptionsArr[xVal]; //set text value
	} else {
		var tmpstr='';
		
		if(esLen==1) {
			esTheTextBox.value = esOptionsArr[xVal] +';';
		} else {
			//esTheTextBox.value = '';
			var m;
			for(m=0;m<=esLen-2;m++) {
				tmpstr =tmpstr + esStr[m] + ';';
			}
			esTheTextBox.value = tmpstr +esOptionsArr[xVal] +';'; //set text value
		}
	}
	//esTheTextBox.value = esOptionsArr[xVal]; //set text value
	GE("esSpanOutput").style.display = "none";
	if ( $.browser.msie && $.browser.version==6.0 ) {
		$('.hiddenselect').css('visibility','visible');
	}
	esCurrentValueSelected = -1; //remove the selected index
	/*
	//esContainer
	var innerspan  = '<span class="x" onmouseout="this.className=\'x\'" onmouseover="this.className=\'x_hover\'" onclick="this.parentNode.parentNode.parentNode.parentNode.parentNode.token.remove(true); event.cancelBubble=true; return false;"></span>';
	var strhtml = '<a class="token" href="#" tabindex="-1"><span><span><span><span> ' +
						'<input type="hidden" value="200649118" name="kwids[]" fb_protected="true"/>' +
						'<input type="hidden" value="' + esOptionsArr[xVal] + '" name="names[]" fb_protected="true"/>' + esOptionsArr[xVal] +
						innerspan + 
					'</span></span></span></span></a>';
	esContainer.innerHTML = strhtml;
	*/
	$(esTheTextInput)[0].focus();
	
	// for top search
	if(is_top_search) {
		//var url = genurl('u/'+topsearchOptionsArr[xVal]);
		var url = topsearchOptionsArr[xVal];
		window.location.href = url;
	}
}
	
function GrabHighlighted() {
	if(esCurrentValueSelected >= 0){
		xVal = GE("OptionsList_" + esCurrentValueSelected).getAttribute("theArrayNumber");
		SetText(xVal);
		HideTheBox();
	}
}
	
function HideTheBox() {

	if ( $.browser.msie && $.browser.version==6.0 ){
		$('.hiddenselect').css('visibility','visible');
	}
	GE("esSpanOutput").style.display = "none";
	esCurrentValueSelected = -1;
}
	
function MoveHighlight(xDir) {
	if(esCurrentValueSelected >= 0){
		newValue = parseInt(esCurrentValueSelected) + parseInt(xDir);
		if(newValue > -1 && newValue < esCountForId){
			esCurrentValueSelected = newValue;
			SetHighColor (null);
		}
	}
}
	
function ReDraw() {
	//BuildList(esTheTextInput.value);
	BuildList(esStr[esLen-1]);
}


/*
 * define a javascript class, this is its constructor.
 * For using this class object, make sure define an outer Ajax Component(may be an object) "ajaxComponent",
 * which must has two methods: handleMessage(req) and handleError(req), 
 * for responsing handling successful message and error message.
 */
EashowAjax = function(ajaxComponent, url, method) {
  this.ajaxComponent = ajaxComponent;
  this.url = url;
  this.method = method ? method : "POST"; //default use "post" method
}

EashowAjax.prototype = {
  
	sendRequest: function() {
	  
		var req = this.initReqInstance();
		if(req){
			
			var oThis = this; //must declare a local reference to 'this' for closure
	
			req.onreadystatechange = function(){ //appoint callback function
	
				oThis.handleResponse(req);
			};
	    
			try {
				req.open(this.method, this.url, true);
				req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			} catch (e) {
				alert(e);
			}
			req.send(null);
		}
	}, //!Notice: shound be separated by ','

	initReqInstance: function(req){
   
		var req;
		if(window.XMLHttpRequest) { // Non-IE browsers
	
			req = new XMLHttpRequest();
			
		} else if (window.ActiveXObject) { // IE browsers
	
			try {
			 req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (err) {
			 req = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
	   
		return req;
	}, //!Notice: shound be separated by ','

	handleResponse: function(req){
   
		if (req.readyState == 4) { // Complete
		
		     if (req.status == 200) { // OK response
		
				this.ajaxComponent.handleMessage(req);
		     } else { // Error handling
				
				this.ajaxComponent.handleError(req);
		     }
		}
	} //the last key:value pair should not have ','

};
