function SuggestionsTextBox_GetKeyCode(evt) {
	return document.layers ? evt.which : document.all ? event.keyCode :	document.getElementById ? evt.keyCode : 0;
}

function SuggestionsTextBox_CancelSubmission(evt) {						
	keyCode = SuggestionsTextBox_GetKeyCode(evt);
	if (keyCode == 13) {
		var nav = window.event ? false : true;
		if (nav) { //Netscape
			evt.returnValue = false;
			evt.cancel = true;
			evt.preventDefault();
		} else { //IE
			event.returnValue = false;
			event.cancel = true;
		}
	}
}


function SuggestionsTextBox_KeyPressHandler(evt, inputId, autoPostBack){
	keyCode = SuggestionsTextBox_GetKeyCode(evt);
	if (keyCode == 38){
		SuggestionsTextBox_ChangeHighlighted(inputId, -1);
	} else if (keyCode == 40){
		SuggestionsTextBox_ChangeHighlighted(inputId, 1);
	} else if (keyCode == 13 || keyCode == 9) {
		SuggestionsTextBox_SetSelected(inputId, autoPostBack, keyCode);
	}
}	

function SuggestionsTextBox_SetSelected (inputId, autoPostBack, keyCode) {
	div = document.getElementById(inputId + '_content');
	holder = div.firstChild;
	if ((div.style.display != 'none') && (holder.nodeName != 'DIV')) {
		divs = holder.childNodes;
		if (divs.length > 0) {
			i = 0;
			end = false;
			input = document.getElementById(inputId);
			hiddInput = document.getElementById(inputId + '_hidd');
			while (i < divs.length && !end) {
				if (divs[i].className == 'GridSelectedItem') {
					s = divs[i].innerHTML;
					input.value = s;
					hiddInput.value = divs[i].getAttribute('code');
					div.style.display = 'none';
					end = true;
					if (autoPostBack) {
						__doPostBack(hiddInput.name.replace('/:/g' ,'$'), '');
					}
				} else {
					i++;
				}
			}
		}
	} else if (keyCode != 9) {
		input.value = '';
		hiddInput.value = '';
		div.style.display = 'none';
	}
}

function SuggestionsTextBox_ChangeHighlighted(inputId, selection) {
	div = document.getElementById(inputId + '_content');
	holder = div.firstChild;
	if ((div.style.display != 'none') && (holder.nodeName != 'DIV')) {
		divs = holder.childNodes;
		if (divs.length > 0) {
			i = 0;
			end = false;
			selection = selection == -1 ? divs.length - 1 : selection;
			input = document.getElementById(inputId);
			while (i < divs.length && !end) {
				if (divs[i].className == 'GridSelectedItem') {
					divs[i].className = 'GridItem' + (i%2 + 1);
					j = (i + selection)%divs.length;
					divs[j].className = 'GridSelectedItem';
					end = true;
				} else {
					i++;
				}
			}
			if (!end) {
				if (selection == 1) {
					divs[0].className = 'GridSelectedItem';
				} else {
					divs[divs.length - 1].className = 'GridSelectedItem';
				}
			}
		}
	}
}

function SuggestionsTextBox_ItemClicked(inputId, clickedDiv) {
	input = document.getElementById(inputId);
	hiddInput = document.getElementById(inputId + '_hidd');
	s = clickedDiv.innerHTML;
	input.value = s;
	hiddInput.value = clickedDiv.getAttribute('code');
	div = document.getElementById(inputId + '_content');
	div.style.display = 'none';
}	

function SuggestionsTextBox_FocusOut(inputId, inputValue, autoPostBack) {						
	input = document.getElementById(inputId);
	hiddInput = document.getElementById(inputId + '_hidd');
	div = document.getElementById(inputId + '_content');
	holder = div.firstChild;
	if (holder) {
		if (holder.nodeName != 'DIV'){
			if (div.style.display != 'none'){
				divs = holder.childNodes;
				if (divs.length == 1) {
					s = divs[0].innerHTML;
					input.value = s;
					hiddInput.value = divs[0].getAttribute('code');
				} else {
					input.value = '';
					hiddInput.value = '';
				}
			}
		} else {
			input.value = '';
			hiddInput.value = '';
		}
		window.setTimeout('SuggestionsTextBox_HideSuggestion("' + input.id + '",' + autoPostBack + ')', 100);
	} else if (input.value.replace(/\b/g,'') == '') {
		input.value = '';
		hiddInput.value = '';
	}
}


