﻿function actb(obj){
	/* ---- Public Variables ---- */
	this.actb_timeOut = -1; // Autocomplete Timeout in ms (-1: autocomplete never time out)
	this.actb_firstText = false; // should the auto complete be limited to the beginning of keyword?
	this.actb_mouse = true; // Enable Mouse Support
	this.actb_delimiter = new Array(';');  // Delimiter for multiple autocomplete. Set it to empty array for single autocomplete
	this.actb_startcheck = 3; // Show widget only after this number of characters is typed in.
	this.setKeywords = setKeywords;
	/* ---- Public Variables ---- */

	/* ---- Private Variables ---- */
	var actb_delimwords = new Array();
	var actb_cdelimword = 0;
	var actb_delimchar = new Array();
	var actb_display = false;
	var actb_pos = 0;
	var actb_total = 0;
	var actb_curr = null;
	var actb_rangeu = 0;
	var actb_ranged = 0;
	var actb_bool = new Array();
	var actb_pre = 0;
	var actb_toid;
	var actb_tomake = false;
	var actb_getpre = "";
	var actb_mouse_on_list = 1;
	var actb_kwcount = 0;
	var actb_caretmove = false;
	var actb_valchange = false;
	this.actb_keywords = new Array();
	/* ---- Private Variables---- */
	
	var actb_self = this;
	actb_curr = obj;
	
	Sys.UI.DomEvent.addHandler(actb_curr,"keydown",actb_checkkey);	 
	Sys.UI.DomEvent.addHandler(actb_curr,"blur",actb_clear);
    Sys.UI.DomEvent.addHandler(actb_curr,"keypress",actb_keypress);
    Sys.UI.DomEvent.addHandler(actb_curr,"change",actb_change);
    
    function actb_change()
    {
     actb_valchange=true;
    }

	function actb_setup(){
		addEvent(actb_curr,"keydown",actb_checkkey);
		addEvent(actb_curr,"blur",actb_clear);
		addEvent(actb_curr,"keypress",actb_keypress);
	}

	function setKeywords(list){
	    this.actb_keywords = new Array();
        this.actb_keywords = list;
    }

    function actb_clear(evt) {
	    if (!evt) evt = event;
		actb_removedisp();
		if (actb_valchange == true) {
		    actb_valchange = false;
		    callvalidator();
		}
	}
	
	var seltable;

	function actb_generate() {
	    if (document.getElementById('div_table')) {
	        actb_display = false;
	        var childFrame = document.getElementById('div_table')._ElementsIFrame;
	        if (childFrame) { document.body.removeChild(childFrame); } 
	        document.body.removeChild(document.getElementById('div_table'));
	    } 
	    var selectOption = $get("div_table");
        if(selectOption == null){
		    d = document.createElement('div');
		    d.style.overflow="auto";
            d.style.height = '200px';		  
		    d.id = 'div_table';
		    d.style.position='absolute';
		    d.style.zIndex=100005;
		    d.style.top = eval(curTop(actb_curr) + actb_curr.offsetHeight) + "px";
		    d.style.width=(actb_curr.offsetWidth + 17) + "px";
		    d.align = 'left';
		    d.style.left = curLeft(actb_curr)+1 + "px";
		    if (actb_self.actb_mouse){
			  d.onmouseup=function(){actb_mouse_on_list=1;actb_curr.focus();};
			  d.onmousedown=function(){actb_mouse_on_list=1;actb_curr.focus();};
			  d.onscroll=function(){actb_mouse_on_list=1;actb_curr.focus();};
              d.onfocus=function(){actb_mouse_on_list=1;actb_curr.focus();};
		    }
	    
		    document.body.appendChild(d);
    		
		    a = document.createElement('table');
		    a.cellSpacing='1px';
		    a.cellPadding='2px';
		    a.className="actbBgColor";
		    a.style.textAlign="left";
		    a.style.align="left"
		    a.style.width=(actb_curr.offsetWidth) + "px";
		    a.style.overflow='auto';
		    a.style.border ="1px solid #AAAAAA";		    
		    a.id = 'tat_table';
		    d.appendChild(a);
		    seltable=a;
		var i;
		var counter = 0;
		var first = true;
		var defaultSelection = false;
		var defaultValue ="";
		var j = 1;
		
		for (i=0;i<actb_self.actb_keywords.length;i++) {
		    if (actb_bool[i]){
		        var t = actb_curr.value.addslashes();

			    if(actb_self.actb_keywords[i].C.toLowerCase() == t.toLowerCase())
			    {
			        defaultSelection = true;
			        defaultValue = actb_self.actb_keywords[i].LD;
			    }
			}
		}
		for (i=0;i<actb_self.actb_keywords.length;i++){
		    if (actb_bool[i]){
		    r = a.insertRow(-1);
		    if (defaultSelection)
			{
			    if(actb_self.actb_keywords[i].LD == defaultValue)
			    {
				    r.className="actbHColor";
				    actb_pos = j;
				}
			}else{
             if (first){
					r.className="actbHColor";
					first = false;
					actb_pos = 0;
				}else{
					r.className = "actbBgColor";
				}
		    }
		    r.id = 'tat_tr'+(j);
            c = r.insertCell(-1);
            c.className="actbTextColor";
		    c.className="actbFFamily";
		    c.className="actbFSize";
    	    c.setAttribute('pos',j);
  	        c.innerHTML = actb_parse(actb_self.actb_keywords[i].LD);
		    c.style.cursor='pointer';
		    c.onclick= setvalue;
		    c.onmouseover = highlightRow;
		    c.onmouseout = removehighlightRow;
		    j++;
		        } 
			}
        selectOption = $get("div_table");
        }
        selectOption.style.display = "block";

        document.onclick = removeOpt;
        actb_rangeu = 1;
		actb_ranged = j-1;
		actb_display = true;
		if (actb_pos <= 0) actb_pos = 1;
		addBackgroundIFrame(selectOption, actb_curr);  // call the IE function here

	}
	function highlightRow(){
        if (actb_pos < 1) {actb_pos = 1;}
		document.getElementById('tat_tr'+actb_pos).className="actbBgColor";
		actb_pos = this.getAttribute('pos');
		document.getElementById('tat_tr'+actb_pos).className="actbHColor";
		actb_mouse_on_list=1;
    }

    function removehighlightRow(){
        actb_mouse_on_list=0
    }
    
	function setvalue(evt){
		actb_mouse_on_list = 0;
		actb_pos = this.getAttribute('pos');
		actb_penter();
		callvalidator();
    }
    
    function removeOpt(e){
        var sel=$get("div_table");
        if(sel != null){
            document.body.removeChild(sel);
            document.onclick = null;
            callvalidator();
        }
        
            var childFrame = sel._ElementsIFrame;
            if (childFrame) {
                childFrame.style.display = "none";
            }        
    }

    function callvalidator() {
        if(actb_curr.value.trim() != '')
        {  
            if(actb_curr.Validators != null)
            {
                if(actb_curr.Validators.length > 0) {
                    var val = actb_curr.Validators[0];
                    val.evaluationfunction(val);
                }
            }
        }
	}
	
	
	function actb_table_focus(){
		actb_mouse_on_list = 1;
	}
	function actb_table_unfocus(){
		actb_mouse_on_list = 0;
	}
	function actb_table_highlight(){
		actb_mouse_on_list = 1;
	}


	function actb_penter() {
	    if (!actb_display) return;
        if (actb_pos < 1) { actb_removedisp(); return; }
        actb_display = false;
        var word = '';
        var c = 0;
        for (var i = 0; i <= actb_self.actb_keywords.length; i++) {
            if (actb_bool[i]) c++;
            if (c == actb_pos) {
                word = actb_self.actb_keywords[i].LD;
                break;
            }
        }
        if (word != "") {
            actb_curr.value = word;
        }
        actb_mouse_on_list = 0;
        actb_removedisp();
	}

	function actb_removedisp() {
	    if (actb_mouse_on_list == 0) {
	        actb_display = false; 
	        var sel = document.getElementById('div_table');
	        if (sel) {
	                var childFrame = sel._ElementsIFrame;
	                if (childFrame) {
	                    childFrame.style.display = "none";
	                }
	            document.body.removeChild(document.getElementById('div_table'));
	        }
	        if (actb_toid) clearTimeout(actb_toid);
	        document.onclick = null;
	    }		
	}
	
	function actb_keypress(e){
		if (actb_caretmove) stopEvent(e);
		return !actb_caretmove;
	}
	function actb_goup(){
		if (!actb_display) return;
		if (actb_pos == 1) return;
		document.getElementById('tat_tr'+actb_pos).className="actbBgColor";
		actb_pos--;
		
		if(seltable != null)
		{
          if(actb_pos>0)   
          if((seltable.getElementsByTagName('tr')[actb_pos - 1].offsetTop) < 
             ($get("div_table").scrollTop ) )
            { 
          $get("div_table").scrollTop= seltable.getElementsByTagName('tr')[actb_pos - 1].offsetTop; // + seltable.getElementsByTagName('tr')[actb_pos - 1].offsetHeight ; // - $get("div_table").clientHeight;
            }

		}
		if (actb_pos < actb_rangeu) actb_moveup();
		document.getElementById('tat_tr'+actb_pos).className="actbHColor";
	}
	
	
	function actb_parse(n){
		if (actb_self.actb_delimiter.length > 0){
			var t = actb_delimwords[actb_cdelimword].trim().addslashes();
			var plen = actb_delimwords[actb_cdelimword].trim().length;
		}else{
			var t = actb_curr.value.addslashes();
			var plen = actb_curr.value.length;
		}
		var tobuild = '';
		var i;

		if (actb_self.actb_firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			var re = new RegExp(t, "i");
		}
		var p = n.search(re);
		
		if(p != -1)
		{		
		    for (i=0;i<p;i++){
			    tobuild += n.substr(i,1);
		    }
		    tobuild +="<font class='actbHStyle'>"
		    for (i=p;i<plen+p;i++){
			    tobuild += n.substr(i,1);
		    }
		    tobuild += "</font>";
			    for (i=plen+p;i<n.length;i++){
			    tobuild += n.substr(i,1);
		    }
		    return tobuild;
	    }
	    else
		{
		    return n;
		}
	}
	
	
	function actb_godown(){
		if (!actb_display) return;
		if (actb_pos == actb_total) return;
		document.getElementById('tat_tr'+actb_pos).className="actbBgColor";
		actb_pos++;
		
		if(seltable != null)
		{
         if(actb_pos>0)   
         {
         if((seltable.getElementsByTagName('tr')[actb_pos - 1].offsetTop + seltable.getElementsByTagName('tr')[actb_pos - 1].offsetHeight) > ($get("div_table").scrollTop + $get("div_table").clientHeight) ) 
            { 
          $get("div_table").scrollTop= seltable.getElementsByTagName('tr')[actb_pos - 1].offsetTop + seltable.getElementsByTagName('tr')[actb_pos - 1].offsetHeight - $get("div_table").clientHeight;
            }
         }
		}
		if (actb_pos > actb_ranged) actb_movedown();
		document.getElementById('tat_tr'+actb_pos).className="actbHColor";
	}
	
	function actb_movedown(){
	    actb_rangeu++;
		actb_ranged++;
		actb_generate();
	}
	function actb_moveup(){
		actb_rangeu--;
		actb_ranged--;
		actb_generate();
	}

	function actb_checkkey(evt){
	    if (!evt) evt = event;
		a = evt.keyCode;
		caret_pos_start = getCaretStart(actb_curr);
		actb_caretmove = 0;
		switch (a){
			case 38:
				actb_goup();
				actb_caretmove = 1;
				return false;
				break;
			case 40:
				actb_godown();
				actb_caretmove = 1;
				return false;
				break;
            case 13:
                if (actb_display) {
                    actb_caretmove = 1;
                    actb_penter();
                    if (IsIE()) callvalidator();
                    actb_curr.focus();
                    return false;
                } else {
                    return true;
                }
                break;
            case 9:
                if (actb_display) {
                    actb_penter();
                    if (IsIE()) callvalidator();
                }
                return true;
                break;
			default:
			    setTimeout(function(){actb_tocomplete(a)},10);
		}
	}
        	
	function IsIE(){
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer)
            return true;
        else
            return false;
    }

	function actb_tocomplete(kc){
	    if (kc == 38 || kc == 40 || kc == 13 || kc == 9) return;
		var i;
		if (actb_display){ 
			var word = 0;
			var c = 0;
			for (var i=0;i<=actb_self.actb_keywords.length;i++){
				if (actb_bool[i]) c++;
				if (c == actb_pos){
					word = i;
					break;
				}
			}
			actb_pre = word;
		}else{ actb_pre = -1};
		
		if (actb_curr.value == ''){
			actb_mouse_on_list = 0;
			actb_removedisp();
			return;
		}
		if (actb_self.actb_delimiter.length > 0){
			caret_pos_start = getCaretStart(actb_curr);
			caret_pos_end = getCaretEnd(actb_curr);
			
			delim_split = '';
			for (i=0;i<actb_self.actb_delimiter.length;i++){
				delim_split += actb_self.actb_delimiter[i];
			}
			delim_split = delim_split.addslashes();
			delim_split_rx = new RegExp("(["+delim_split+"])");
			c = 0;
			actb_delimwords = new Array();
			actb_delimwords[0] = '';
			for (i=0,j=actb_curr.value.length;i<actb_curr.value.length;i++,j--){
				if (actb_curr.value.substr(i,j).search(delim_split_rx) == 0){
					ma = actb_curr.value.substr(i,j).match(delim_split_rx);
					actb_delimchar[c] = ma[1];
					c++;
					actb_delimwords[c] = '';
				}else{
					actb_delimwords[c] += actb_curr.value.charAt(i);
				}
			}

			var l = 0;
			actb_cdelimword = -1;
			for (i=0;i<actb_delimwords.length;i++){
				if (caret_pos_end >= l && caret_pos_end <= l + actb_delimwords[i].length){
					actb_cdelimword = i;
				}
				l+=actb_delimwords[i].length + 1;
			}
			var ot = actb_delimwords[actb_cdelimword].trim(); 
			var t = actb_delimwords[actb_cdelimword].addslashes().trim();
		}else{
			var ot = actb_curr.value;
			var t = actb_curr.value.addslashes();
		}
		if (ot.length == 0){
			actb_mouse_on_list = 0;
			actb_removedisp();
		}
		if (ot.length < actb_self.actb_startcheck) return this;
		if (actb_self.actb_firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			var re = new RegExp(t, "i");
		}

		actb_total = 0;
		actb_tomake = false;
		actb_kwcount = 0;
		actb_display = false;
		for (i=0;i<actb_self.actb_keywords.length;i++){
			actb_bool[i] = false;
			if ((re.test(actb_self.actb_keywords[i].LD)) || (actb_self.actb_keywords[i].C.toLowerCase() == t.toLowerCase())){
				actb_total++;
				actb_bool[i] = true;
				actb_kwcount++;
				actb_display = true;
				if (actb_pre == i) actb_tomake = true;
			}
    }
    if(actb_display) {
	    actb_generate();
	}
	else { 
	    actb_mouse_on_list = 0;
		actb_removedisp();
	}
	}
	return this;
}

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();