var collector = new Array();									// Main array for multi control

function Register(input)
{	
	collector[input.id] = null;
	input.setAttribute("autocomplete", "off");			// Set Auto Complete to Off

	input.onblur = function(e) {										// Set default value	
		AjaxBlur(e);
	}
	input.onkeyup = function(e) {	// Launch Ajax Server call
		AjaxEvent(e);																			// Search Data
	}
	input.onkeydown = function(e) {									// Launch Ajax Server call
		AjaxBegin(e);																			// For Navigation Only
	}
}

function AjaxBegin(e) {
	var txtBox = null;													// Main Textbox
  
	if (!e) {																		// Catch Event
		var e = window.event;											// For Internent Explorer
		txtBox = e.srcElement;
	} else {																		// For other browser
		txtBox = e.target;
	}

	var obj = collector[txtBox.id];	
	var keyCode = e.keyCode;											// Catch keyCode value

	if (obj == null) {													// If obj is null
		obj = new AjaxTextbox(txtBox);												
		collector[txtBox.id] = obj;		
		obj.Register();
	} 

	var move = IsSelectionKey(keyCode);
	if(move != 0) {
		var obj = collector[txtBox.id];								// Catch the main Textbox
		if(obj != null) {
			if(obj.Inline() == true) {
				obj.MoveTo(move);	
			}
		}
	}
}



function AjaxEvent (e) {								// Main Entry
	var txtBox = null;													// Main Textbox
									
	if (!e) {																		// Catch Event
		var e = window.event;											// For Internent Explorer
		txtBox = e.srcElement;
	} else {																		// For other browser
		txtBox = e.target;
	}

	var obj = collector[txtBox.id];								// Catch the main Textbox
  var keyCode = e.keyCode;											// Catch keyCode value

	if (obj == null) {
		return -1;
	}

	if (obj.AwaitingRequest) {										// If Awaiting Query Wait 
		setTimeout("AjaxEvent(e, keyUp)", 200);							// Try Later
		return;
	}

	var valeur = txtBox.value;
  valeur = valeur.replace(" ","");
	
	if (valeur == "") {
		obj.HidePanel();
		obj.ResetState(true);
	} else if (obj.GetSearchValue() != txtBox.value.toLowerCase()) {
		obj.Search();
	} 
}

function AjaxBlur(e) {													// Onblur
	var txtBox = null;														// Retrieve main textbox object
	if (!e) {
		var e = window.event;												// With Internet Explorer
		txtBox = e.srcElement;
	} else {
		txtBox = e.target;													// With other browser
	}
	var obj = collector[txtBox.id];								// Retrieve Object
	if (obj != null) {														// If Object is not null
		var senderId = document.getElementById(txtBox.id + "Id");
    
		var before = senderId.value;			// Before Render
		obj.Render();											
		var after = senderId.value;				// After Render

		var follow = txtBox.getAttribute("FollowUp");	
		if (follow != null && before != after) {							// Onchange + Event
			follow = follow.replace("_id", txtBox.id + "Id");
			eval(follow);
		}
	}
}

function AjaxMoveById(textBoxId, curItem) {
	var obj = collector[textBoxId];								// Catch the main Textbox
	if(obj != null) {
		if(obj.Inline() == true) {
			obj.MoveToById(textBoxId + "" + curItem);	
		}
	}
}