function SuggestionsTextBox_HideSuggestion(inputId, autoPostBack) {
	div = document.getElementById(inputId + '_content');
	div.style.display = 'none';
	if (autoPostBack) {							
		input = document.getElementById(inputId);
		if (input.value.replace(/\b/g,'') != '') {
			hiddInput = document.getElementById(inputId + '_hidd');
			__doPostBack(hiddInput.name.replace('/:/g' ,'$'), '');
		}
	}
}


function SuggestionsTextBox_Change(evt, inputId, inputValue) {						
	keyCode = SuggestionsTextBox_GetKeyCode(evt);
	if (keyCode > 45 || keyCode < 9) {
		eval('var_' + inputId + '.provider.requestSuggestions(var_' + inputId + ');');
	}
}


/* ------------------------ */

function SuggestionsTextBox(oTextbox, oTextbox_Hidden, oDiv, oProvider, iMaxSuggestions) {
    this.provider /*:SuggestionProvider*/ = oProvider;
    this.textbox /*:HTMLInputElement*/ = oTextbox;
	this.div    /*:HTMLDivElement*/ = oDiv;
    this.hidden /*:HTMLInputElement*/ = oTextbox_Hidden;
	this.maxSuggestions /*int*/ = iMaxSuggestions;
};


SuggestionsTextBox.prototype.suggest = function (aSuggestions /*:Array*/) {
    //make sure there's at least one suggestion
    if (aSuggestions.length > 0) {
        this.buildSuggestions(aSuggestions);
    } else {
		this.hidden.value = '';
		this.div.innerHTML = '<div style="width:100%" class="GridItem1">No se encontraron resultados</div>';
	}
	this.div.style.display = '';
};

SuggestionsTextBox.prototype.buildSuggestions = function (aSuggestions /*:Array*/) {
	var s = '<a href="javascript:void(0)" style="text-decoration:none" class="Normal">';
	var alternate = 0;
	var num = 0;
	var sug;
	for (var i=0; i < aSuggestions.length && i < this.maxSuggestions; i++) {
		num = alternate + 1;
		sug = aSuggestions[i];
		s += "<div style='width:100%' class='GridItem" + num + "' onMouseDown=\"SuggestionsTextBox_ItemClicked('"+ this.textbox.id + "',this)\"" + " code='" + sug[0] + "'>";
		s += sug[1];
		s += "</div>"
		alternate = 1 - alternate;	
	}
	s += '</a>';
	this.div.innerHTML = s;
}

/* ------------------------ */

/* Helper functions */
function SuggestionsTextBox_AddEvent(obj, evType, fn){ 
	if (obj.addEventListener){ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	} else if (obj.attachEvent){ 
		var r = obj.attachEvent('on' + evType, fn); 
		return r; 
	} else { 
		return false; 
	} 
}

function SuggestionsTextBox_RequestSuggestions(oSuggestionsTextBox, classObject) {
	var aSuggestions = [];
	var sTextboxValue = oSuggestionsTextBox.textbox.value;
	var end = false;
	if (sTextboxValue.length > 0){
	    if (sTextboxValue.length > 2){
		    var itemsKeys = classObject.items.keys();
		    for (var i=0; i < itemsKeys.length; i++) { 
			    itemKey = itemsKeys[i];
			    if (classObject.items.get(itemKey).toUpperCase().indexOf( sTextboxValue.toUpperCase() ) >= 0) {
				    aSuggestions.push([itemKey, classObject.items.get(itemKey)]);
			    }
		    }
		    oSuggestionsTextBox.suggest(aSuggestions);
		}
	} else {
		oSuggestionsTextBox.div.style.display = 'none';
		oSuggestionsTextBox.textbox.value = '';
		oSuggestionsTextBox.hidden.value = '';
	}
}







