var alertarTodo=false;
var textFields=[];
var parentDivs=[];
var highItem=[];
var elementCount=0;
var inited=false;
var hasContent=[];
var linesAmt=[];
var texts=[];
var prevSug=-1;
var dontShow=[];
var banned=[];
var paramLeft;
var paramTop;
var timeOut=0;
var submitAction=[];
var lineHeight=19;
var footerHeight=23;
var linesMax=6;
var footerOffset=0;

function registerTextField(textField,parentDiv,action){
	registerTextField(textField,parentDiv,null,null,action);
}

function registerTextField(textField,parentDiv,left,action){
	registerTextField(textField,parentDiv,left,null,action);
}

function registerTextField(textField,parentDiv,left,top,action){
	textFields[elementCount]=textField;
	parentDivs[elementCount]=parentDiv;
	paramLeft=left;
	paramTop=top;
	createHiddenDiv(parentDiv,textField);
	prepareTextField(textField);
	highItem[elementCount]=-1;
	hasContent[elementCount]=false;
	linesAmt[elementCount]=0;
	dontShow[elementCount]=false;
	banned[elementCount]=false;
	submitAction[elementCount]=action;
	elementCount++;
}

function createHiddenDiv(parentDiv,textField){
	var width=textField.offsetWidth;
	var top=paramTop!=null?paramTop:V(textField,"offsetTop")+textField.offsetHeight-1;
	var left=paramLeft!=null?paramLeft:V(textField,"offsetLeft");
	var hidden=document.createElement('div');
	hidden.id="mlsug_"+elementCount;
	hidden.className="hidden";
	setStyle(hidden,'top',(top+1)+'px');
	setStyle(hidden,'width',width+'px');
	setStyle(hidden,'left',left+'px');
	setStyle(hidden,'height',0+'px');
	parentDiv.appendChild(hidden);
	for(i=0;i<linesMax;i++){
		var row = document.createElement('div');
		row.className = "rowa";
		setStyle(row,'height',lineHeight+'px');
		row.id = "sug_row_"+elementCount+"_"+i;
		row.sugNumber = elementCount;
		row.num = i;
		row.onmouseover=highlightRow;
		row.onmousedown=processClick;
		hidden.appendChild(row)
	}
	var row = document.createElement('div');
	row.className = "rowc";
	//setStyle(row,'height',lineHeight+'px');
	row.id = "sug_row_"+elementCount+"_close";
	row.sugNumber = elementCount;
	row.innerHTML="<div class='rowd'></div><span>Não mostrar sugestões</span>";
	row.onmousedown=ban;
	hidden.appendChild(row)
}

function ban(e){
	if (!e) e= event;
	var div=srcElement(e);
	if(div.className != "rowc"){
		var sugNum = div.offsetParent.sugNumber;
	}else{
		var sugNum = div.sugNumber;
	}
	banned[sugNum]=true;
	textFields[sugNum].focus();
	dehighlightRowByNum(sugNum,highItem[sugNum]);
	highItem[sugNum]=-1;
	textFields[sugNum].value=textFields[sugNum].origVal;
}

function V(a,b){
	var d=0;
	while(a){
		d+=a[b];
		a=a.offsetParent
	}
	return d
}

function prepareTextField(textField){
	textField.setAttribute("autocomplete","off");
	textField.onkeyup = processKey;
	textField.onkeypress = processTab;
	textField.onblur = blurHide;
	textField.sugNumber = elementCount;
	textField.origVal = "";
}

function highlightRow(e){
	if (!e) e= event;
	var row=srcElement(e);
	dehighlightRowByNum(row.sugNumber,highItem[row.sugNumber]);
	if(row.className=="rowa")
	row.className="rowb";
	highItem[row.sugNumber]=row.num;
} 

function highlightRowByNum(sugNum,num){
	var row=document.getElementById("sug_row_"+sugNum+"_"+num);
	if(row.className=="rowa")
	row.className="rowb";
	highItem[row.sugNumber]=row.num;
} 

function dehighlightRow(e){
	if (!e) e= event;
	var row=srcElement(e);
	if(row.className=="rowb")
	row.className="rowa";
}

function dehighlightRowByNum(sugNum,num){
	var row=document.getElementById("sug_row_"+sugNum+"_"+num);
	if(row!=null){
		if(row.className=="rowb")
		row.className="rowa";
	} 
}

