
var sugestdiv = null;
var suggesttimer = null;
var sugesttval = 1000;
var suggesthled = null;

function addHandler(object, event, handler, useCapture) {
      if (object.addEventListener) {
            object.addEventListener(event, handler, useCapture ? useCapture : false);
      } else if (object.attachEvent) {
            object.attachEvent('on' + event, handler);
      } else alert("Add handler is not supported");
}

function removeHandler(object, event, handler) {
      if (object.removeEventListener) {
            object.removeEventListener(event, handler, false);
      } else if (object.detachEvent) {
            object.detachEvent('on' + event, handler);
      } else alert("Remove handler is not supported");
}


function suggestAttach(uri,elid,minchar,timeout)
{
    sugesttval = timeout ? timeout : sugesttval;
    addHandler(document.getElementById(elid), 'keypress',suggestTimer);
    addHandler(document.getElementById(elid), 'keydown',suggest_keydown);
    document.getElementById(elid).sg_url = uri;
    document.getElementById(elid).m_char = minchar;
}

function suggest_keydown(el)
{
    if(el.which==undefined)
    {
	var cc = el.keyCode;
    } else {
	var cc = el.which;
    }
    if(cc != 38 && cc != 40 && cc != 37 && cc != 39 && cc != 33 && cc != 34 && cc != 36 && cc != 35 && cc != 13 && cc != 9 && cc != 27 && cc != 16 && cc != 17 && cc != 18 && cc != 20)
    {
        suggestTimer(el);
        return true;
    }

    var targ = el.target;
    if(targ == undefined) {targ = el.srcElement}

    var sd = null;
    if(sd = document.getElementById(targ.id + '_suggest'))
    {
	if(sd.s_sel != "")
	{
	    var sa = document.getElementById(sd.s_sel);
	    sa.className = '';
    	    if(cc == 13)
	    {
		return true;
	    }

	    if(cc == 40 || cc == 38) {
	    if(cc == 40) {var ne = sa.nextSibling;}
	    else if(cc == 38) {var ne = sa.previousSibling;}

	    if(ne == null || ne == undefined)
	    {
	        sd.s_sel = "";
		targ.value = sd.old_val;
	    } else
	    {
	        sd.s_sel = ne.id;
		suggest_hl(ne);
		targ.value = ne.innerHTML;
	    }
	    }
	} else {
	    if(cc == 40) {
		var sa = sd.getElementsByTagName('div')[0];
	    } else if(cc == 38) {
		var sa = sd.getElementsByTagName('div')[sd.getElementsByTagName('div').length-1]
	    }
	    if(sa)
	    {
		sd.old_val = targ.value;
    		suggest_hl(sa);
		targ.value = sa.innerHTML;
		sd.s_sel = sa.id;
	    }
	}
    } else
    {
	if(cc == 40)
	{
	    suggestRequest(targ.id);
	}
    }
    
}

function suggest_sel(el,targid)
{
    document.getElementById(targid).value=el.innerHTML;
    suggestRemove();
}

function suggestTimer(el)
{
    var targ = el.target;
    if(targ == undefined) {targ = el.srcElement;}
    if(targ) {
	window.clearTimeout(suggesttimer);
	suggesttimer = window.setTimeout("suggestRequest('"+targ.id + "')", sugesttval);
    }
}

function suggestRequest(elid)
{
    if(document.getElementById(elid).value.length > 2) {
	ajax_loadIntoCallback(document.getElementById(elid).sg_url.replace("%",document.getElementById(elid).value).replace("$",elid), suggestDisplay);
    } else {
	suggestRemove();
    }
}

function suggestDisplay(dta)
{
    var a = null;
    if((dta["elid"]) && (a = document.getElementById(dta["elid"])))
    {
	sugestdiv = dta['elid']+'_suggest';	
	if(dta['answer'].length == 0)
	{
	    suggestRemove();
	    return false;
	}
	var c = document.getElementById(dta['elid']+'_suggest');
	if(c)
	{
	} else
	{
	    var c = document.createElement('div');
	    c.id = dta['elid']+'_suggest';
	    c.s_sel = "";
	    c.className = 'suggestion';
	    c.style.width = a.clientWidth + 'px';
	    document.body.appendChild(c);
	}
	var f = a;
	var x=0;
	var y=0;
	while(f.offsetParent)
	{
	    x=x+f.offsetLeft;
	    y=y+f.offsetTop;
	    f = f.offsetParent;
	}

	c.style.left = x + 'px';
	c.style.top = y + a.clientHeight + 6 + 'px';
	var cont = '';
	for(var i=0;i<dta['answer'].length; i++)
	{
	    cont+='<div id="'+dta['elid']+'_s_'+i+'" onclick="suggest_sel(this,'+"'"+dta['elid']+"'"+')" onmouseover="suggest_hl(this)">'+dta['answer'][i]+'</div>';
	}
	c.innerHTML = cont;
    }
    addHandler(window.document,'click',suggestRemove);
}

function suggestRemove()
{
    var a = document.getElementById(sugestdiv);
    if(a) {a.parentNode.removeChild(a);}
}


function suggest_hl(el)
{
    el.parentNode.s_sel = el.id;
    var nds = el.parentNode.getElementsByTagName('div');
    for(var i =0; i < nds.length; i++)
    {
	nds[i].className = '';
    }
    el.className = 'sel';
}

