if (typeof Xercel == "undefined" || ! Xercel) {
	Xercel = {};
}

// some key codes
var RETURN = 13;
var TAB = 9;
var ESC = 27;
var ARRLEFT = 37;
var ARRUP = 38;
var ARRRIGHT = 39;
var ARRDOWN = 40;
var BACKSPACE = 8;
var DELETE = 46;

var ROWS_CONT = 10;
	
function isGecko() {
	var ua = YAHOO.env.ua;
	return (ua.gecko && ua.gecko >= 1.8) || ua.webkit;
}


Xercel.AutoComplete = {

	DELAY : 120,
	TIMER_ID : Number,
	inputNode : null,
	acNode : null,
	ajax : null,

	close : function( event ) {
		event = event || window.event;
		var target = event.target || event.srcElement;
		target = target.nodeType == 3 ? target.parentNode : target;

	    if ( ! Xercel.AutoComplete.acNode.style.visibility && target != Xercel.AutoComplete.inputNode ) {
	        Xercel.AutoComplete.acNode.style.visibility = "hidden";
	    }
	},
	
	highlight : function(node, setValue) {
		var rows = Xercel.AutoComplete.acNode.rows;
		if (rows && rows.length > 1) {
			for (var i = rows.length - 1; i > 0; i = i - 1) {
				if (rows[i] == node) {
					rows[i].className = "ac_a";
					if (setValue) {
						Xercel.AutoComplete.setInputValue(node.cells[0].innerHTML);
					}
				} else {
					rows[i].className = "ac_i";
				}
			}
		}
	},
	
	switchUp : function() {
		var rows = Xercel.AutoComplete.acNode.rows;
		if (rows && rows.length > 1) {
			var found = 0;
			for (var i = rows.length - 1; i > 1; i = i - 1) {
				if (rows[i].className == "ac_a") {
					Xercel.AutoComplete.highlight(rows[i - 1], true);
					found = 1;
					break;
				}
			}
			
			if ( ! found) {
				Xercel.AutoComplete.highlight(rows[rows.length - 1], true);
			}
		}
	},
	
	switchDown : function() {
		var rows = Xercel.AutoComplete.acNode.rows;
		if (rows && rows.length > 1) {
			var found = 0;
			for (var i = 1; i < rows.length - 1; i = i + 1) {
				if (rows[i].className == "ac_a") {
					Xercel.AutoComplete.highlight(rows[i + 1], true);
					found = 1;
					break;
				}
			}
			
			if ( ! found) {
				Xercel.AutoComplete.highlight(rows[1], true);
			}
		}
	},
	
	keyDownHandler : function( event ) {
		event = event || window.event;
		var key = event.keyCode || event.which;
		
		switch ( key ) {
				case ARRUP :
					if ( ! Xercel.AutoComplete.TIMER_ID) {
						Xercel.AutoComplete.TIMER_ID = setInterval(Xercel.AutoComplete.switchUp, Xercel.AutoComplete.DELAY)
						return false;
					}
		      	case ARRDOWN :
					if ( ! Xercel.AutoComplete.TIMER_ID) {
			      		Xercel.AutoComplete.TIMER_ID = setInterval(Xercel.AutoComplete.switchDown, Xercel.AutoComplete.DELAY);
						return false;
					}
		}
		
		return true;
	},
	
	removeRows : function() {
		var rows = Xercel.AutoComplete.acNode.rows;
		if (rows && rows.length > 1) {
			for (var i = rows.length - 1; i > 0; i = i - 1) {
				var parentNode = rows[i].parentNode;
				parentNode.removeChild(rows[i]);
			}
		}
	},
	
	insertRow : function(value) {
		var parentNode =Xercel.AutoComplete.acNode.rows[0].parentNode;
		var cloneNode = Xercel.AutoComplete.acNode.rows[0].cloneNode(true);
		parentNode.appendChild(cloneNode);
		cloneNode.cells[0].innerHTML = value;
		cloneNode.style.display = "";
    	if ( Xercel.AutoComplete.acNode.style.visibility ) {
        	Xercel.AutoComplete.acNode.style.visibility = "";
        }
	},

	successHandler : function(response) {
		Xercel.AutoComplete.removeRows();
		if (response) {
			for (var i = 0; i < ROWS_CONT; i = i + 1) {
				var key = "m" + i;
				if (response[key]) {
					Xercel.AutoComplete.insertRow(response[key]);
				} else {
					break;
				}
			}
		}
	},
	
	keyUpHandler : function( event ) {
		event = event || window.event;
		var key = event.keyCode || event.which;
		var value = Xercel.Util.leftTrim( Xercel.AutoComplete.inputNode.value );
		
	    if ( value && value.length > 2 ) {
	        
	        switch ( key ) {
				case ARRUP :
					if (Xercel.AutoComplete.TIMER_ID) {
						clearInterval(Xercel.AutoComplete.TIMER_ID);
						Xercel.AutoComplete.TIMER_ID = null;
					}
					Xercel.AutoComplete.switchUp();
					return false;
		      	case ARRDOWN :
					if (Xercel.AutoComplete.TIMER_ID) {
						clearInterval(Xercel.AutoComplete.TIMER_ID);
						Xercel.AutoComplete.TIMER_ID = null;
					}
		      		Xercel.AutoComplete.switchDown();
					return false;
				case RETURN :
				case ESC :
					Xercel.AutoComplete.acNode.style.visibility = "hidden";
					break;
				case ARRLEFT :
				case ARRRIGHT :
//				case TAB :
//				case BACKSPACE :
//				case DELETE :
					break;
				default:
					Xercel.AutoComplete.ajax.send("searchWord=" + Xercel.AutoComplete.inputNode.value);
		    }
	        
	    } else if ( ! Xercel.AutoComplete.acNode.style.visibility) {
	        Xercel.AutoComplete.acNode.style.visibility = "hidden";
	    }
	    
	    return true;
	},
	
	setInputValue : function( value ) {
	    Xercel.AutoComplete.inputNode.value = value;
	    Xercel.AutoComplete.inputNode.focus();
	},
	
	init : function( inputNodeId, acNodeId, ajaxURL ) {
		Xercel.AutoComplete.ajax = new Xercel.Ajax("POST", ajaxURL, true, Xercel.AutoComplete.successHandler);
		Xercel.AutoComplete.inputNode = document.getElementById( inputNodeId );
		Xercel.AutoComplete.acNode = document.getElementById( acNodeId );
		Xercel.AutoComplete.acNode.style.visibility = "hidden";
	    var nodepos = Xercel.Util.getNodePosition( Xercel.AutoComplete.inputNode );
	    Xercel.AutoComplete.acNode.style.width = nodepos.width + "px";
	    Xercel.AutoComplete.acNode.style.left = nodepos.x + "px";
	    Xercel.AutoComplete.acNode.style.top = (nodepos.y + nodepos.height) + "px";
	    Xercel.AutoComplete.inputNode.onkeyup = Xercel.AutoComplete.keyUpHandler;
	    Xercel.AutoComplete.inputNode.onkeydown = Xercel.AutoComplete.keyDownHandler;
	    document.onclick = Xercel.AutoComplete.close;
	}

};

