function autoCompleter(elem,divname){
	
	var me = this;
	this.clearField = false;
	this.minLength = 1;
	this.maxLength = 2;
	this.regex = /^[a-zA-Z0-9][a-zA-Z0-9 ]?$/g;
	this.elem = document.getElementById(elem);
	this.highlighted = -1;
	this.arrItens = new Array();
	this.ajaxTarget = '_ac.php';
	this.chooseFunc = null;
	this.div = document.getElementById(divname);
	this.hideSelects = true;
	this.results = {};
	this.query_addon = '';
	this.div_hidden = true;
	this.acdb = false;
	//this.bodykeypress = document.getElementsByTagName('body')[0].onkeypress;

	var TAB = 9;
	var ESC = 27;
	var KEYUP = 38;
	var KEYDN = 40;
	var ENTER = 13;
	
	this.div.style.width = this.elem.style.width;
	
	me.elem.setAttribute("autocomplete","off");
	
	this.ajaxReq = createRequest();

	me.elem.onkeydown = function(ev)
	{
		if(me.div_hidden) return;
		var key = me.getKeyCode(ev);

		switch(key)
		{
			case TAB:
			case ENTER:			  
				if (me.highlighted.id != undefined){					
					me.acChoose(me.highlighted.id);
				}
				me.hideDiv();
				return false;
			break;

			case ESC:
				me.hideDiv();
				return false;
			break;

			case KEYUP:
				me.changeHighlight('up');
				return false;
			break;

			case KEYDN:
				me.changeHighlight('down');
				return false;
			break;
		}
		
	};
	
	this.setElemValue = function(){
		var a = me.highlighted.firstChild;
		me.elem.value = a.innerTEXT;
	}
	
	this.highlightThis = function(obj,yn){
		if (yn = 'y'){
			me.highlighted.className = '';
			me.highlighted = obj;
			me.highlighted.className = 'selected';
			
			me.setElemValue(obj);
			
		}else{
			obj.className = '';
			me.highlighted = '';
		}
	}
	
	this.changeHighlight = function(way){
		var _new_highlight;
		if (me.highlighted != '' && me.highlighted != null ){
			me.highlighted.className = '';
			switch(way){
				case 'up':
					if(me.highlighted.parentNode.firstChild == me.highlighted){
						_new_highlight = me.highlighted.parentNode.lastChild;
					}else{
						_new_highlight = me.highlighted.previousSibling;
					}
				break;
				case 'down':
					if(me.highlighted.parentNode.lastChild == me.highlighted){
						_new_highlight = me.highlighted.parentNode.firstChild;
					}else{
						_new_highlight = me.highlighted.nextSibling;
					}
				break;
				
			}			
			//me.highlighted.className = 'selected';
			//me.setElemValue();
		}else{
			switch(way){
				case 'up':
					_new_highlight = me.div.firstChild.lastChild;
				break;
				case 'down':
					_new_highlight = me.div.firstChild.firstChild;
				break;
				
			}
			//me.highlighted.className = 'selected';
			//me.setElemValue();
		}
		me.highlightThis(_new_highlight, 'y');
	}

	me.elem.onkeyup = function(ev) 
	{
		var key = me.getKeyCode(ev);
		switch(key)
		{
		
		case TAB:
		case ESC:
		case KEYUP:
		case KEYDN:
			return;
		case ENTER:
			return false;
			break;
		default:	
			me.ajaxReq.abort();
			if ((me.elem.value.length > 0 && me.acdb) || (me.elem.value.length >= me.minLength && me.elem.value.length <= me.maxLength && (!me.regex || me.elem.value.match(me.regex)))){
				if(me.results[me.elem.value]) {
					me.showResults(me.results[me.elem.value]);
				} else if (me.ajaxReq != undefined){
	
					me.ajaxReq.open("POST", me.ajaxTarget, true);
					me.ajaxReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
					me.ajaxReq.onreadystatechange = me.acResult;
					
					var param = 's=' + escape(me.elem.value) + me.query_addon;
					
					me.ajaxReq.send(param);
					
				}
			}else{
				return;	
			}
			me.highlighted = '';
		}
	};	

	me.elem.onblur = function() {
		me.hideDiv();
	}	

	this.acResult = function(){		
		if (me.ajaxReq.readyState == 4){
			
			var txtRes = me.ajaxReq.responseText;
			if (!txtRes) return false;
			
			var itens = txtRes.split('|||');
			var _k = itens.shift();
			me.results[_k] = itens;
			me.showResults(me.results[_k]);
		}
	}
	
	this.showResults = function(ar) {
			me.showDiv()
			var itens = ar;			
			var itCnt = itens.length;	
			
			me.div.innerHTML = '';
			var ul = document.createElement('ul');
			me.div.appendChild(ul);
			
			if (itCnt > 0){
				for (i=0; i<itCnt; i++){
					me.arrItens['acid'+i] = new Array();
					me.arrItens['acid'+i]['label'] = itens[i];
					
					var li = document.createElement('li');
					li.id = 'acid'+i;
					li.onmouseover = function(){ 
						this.className = 'selected';
						me.highlightThis(this,'y');
						/*document.getElementsByTagName('body')[0].onkeypress = function(ev) {
							if(me.getKeyCode(ev) == ENTER) {
								me.acChoose(this.id);
								me.hideDiv();
								return false;	
							}
						}*/
					}
					
					li.onmouseout  = function(){ 
						this.className = '';  
						me.highlightThis(this,'n');
						//document.getElementsByTagName('body')[0].onkeypress = me.bodykeypress;
					}
					li.onmousedown = function() {
						//document.getElementsByTagName('body')[0].onkeypress = me.bodykeypress;
						me.acChoose(this.id);
						me.hideDiv();
						return false;
					}
					
					var a = document.createElement('a');
					a.href = '#';
					a.onclick = function() { return false; }
					a.innerHTML = unescape(me.arrItens['acid'+i]['label']);
					a.innerTEXT = unescape(me.arrItens['acid'+i]['label']);
					li.appendChild(a);
					ul.appendChild(li);		
				}	
			}else{
				me.hideDiv();	
			}
	}
	
	this.acChoose = function (id){
		
		if (id != ''){
			if (me.chooseFunc != null){
				me.chooseFunc(id,unescape(me.arrItens[id]['label']));
			}
		}		

		me.hideDiv();
		if (this.clearField){
			me.elem.value = '';
		}else{
			me.elem.value = unescape(me.arrItens[id]['label']);	
		}
		
	}

	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.hideDiv = function(){
		
		me.highlighted = '';
		me.div.style.display = 'none';
		me.handleSelects('');
		me.div_hidden = true;
	
	}

	this.showDiv = function(){
		
		me.highlighted = '';
		me.positionDiv();
		me.handleSelects('none');
		me.div.style.display = 'block';
		me.div_hidden = false;
	}
	
	this.handleSelects = function(state){
		
		if (!me.hideSelects) return false;
		
		var selects	= document.getElementsByTagName('SELECT');
		for (var i = 0; i < selects.length; i++)
        {
            selects[i].style.display = state;
        }
	}
	
	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;
		}
	}
}

function createRequest() {
  try {
    request = new XMLHttpRequest();
  } catch (trymicrosoft) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (othermicrosoft) {
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        request = false;
      }
    }
  }

  if (!request)
    alert("Error initializing XMLHttpRequest!");
  else
  	return request;
}

autoCompleter_included = true;

function autoCompleter_load() {
	var ACs = {};
	var i;
	for(i = 1; i < 4; i++) {
		if(document.getElementById('aDiv'+i)) {
			ACs['a'+i] = new autoCompleter('artist'+i,'aDiv'+i);
			ACs['a'+i].query_addon = '&t=a';
		}
		if(document.getElementById('tDiv'+i)) {
			ACs['t'+i] = new autoCompleter('title'+i,'tDiv'+i);
			ACs['t'+i].query_addon = '&t=t';			
		}
	}
}