function processClick(e){
	if (!e) e= event;
	
	if(srcElement(e).className == "rowb"){
		var sugNumber=srcElement(e).sugNumber;
		
	}else{	
		var classN="";
		var i=0;
		var div = srcElement(e);
		while(classN!="rowb"&&i<10){
			div=div.offsetParent;
			classN = div.className;
			var sugNumber = div.sugNumber;	
			i++;
		}
	}
	processSelected(sugNumber);
	submit(sugNumber);
}

function processSelected(sugNum){
	var divToKill=document.getElementById("mlsug_"+sugNum);
	if(divToKill != null){
		var row = document.getElementById("sug_row_"+sugNum+"_"+highItem[sugNum]);
		if(row!=null){
			textFields[sugNum].value=row.innertxt;
		}
		hidden(divToKill);
		hideRows(0,sugNum);	
	}
}

function submit(sugNum){
	submitAction[sugNum]();
}

function processTab(e){
	if (!e) e= event;
	var sugNum=srcElement(e).sugNumber;
	var key=keyCode(e);
	if(key==9 && !banned[sugNum]){
		processSelected(prevSug);
		dontShow[prevSug]=true;
		search(trim(textFields[prevSug].value),prevSug);
	}
}

function processKey(e){
	if (!e) e= event;
	var txf=srcElement(e);
	var sugNum=txf.sugNumber;
	var key=keyCode(e);
	var div=document.getElementById("mlsug_"+sugNum);
	var val = txf.value.toUpperCase();
	var tVal = trim(txf.value);
	if(key==9){
		dontShow[prevSug]=true;
		hidden(div);
		hideRows(0,sugNum);
	}else if(key==13 && div!=null){
		if(isVisible(div)){
			processSelected(sugNum);
			submit(sugNum);
		}else{
			submit(sugNum);
		}
	}else if(key==27 && div!=null && !banned[sugNum]){
		txf.value=txf.origVal;
		dehighlightRowByNum(sugNum,highItem[sugNum]);
		highItem[sugNum]=-1;
		hidden(div);
		hideRows(0,sugNum);
	}else if(key==38 && div!=null && hasContent[sugNum]){	
		banned[sugNum]=false;
		if(!isVisible(div)){
			txf.origVal=txf.value;
			if(texts[val]!=undefined && texts[val]!=''){
				visible(div);
				visibleRows(sugNum);
			}else{
				dehighlightRowByNum(sugNum,highItem[sugNum]);
				highItem[sugNum]=-1;
				sendRequest(val,sugNum);
				return;
			}
		}
		dehighlightRowByNum(sugNum,highItem[sugNum]);
		highItem[sugNum]--;
		if(highItem[sugNum]==-1){
			txf.value=txf.origVal;
		}
		if(highItem[sugNum]<-1){
			highItem[sugNum]=linesAmt[sugNum]-1;
		}
		if(highItem[sugNum]!=-1){
			highlightRowByNum(sugNum,highItem[sugNum]);
			var row = document.getElementById("sug_row_"+sugNum+"_"+highItem[sugNum]);
			textFields[sugNum].value=row.innertxt;
		}
	}else if(key==40 && div!=null && hasContent[sugNum]){
		banned[sugNum]=false;
		if(!isVisible(div)){
			txf.origVal=txf.value;
			if(texts[val]!=undefined && texts[val]!=''){
				visible(div);
				visibleRows(sugNum);
			}else{
				dehighlightRowByNum(sugNum,highItem[sugNum]);
				highItem[sugNum]=-1;
				sendRequest(val,sugNum);
			}
		}
		dehighlightRowByNum(sugNum,highItem[sugNum]);
		if(isVisible){
			highItem[sugNum]++;
		}
		if(highItem[sugNum]>=linesAmt[sugNum]){
			highItem[sugNum]=-1;
			txf.value=txf.origVal;
		}
		if(highItem[sugNum]!=-1){
			highlightRowByNum(sugNum,highItem[sugNum]);
			var row = document.getElementById("sug_row_"+sugNum+"_"+highItem[sugNum]);
			if(isVisible(div)){
				textFields[sugNum].value=row.innertxt;
			}
		}
	}else if(!banned[sugNum]){
		clearTimeout(timeOut);
		timeOut = setTimeout('triggerFetch('+sugNum+')',300);
	}
	prevSug=sugNum;
	dontShow[sugNum]=false;
}

