dojo.require("dojo.io.*");
if (typeof handleOnSubmit=='undefined') var handleOnSubmit=false;
if (typeof centerLoading=='undefined') var centerLoading=true;
var loading = false;
var ea = 1;
var _cacheSuggest = new Array();
/*Start loading box*/
function setLoading(bool){
	loading = bool;
  	var oLoading = document.getElementById("loading");
  	if (loading){
  		oLoading.style.display = "block";
  		if (centerLoading == true){
			w = oLoading.scrollWidth;
			h = oLoading.scrollHeight;
			bodyList = document.getElementsByTagName("body");
			oLoading.style.left = (bodyList[0].clientWidth-w) / 2 + "px";
			oLoading.style.top = (((bodyList[0].clientHeight-h) / 2) +bodyList[0].scrollTop  ) + "px";
  		}
  	}
  	else {
  		oLoading.style.display = "none";
  	}
  }
  function positionLoading(){
  	  if (loading){
		var oLoading = document.getElementById("loading");
		var w = oLoading.scrollWidth;
		var h = oLoading.scrollHeight;
		bodyList = document.getElementsByTagName("body");
		oLoading.style.left = (bodyList[0].clientWidth-w) / 2 + "px";
		oLoading.style.top = (((bodyList[0].clientHeight-h) / 2) +bodyList[0].scrollTop  ) + "px";
	}
  }
  if (centerLoading == true){
  	AttachEvent(window, 'scroll', positionLoading, false);
  	AttachEvent(window, 'resize', positionLoading, false);
  }
  //window.onscroll=function(){positionLoading();};
  //window.onresize=function(){positionLoading();};
  /*End loading box*/
  
//***Cross browser attach event function. For 'evt' pass a string value with the leading "on" omitted
//***e.g. AttachEvent(window,'load',MyFunctionNameWithoutParenthesis,false);
function AttachEvent(obj,evt,fnc,useCapture){
	if (!useCapture) useCapture=false;
	if (obj.addEventListener){
		obj.addEventListener(evt,fnc,useCapture);
		return true;
	} else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
	else{
		MyAttachEvent(obj,evt,fnc);
		obj['on'+evt]=function(){ MyFireEvent(obj,evt) };
	}
} 
//The following are for browsers like NS4 or IE5Mac which don't support either attachEvent or addEventListener
function MyAttachEvent(obj,evt,fnc){
	if (!obj.myEvents) obj.myEvents={};
	if (!obj.myEvents[evt]) obj.myEvents[evt]=[];
	var evts = obj.myEvents[evt];
	evts[evts.length]=fnc;
}
function MyFireEvent(obj,evt){
	if (!obj || !obj.myEvents || !obj.myEvents[evt]) return;
	var evts = obj.myEvents[evt];
	for (var i=0,len=evts.length;i<len;i++) evts[i]();
}


function getSuggestion(query, url, onclickFnc, callId){
	results = "_res_" + callId;
  	if (_cacheSuggest[callId][query] != null){
  		setLoading(true);
  		setSuggestions(query, _cacheSuggest[callId][query], onclickFnc, callId); setLoading(false);
  	}
  	else if (!loading){
  		setLoading(true);
	  	dojo.io.bind({
	    	url: url+query,
	    	load: function(type, data, evt){ setSuggestions(query, data, onclickFnc, callId); setLoading(false); },
	    	mimetype: "text/plain"
		});
  	}
  }
  
  /* Position results start */
  
function setPositionResult(oDiv, oInput){
    if (oDiv){
        oDiv.style.left = offLeft(oInput) + "px";
        oDiv.style.top = offTop(oInput) + oInput.offsetHeight - 1+"px";
        if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")==-1){
        	oDiv.style.width = oInput.offsetWidth - ea * 2 + "px";
        }
        else{
        	oDiv.style.width = oInput.offsetWidth + "px"
        }
    }
}
function offLeft(oInput){
    return kb(oInput, "offsetLeft")
}

function offTop(oInput){
    return kb(oInput, "offsetTop")
}