function AjaxTextbox(sender) {
	var _sender = sender;																			 // Textbox sender object
	var _senderId = document.getElementById(sender.id + "Id"); // Textbox sender Id Object
	var _lookup = _sender.getAttribute("Lookup");							 // Server Method Url Request
	var _cache = new Array();																	 // Array for cache 
	var _div= null;																						 // HTML Div for display Result
	var _iframe = null;																				 // iframe for bypass ComboBox
	var _inline = false;																				// If div is visible or not visiable

	var _selectedValue = "";	// Current Selected Value
	var _selectedId = "";			// Current Selected Id
	var _searchValue = "";		// Last Search Value
	var _objSelected = null;	// Current Object selected

	var _nbItem = 0;
	var _curItem = 0;

	this.Register = Register;
	this.Render = Render;
	this.ResetState = ResetState;
	this.Search = Search;
	this.GetSearchValue = GetSearchValue;
	this.HidePanel = HidePanel;
	this.MoveTo = MoveTo;
	this.MoveToById = MoveToById;
	this.Inline = Inline;
	

	function Register() {
		_selectedValue = _sender.value;
		_selectedId = _senderId.value;
		_searchValue = SetSearchValue();
	}

	function Render() {
		if(_selectedValue != "") {
			_sender.className = _sender.className.replace(" AjaxRequired","");
			_sender.value = _selectedValue;
			_senderId.value = _selectedId;
		} else {
			_sender.value = "";
			_senderId.value = "";			
		}
		Register();
		HidePanel();
	}
	

	function Inline() {
		return _inline;
	}

/*
	function Search() {
		_searchValue = SetSearchValue();
		var result = ReadFromCache(_searchValue);
		if (result == null) {
			result = eval(_lookup + "(\"" + _searchValue + "\")").value;
			if (result == null) {
				alert("Oups... Impossible de terminer l'opération!");
				HidePanel();
				ResetState(true);
				return -1;
			} else {
				WriteToCache(_searchValue, result);
			}
		}
		if (result == "") {
			HidePanel();
			ResetState(false);
		} else {
			result = ParseHTML(result);
			ShowPanel(result);
		}
	}
	*/
	function Search() {
									
		_searchValue = SetSearchValue();
		var result = ReadFromCache(_searchValue);
		if (result == null) 
		{
			var caller = _lookup + "(\"" + _searchValue + "\")";
			var offset = _lookup.indexOf("(",0);			
			if (offset >= 0) 
			{
				caller = _lookup.substring(0,offset + 1) + "'" + _searchValue + "'," + _lookup.substring(offset + 1, _lookup.length);
			}
			//alert (caller);
			result = eval(caller).value;
			if (result == null) {
				alert("Oups... Impossible de terminer l'opération!");
				HidePanel();
				ResetState(true);
				return -1;
			} else {
				WriteToCache(_searchValue, result);
			}
		}
		if (result == "") {
			HidePanel();
			ResetState(false);
		} else {
			result = ParseHTML(result);
			ShowPanel(result);
		}
	}

	function ParseHTML(result) {
		var r = new Array();
		var html = "";

		eval(result)						// Server Response is an Array Instanciation
		_nbItem = 0;
		_curItem = 0;

		for (var key in r) {
			_nbItem += 1;
			html += "<li id=\"" + _sender.id + "" + _nbItem + "\"";
			html += " ajaxId=\"" + key + "\"";
			html += " onmouseover=\"AjaxMoveById('" +_sender.id + "','" + _nbItem +"')\"";
			html += ">";
			html += r[key];
			html += "</li>";			

	  }
		if(html != "") {
			html = "<ul>" + html + "</ul>";
		}
		return html;
	}

	function ShowPanel(htmlResult) {
		if (_div == null) {
			_div = window.document.createElement("div");
			_div.style.top = findY(_sender) + _sender.offsetHeight + "px";
			_div.style.left = findX(_sender) + "px";
			_div.style.width = _sender.offsetWidth + "px";
			_div.className = "AjaxTextbox";
			window.document.body.insertBefore(_div,null);

			_iframe = window.document.createElement("iframe");
			_iframe.style.top = _div.offsetTop + "px";
			_iframe.style.left = _div.offsetLeft + "px";
			_iframe.style.width = _div.offsetWidth + "px";
			_iframe.className = "AjaxTextbox";
			window.document.body.insertBefore(_iframe,null);
		}
		_div.innerHTML = htmlResult;
		_div.style.display = "inline";
		_iframe.style.height = _div.offsetHeight + "px";
		_iframe.style.display = "inline";
		_inline = true;
		MoveTo(1);
	}

	function HidePanel() {
		if(_div != null) {
			_div.style.display = "none";		// Hide Panel
			_iframe.style.display = "none";	// Hide iFrame
		}
		_inline = false;
	}

	function ResetState(resetSearch) {
		_selectedValue = "";
		_selectedIndex = "";
		_nbItem = 0;
		_curItem = 0;
		if(resetSearch) {
			_searchValue = "";
		}
	}

	function GetSearchValue() {
		return _searchValue;
	}
	
	function SetSearchValue() {
		var search = _sender.value.toLowerCase();								// To lower case for compare
		search = search.replace(new RegExp("\\\\","g"),"\\\\\\\\");		// Escape special character "
		search = search.replace(new RegExp("\"","g"),"\\\"");		// Escape special character "
		search = search.replace(new RegExp("\'","g"),"\\\'");
		return search;
	}

	function MoveTo(indexValue) {
		var next = _curItem + indexValue;
		
		if(next >= 1 && next <= _nbItem) {
			_curItem = next;
			MoveToById(_sender.id + "" + _curItem);
		}
	}

	function MoveToById(elementId) {
		if(_objSelected != null) {
			_objSelected.className = "";
		} 
		_objSelected = window.document.getElementById(elementId);
		_objSelected.className = "AjaxSelectedItem";
		_selectedId = _objSelected.getAttribute("ajaxId");
		_selectedValue = getInnerText(_objSelected);
	}
	
	function ReadFromCache(searchKey) {
		return _cache[searchKey];
	}

	function WriteToCache(searchKey, htmlResult) {
		_cache[searchKey] = htmlResult;
	}
}

function getInnerText(elt) {
  var _innerText = elt.innerText;
  if (_innerText == undefined) {
    _innerText = elt.innerHTML.replace(/<[^>]+>/g,"");
  }
  return _innerText;
}

// Return 1 or -1 event if DownArrow or UpArrow  is Press
// 0 Other
function IsSelectionKey(keyCode) {
	keyCode = Number(keyCode);
	if (keyCode == 38) {
		return -1;
	} else if (keyCode == 40) {
		return 1;
	}
	return 0;
}

// Return one number between 0 and 10000
// for unique identifier objet
//function RandomId() {
//	var id = Math.random() * 10000;
//	return Math.round(id);
//}

// Return Aboslute X Position
function findX(obj) {
	var offSet = 0;
	while(obj.offsetParent) {
		offSet += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return offSet;
}

// Return Aboslute Y Position
function findY(obj) {
	var offSet = 0;
	while(obj.offsetParent) {
		offSet += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return offSet;
}


