/*  
 *             CREDITS
 *
 * 		AJAX Autocompleter - a server-powered autocompleting text fields
 *
 *				Part of
 *		IceCode - The Next Web Expression
 *
 *		Author  : Daniele Contarino
 *		Version : 1.00

 *		Contact : http://www.danielecontarino.it
 *
 */
 
function AjaxAutocompleter (inputText, listOption){

	this.inputText = inputText;
	this.listOption = listOption;
	this.searchPage;
	this.searchPageParams;
	this.minChars = 3;
	this.clearInputBox = true;
	this.ajaxRequest;
	this.result;
	this.lastChars = -1;
	this.lastNumResult = -1;
	this.waiting;
	this.waitingClassName = null;
	this.waitingMessage;
	this.currentItemSelected = -1;	

	//Disable the autocompler from browser
	if(document.getElementById(inputText) != null ) document.getElementById(inputText).setAttribute( "autocomplete","off" );
	
	this.setSearchpage = function(file, method, searchPageParams){
		this.ajaxRequest = new Ajax(file,method);
		this.searchPageParams = searchPageParams;
	}

	this.setWaiting = function (waiting, waitingMessage, waitingClassName){
		this.waiting = waiting;
		if(waiting) this.waitingMessage = waitingMessage;
		if(typeof waitingClassName != "undefined") this.waitingClassName = waitingClassName;

	}

	this.startSearch = function(event){
		this.checkObject();

		this.ajaxRequest.setConteiner(this.listOption);

		if( event.keyCode > 47 || event.keyCode == 8){
			if( this.inputText.value.length >= this.minChars ){ // && ((this.inputText.value.length > this.lastChars && this.lastNumResult > 0) || (this.inputText.value.length <= this.lastChars))
				if(typeof this.waitingMessage != "null" && typeof this.waitingMessage != "undefined") this.ajaxRequest.setWaiting(this.waiting, this.waitingMessage);

				var _self = this;
				this.ajaxRequest.setData(this.searchPageParams+"="+this.inputText.value );	
				this.ajaxRequest.onCompleteRequestFunction = function(){ _self.loadItem(); };

				this.ajaxRequest.sendRequest(true);

			}else{
				this.listOption.innerHTML = "";
				this.listOption.style.display = "none";
			}
		}
	}
	this.setSuggest = function(index){
		for(i = 0 ; i  < this.result[index].length; i++){
			if(this.result[index][i]['method'] == "value")			document.getElementById(this.result[index][i]['id']).value = this.result[index][i]['value'];
			else if(this.result[index][i]['method'] == "innerHTML")	document.getElementById(this.result[index][i]['id']).innerHTML = this.result[index][i]['value'];
		}
		
		if(this.clearInputBox) this.inputText.value = '';
		else this.inputText.value = trim(this.result[index]['label']);

		this.listOption.style.display = "none";
	}

	this.loadItem = function(){
		if(this.ajaxRequest.getResponse() != "FAIL" && this.ajaxRequest.getResponse() != ""){
			var xml = getXMLDOM(this.ajaxRequest.getResponse());
			this.result = new Array();
			var _self = this;
		
			//Clean listOption
			this.listOption.innerHTML = '';
			this.lock = true;
		
			this.lastNumResult = xml.documentElement.childNodes.length;

			for(i = 0 ; i  < xml.documentElement.childNodes.length; i++){
				this.result[i] = new Array();			

				var listItem = xml.documentElement.childNodes[i];
				var label  = getTextContent(listItem.getElementsByTagName("label")[0]);
				var outputs = listItem.getElementsByTagName("outputs")[0];

				this.result[i]['label'] = label;
				for(h = 0 ; h  < outputs.childNodes.length; h++){
					this.result[i][h] = new Array();
					this.result[i][h]['id'] = outputs.childNodes[h].attributes.getNamedItem('id').value;
					this.result[i][h]['value'] = outputs.childNodes[h].attributes.getNamedItem('value').value;
					this.result[i][h]['method'] = outputs.childNodes[h].attributes.getNamedItem('method').value;
				
				}
								
				var listItem = document.createElement('li');
				var anchorItem = document.createElement('a');
				anchorItem.setAttribute('href', '#'+i);
				anchorItem.setAttribute('id', i);
				anchorItem.onclick = function(event){ _self.setSuggest(this.id); };
				anchorItem.innerHTML = label

				listItem.appendChild(anchorItem);
				this.listOption.appendChild(listItem);
				this.currentItemSelected = -1;
			}

			if(this.result.length > 0) this.listOption.style.display = "block";
			else this.listOption.style.display = "none";	

		}else{
				this.listOption.innerHTML = "";
				this.listOption.style.display = "none";
		}

		this.lastChars = this.inputText.value.length;

	}

	this.navigator = function(event){
		this.checkObject();
		if ( this.inputText.getAttribute("disabled") == "disabled" || this.inputText.getAttribute( "readOnly" ) == "readOnly" ) return;
		//alert( event.keyCode );
		switch( event.keyCode ) {
			case 33: //keyCode.PAGE_UP:
				if(this.currentItemSelected > -1)  this.listOption.childNodes[this.currentItemSelected].className = "";
				this.listOption.childNodes[0].className = "listOptionHover";
				this.currentItemSelected = 0;
			break;

			case 34: //keyCode.PAGE_DOWN:
				if(this.currentItemSelected > -1)  this.listOption.childNodes[this.currentItemSelected].className = "";
				this.listOption.childNodes[this.listOption.childElementCount-1].className = "listOptionHover";
				this.currentItemSelected = this.listOption.childElementCount-1;
			break;

			case 38: //keyCode.UP
				if(this.currentItemSelected > 0) {
					this.listOption.childNodes[this.currentItemSelected].className = "";
					this.listOption.childNodes[--this.currentItemSelected].className = "listOptionHover";
				}

				event.preventDefault();
			break;

			case 40: //keyCode.DOWN
				if(this.currentItemSelected < this.listOption.childElementCount-1) {
					if(this.currentItemSelected > -1)  this.listOption.childNodes[this.currentItemSelected].className = "";
					this.listOption.childNodes[++this.currentItemSelected].className = "listOptionHover";
				}
				// prevent moving cursor to end of text field in some browsers
				this.inputText.focus(); 
				event.preventDefault();
			break;

			case 13: //keyCode.ENTER keyCode.NUMPAD_ENTER
				this.setSuggest(this.currentItemSelected);
				this.listOption.innerHTML = "";
				this.listOption.style.display = "none";
				this.inputText.focus(); 

				event.preventDefault();
				return;
				//passthrough - ENTER and TAB both select the current element

			case 27: //keyCode.ESCAPE
				this.listOption.innerHTML = "";
				this.listOption.style.display = "none";

				event.preventDefault();
				break;

			default:
			break;
		}
	}

	this.checkObject = function(){
		if( typeof this.listOption != "object" && typeof this.listOption != "null") this.listOption = document.getElementById(this.listOption);
		if( typeof this.waiting != "object" && typeof this.waiting != "null") this.waiting = document.getElementById(this.waiting);
		if( typeof this.waitingClassName != "null") this.waiting.setAttribute( "class", this.waitingClassName );

		if( typeof this.inputText != "object" && typeof this.inputText != "null") {
			this.inputText = document.getElementById(this.inputText);
			//Disable the autocompler from browser
			this.inputText.setAttribute( "autocomplete","off" );
		}
	}
}

/*

var suggest = new  AjaxAutocompleter ("searchFather", "listQuery");
suggest.setSearchpage("searchFather.php","GET","keyword");
suggest.minChars = 3;
.............

<input type='text' onkeydown="suggest.startSearch("suggest", waitingMessage )" id='searchFather' />
<ul id='listQuery'>

-----------
 <li onclick="suggest.setSuggest('uccello');" >
  <span class='title2'> This is  a <b> Bird </b>
 </li>  

-----------

</ul>


<listSuggest>
 <listItem>
  <label>
   <span class='title2'> This is  a <b> Bird </b>
  </label>
  <outputs>
   <output value='cod_1' id='idBird' />
   <output value='cod_spec_12' id='idSpecie' />
  </outputs>
 </listItem>
</listSuggest>

*/