function triggerFetch(sugNum){
	var txf=textFields[sugNum];
	var div=document.getElementById("mlsug_"+sugNum);
	var val = txf.value.toUpperCase();
	var tVal = trim(txf.value);
	if(val != null && val != undefined && tVal != "" ){
		txf.origVal=txf.value;
		if(texts[val]==undefined){
			dehighlightRowByNum(sugNum,highItem[sugNum]);
			highItem[sugNum]=-1;
			sendRequest(val,sugNum);
		}else{
			autoSugShow({exp:val,num:sugNum,txt:texts[val]});
		}
	}else{
		hasContent[sugNum]=false;
		hidden(div);
		hideRows(0,sugNum);
	}
}

function trim(str){
	var trimmed = str.replace(/^\s+|\s+$/g, '') ;
	return trimmed;
}

function search(val,sugNum){
	if(texts[val]==undefined){
		sendRequest(val,sugNum);
	}else{
		innerShow({exp:val,num:sugNum,txt:texts[val]});
	}
}

function blurHide(e){
	if (!e) e= event;
	var num=srcElement(e).sugNumber;
	var div=document.getElementById("mlsug_"+num);
	hidden(div);
	hideRows(0,num);
}

function sendRequest(text,sugNum){
	var values = new Object();
	values.num = sugNum;
	var a=document.createElement("script");
	a.src="http://suggest.mlapps.com/jm/ml.search.autosuggest.servlet.AutoSuggestController?q="+escape(text)+"&l=MLB&n="+sugNum+"&v=5";
	var d=document.getElementsByTagName("head")[0];
	d.appendChild(a);
}

function innerShow(values){
	var num = values.num;
	var exp = values.exp;
	texts[exp] = values.txt;
	if(exp==textFields[num].value.toUpperCase()){
		linesAmt[num] = values.txt.length;
		if(linesAmt[num]>0){
			var div = document.getElementById("mlsug_"+num);
			for(var i=0;i<linesAmt[num];i++){
				var row = document.getElementById("sug_row_"+num+"_"+i);
				var text = values.txt[i].replace(/\|/g,"");
				text = text.replace(/\¬/g,"");
				var lookText = values.txt[i].replace(/\|/g,"<span class='highText'>");
				lookText = lookText.replace(/\¬/g,"</span>");
				lookText = "<span class='row_text'>"+lookText+"</span>";
				row.innerHTML = lookText;
				row.innertxt=text;
			}
			hideRows(linesAmt[num],num);
			hasContent[values.num]=true;
		}	
	}
}

function autoSugShow(values){
	innerShow(values);
	var num = values.num;
	if(values.exp==textFields[num].value.toUpperCase()){
		if(!dontShow[num]){
			linesAmt[num] = values.txt.length;
			var div = document.getElementById("mlsug_"+num);
			if(linesAmt[num]>0 && div!=null){
				var row;
				for(var i=0;i<linesAmt[num];i++){
					row = document.getElementById("sug_row_"+num+"_"+i);
					visible(row);
				}	
				var top	= -((linesMax-linesAmt[num])*lineHeight);
				row = document.getElementById("sug_row_"+num+"_close");
				setStyle(row,'top',top+footerOffset+'px');
				setStyle(div,'height',(lineHeight*(linesAmt[num])+footerHeight+footerOffset)+'px');
				visible(row);
				visible(div);
			}else{
				if(div!=null){
					hidden(div);
					hideRows(0,num);
				}
			}
		}
	}
}

function visible(div){
	setStyle(div,'visibility','visible');
}

function isVisible(div){
	return div.style.visibility=="visible";
}

function visibleRows(num){
	for(var i=0;i<linesAmt[num];i++){
		var row = document.getElementById("sug_row_"+num+"_"+i);
		visible(row);
	}
	var row = document.getElementById("sug_row_"+num+"_close");
	visible(row);
}


function hideRows(from,num){
	for(var i=from;i<linesMax;i++){
		var row = document.getElementById("sug_row_"+num+"_"+i);
		hidden(row);
	}
	var row = document.getElementById("sug_row_"+num+"_close");
	hidden(row);
}

function hidden(div){
	setStyle(div,'visibility','hidden');
}

function srcElement(e){
	return e.srcElement? e.srcElement : e.target;
}

function keyCode(e){
	var key;
	if (e.which == null)
     		key= e.keyCode;
  	else if (e.which > 0)
     		key= e.which;
     	return key;
}

function setStyle(div,prop,value){
	div.style[prop]=value;
}