function kb(elem, na){
    var wb = 0;
    while (elem){
        wb += elem[na];
        elem = elem.offsetParent;
    }
    return wb;
}

  /* Position results end*/
  
  
  function setSuggestions(query, data, onclickFnc, callId){
  	_cacheSuggest[callId][query] = data;
  	var tmp = unserialize(data);
  	var results = "_res_" + callId;
  	var elt = document.getElementById(results);
  	var handlerNode = document.getElementById(callId);
  	setPositionResult(elt, handlerNode);
  	if (tmp.length > 0){
  		var num = 0;
  		var _res = '';
  		var qElt = document.getElementById(callId);
  		for (var i  in tmp){
  			if (typeof tmp[i]["v"]!= "undefined"){
  			_res += '<div class="' + (num==0 ? 'suggestOver' : 'suggest') + '"'
         	+  ' onmouseover="_mouseover(\'' + elt.id + '\', \'' + qElt.id + '\', ' + num + ');"'
         	+  ' onmouseout="_mouseout(\'' + elt.id + '\', ' + num + ');"'
         	+  ' onclick="'+onclickFnc+'(\'' + elt.id + '\', \'' + qElt.id + '\', ' + num + ', \''+escape(i)+'\', \''+escape(tmp[i]["v"])+'\');">';
         	_res += '<span class="srt">' + tmp[i]["v"] + '</span>';
         	if (tmp[i]["r"] != null){
         		_res += '<span class="src">' + tmp[i]["r"] + '</span>';
         	}
            _res += '</div>\n';
  			num++;
  			}
  		}
  		try{
  			elt.innerHTML = _res;
  		}
  		catch(error){
  			setLoading(false);
  		}
  		elt.selectedIndex = 0;
  		_show(elt);
  	}
  	else {
  		elt.selectedIndex = -1;
  		_hide(elt);
  	}
  }
  
  function handleSubmitOnEnter(){
	listOfForms = document.getElementsByTagName("form");
	for(i = 0; i < listOfForms.length; i++){
		listOfForms[i].onsubmit = function(){ this.onsubmit=null; return false; };
	}
  }  
  
  function insertAfter(parent, node, referenceNode) {
    parent.insertBefore(node, referenceNode.nextSibling);
  }
  
  function bindSuggestion(field, fnc){
	_cacheSuggest[field] = new Array();
  	var handlerNode = document.getElementById(field);
  	handlerNode.setAttribute("autocomplete","off");
  	var oDiv = document.createElement("div");
	oDiv.className="suggestResults";
	oDiv.id = "_res_"+field;
	oDiv.style.width=handlerNode.offsetWidth+'px';
	//handlerNode.parentNode.appendChild(oDiv); 
	insertAfter(handlerNode.parentNode, oDiv, handlerNode);
  	dojo.event.connect(handlerNode, "onkeydown", function(evt){
	    key = _getkeycode(evt);
	    __results = document.getElementById("_res_"+field);
	    __query = document.getElementById(field);
		switch (key) {
			case 13: // enter
				if (__results.selectedIndex >= 0){
					__results.childNodes[__results.selectedIndex].onclick();
					_hide(__results);
					if (handleOnSubmit==true)
						handleSubmitOnEnter();
				}
				return false;
			case 27: // escape
				_hide(__results);
				return false;
				break;
			case 38: // up arrow
				_handleup(__results, __query);
				return false;
				break;
			case 40: // down arrow
				_handledown(__results, __query);
				return false;
				break;
			default:
				setTimeout(fnc+"()", 500);
		}
		return true;
    	   
	});
  	
}
  
function _mouseover(id, qId, idx){
	elt = document.getElementById(id);
	elt.selectedIndex = idx;
	qElt = document.getElementById(qId);
	qElt.focus();
	_highlightsel(elt);
}

function _mouseout(id, idx){
    elt = document.getElementById(id);
    elt.selectedIndex = -1;
    _highlightsel(elt);
}

function _highlightsel(elt){
    divs = elt.getElementsByTagName('div');
    for (i = 0; i < divs.length; i++) {
        if (i == elt.selectedIndex) 
            divs[i].className = 'suggestOver';
        else
            divs[i].className = 'suggest';
    }
}

function _hide(elt){
    if (elt){
    	elt.style.display = 'none';
    	if (document.getElementById("frm_"+elt.id)){
	    	frmElt = document.getElementById("frm_"+elt.id);
	    	frmElt.style.display = 'none';
    	}
    }
}
function _show(elt){
    if (elt){
    	elt.style.display = 'block';
    	//If IE and not Opera use iframe
    	if(navigator&&navigator.userAgent.toLowerCase().indexOf("msie")!=-1 && navigator.userAgent.toLowerCase().indexOf("opera")== -1){
	    	if (!document.getElementById("frm_"+elt.id)){
	    		//Create Iframe
	    		var frmElt = document.createElement("iframe");
	    		frmElt.name = "frm_"+elt.id;
	    		frmElt.id = "frm_"+elt.id;
	    		frmElt.src = "";
	    		frmElt.frameBorder = "0";
	    		frmElt.scrolling = "no";
	    		frmElt.className="suggestResultsFrm";
	    	    document.body.appendChild(frmElt);
	    	}
			try { 
		    	if (document.getElementById("frm_"+elt.id)){
			    	frmElt = document.getElementById("frm_"+elt.id);
			    	frmElt.style.width = elt.offsetWidth+"px";
					frmElt.style.height = elt.offsetHeight+"px";
					frmElt.style.top = elt.offsetTop+"px";
					frmElt.style.left = elt.offsetLeft+"px";
					frmElt.style.zIndex = 1;
					frmElt.style.display = "block";
		    	}
			}
			catch(error) {
				//Frame not ready yet
				window.setTimeout(function(){
					try {
					frmElt = document.getElementById("frm_"+elt.id);
			    	frmElt.style.width = elt.offsetWidth+"px";
					frmElt.style.height = elt.offsetHeight+"px";
					frmElt.style.top = elt.offsetTop+"px";
					frmElt.style.left = elt.offsetLeft+"px";
					frmElt.style.zIndex = 1;
					frmElt.style.display = "block";
					}
				catch(error) {}
				}, 1000);
			}
    	}
    }
}
function _ishidden(elt){
    return elt.style.display == 'none';
}


function _handleup(elt, qElt){
	var numResults = elt.childNodes.length;
    if (numResults > 0 && _ishidden(elt)) {
        _show(elt);
        return;
    }
    if (elt.selectedIndex == 0) //Cycle Results
    	elt.selectedIndex = numResults - 1;
    else if (elt.selectedIndex < 0)
        elt.selectedIndex = numResults - 1;
    else
        elt.selectedIndex--;
    _highlightsel(elt);
}

function _handledown(elt, qElt){
	var numResults = elt.childNodes.length;
    if (numResults > 0 && _ishidden(elt)) {
        _show(elt);
        return;
    }
    if (elt.selectedIndex == numResults - 1) //Cycle Results
    	elt.selectedIndex = 0;
    else if (elt.selectedIndex < 0)
        elt.selectedIndex = 0;
    else
        elt.selectedIndex++;
    _highlightsel(elt);
}

function _getkeycode(e){
	if (document.layers)
		return e.which;
	else if (document.all)
		return event.keyCode;
	else if (document.getElementById)
		return e.keyCode;
	return 0;
}
