var lookupTimer = null;
var optionIndex = -1;

function getRowFromEvent(e){
	var targ = null;
	if (!e){ var e = window.event;}
	if (e.target){ targ = e.target;}
	else if (e.srcElement){ targ = e.srcElement;}
	if (targ.nodeType == 3){ targ = targ.parentNode;}
	
	if(targ.tagName.match("TD"))
		targ = targ.parentNode;
	else if(targ.tagName.match("SPAN"))
		targ = targ.parentNode.parentNode;
		
	return targ;
}
/** **/
function splitByRange(obj){
	var value = obj.value;
	var start=0,end=0;
	if(document.selection) {
		var txtRange = document.selection.createRange();
		var tmpRange = txtRange.duplicate();
		if(txtRange.parentElement() == obj){
			end=value.length;
			while(tmpRange.moveEnd("character")==1)end--;
			start = end - txtRange.text.length;
		}
	} else if(typeof(obj.selectionStart) != 'undefined') { 
		start=obj.selectionStart,end=obj.selectionEnd; 
	} else {
		return value;
	}
	if(start==end && start==0) return value;
	var pos = (start<end)?start:end;
	return value.substr(0,pos)+","+value.substr(pos);
}

/** Function to Highlight the Query Keywords in auto completion */
function getFormatedText(suggestion,queryArray){
	var formattedSuggestion = suggestion;
	for(var i= queryArray.length-1;i>-1;i--){
	  var start = formattedSuggestion.toLowerCase().indexOf(queryArray[i].toLowerCase());
	  if(start == -1) continue;
	  var match = formattedSuggestion.substr(start,queryArray[i].length);
	  formattedSuggestion = formattedSuggestion.replace(match,match.bold());
	}
	return formattedSuggestion;
}

/** For all sorts of key Hanlding*/
var key;
function keyGrab(event){
	if (!event && window.event) event = window.event;
	if (event) key = event.keyCode;
	else key = event.which;
}

/** Actual Pattern Matching Function */
function lookup(place,placeList,nodeToAppend,mouseDownHandler,mouseUpHandler,mouseOverHandler){
	var keywords = place.split(/[ ,]/);
	var filteredArray = placeList;
	for(var i=keywords.length-1;i>-1;i--){
	    var keyword = keywords[i];
	    if(keyword.length == 0) continue;
	    var filteredArray = filteredArray.filter(function(element,index,array){
		var matchRegExp = new RegExp(keyword,"gi");
		return (element.search(matchRegExp) != -1);
	    });
	}
//	filteredArray.sort(function(a,b){
//		return (a.indexOf(keywords[0])-b.indexOf(keywords[0]));
//	});

	if(filteredArray != null && filteredArray.length >0){
		var suggestTable = document.createElement("table");
		suggestTable.setAttribute("cellpadding","2");
		suggestTable.setAttribute("cellspacing","0");
		suggestTable.setAttribute("border","0");
		var l = filteredArray.length;
		if(l>10) l=10;
		for(var i=0;i<l;i++){
			var newRow = suggestTable.insertRow(-1);
			var newCell = newRow.insertCell(0);
			var newOption = document.createElement("span");
			newOption.innerHTML = getFormatedText(filteredArray[i],keywords);
			newCell.appendChild(newOption);
			if(i%2 == 0) newRow.setAttribute("class","even");
			else newRow.setAttribute("class","odd");
			newRow.index = i;
			if(mouseDownHandler)
				addEvent(newRow,"mousedown",mouseDownHandler);
			if(mouseUpHandler)
				addEvent(newRow,"mouseup",mouseUpHandler);
			if(mouseOverHandler)
				addEvent(newRow,"mouseover",mouseOverHandler);
		}
		
		var resultSpan = $(nodeToAppend);
		clearSuggestions(nodeToAppend);
		resultSpan.appendChild(suggestTable);
		resultSpan.style.display = '';
	}
	else {
		clearSuggestions(nodeToAppend);
		return false;
	}
}

function setSuggestion(suggestNode,comboBox){
	if(typeof(suggestNode.innerText) != 'undefined')
		$(comboBox).value = suggestNode.innerText;
	else if(typeof(suggestNode.textContent) != 'undefined')
		$(comboBox).value = suggestNode.textContent;
	else return "";
	return $(comboBox).value;
}

/** Functions that selects an option from the suggest-menu and sets its to the combo box */
function highlightOption(resultNode,comboBox){
	var optionsArray = $(resultNode).getElementsByTagName("tr");
	if(optionIndex > optionsArray.length-1)
		optionIndex -= (optionsArray.length);
	if(optionIndex < 0)
		optionIndex += (optionsArray.length)
	
	for(var i=optionsArray.length-1;i>-1;i--)
		removeClass(optionsArray[i],"selected");
	
	if(optionIndex > -1 && optionIndex < optionsArray.length){
		addClass(optionsArray[optionIndex],"selected");
		return setSuggestion(optionsArray[optionIndex].firstChild.firstChild,comboBox);
	}else return "";
}

function clearSuggestions(resultNode){
	var resultSpan = $(resultNode);
	while(resultSpan.hasChildNodes())
		resultSpan.removeChild(resultSpan.lastChild);
	resultSpan.style.display = 'none';
	optionIndex = -1;
}






