/*    Caret Functions     */
function getCaretEnd(obj){
if(typeof obj.selectionEnd != "undefined"){
  return obj.selectionEnd;
}else if(document.selection&&document.selection.createRange){
  var M=document.selection.createRange();
  var Lp=obj.createTextRange();
  Lp.setEndPoint("EndToEnd",M);
  var rb=Lp.text.length;
  if(rb>obj.value.length){
   return -1;
  }
  return rb;
}
}
function getCaretStart(obj){
if(typeof obj.selectionStart != "undefined"){
  return obj.selectionStart;
}else if(document.selection&&document.selection.createRange){
  var M=document.selection.createRange();
  var Lp=obj.createTextRange();
  Lp.setEndPoint("EndToStart",M);
  var rb=Lp.text.length;
  if(rb>obj.value.length){
   return -1;
  }
  return rb;
}
}
function setCaret(obj,l){
obj.focus();
if (obj.setSelectionRange){
  obj.setSelectionRange(l,l);
}else if(obj.createTextRange){
  m = obj.createTextRange();  
  m.moveStart('character',l);
  m.collapse();
  m.select();
}
}
/* ----------------- */

/*    Escape function   */
String.prototype.addslashes = function(){
return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
}
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
}; 


function actb(obj,evt,ca){
/* ---- Variables ---- */
var actb_timeOut = -1; // Autocomplete Timeout in ms (-1: autocomplete never time out)
var actb_lim = 10;    // Number of elements autocomplete can show (-1: no limit)
var actb_firstText = false; // should the auto complete be limited to the beginning of keyword?
var actb_mouse = true; // Enable Mouse Support
var actb_delimiter = new Array(';',',');  // Delimiter for multiple autocomplete. Set it to empty array for single autocomplete
/* ---- Variables ---- */

/* --- Styles --- */
var actb_bgColor = '#1E69A3';
var actb_textColor = '#FFFFFF';
var actb_hColor = '#FFBA06';
var actb_fFamily = 'Verdana';
var actb_fSize = '11px';
var actb_width = '116px';
var actb_opacity = '90';
var actb_hStyle = 'text-decoration:underline;font-weight="bold"';
/* --- Styles --- */

/* ---- Don't touch ---- */
var actb_delimwords = new Array();
var actb_cdelimword = 0;
var actb_delimchar = new Array();
var actb_keywords = 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 = true;
var actb_kwcount = 0;
var actb_caretmove = false;
/* ---- "Constants" ---- */


actb_keywords = ca;
actb_curr = obj;

var oldkeydownhandler = document.onkeydown;
var oldblurhandler = obj.onblur;
var oldkeypresshandler = obj.onkeypress;

document.onkeydown = actb_checkkey;
obj.onblur = actb_clear;
obj.onkeypress = actb_keypress;

function actb_clear(evt){
  if (!evt) evt = event;
  document.onkeydown = oldkeydownhandler;
  actb_curr.onblur = oldblurhandler;
  actb_curr.onkeypress = oldkeypresshandler;
  actb_removedisp();
  onTxTBlur();

}
function actb_parse(n){
  if (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_firstText){
   var re = new RegExp("^" + t, "i");
  }else{
   var re = new RegExp(t, "i");
  }
  var p = n.search(re);
    
  for (i=0;i<p;i++){
   tobuild += n.substr(i,1);
  }
  tobuild += "<font style='"+(actb_hStyle)+"'>"
  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;
}
function curTop(){
  actb_toreturn = 0;
  obj = actb_curr;
  while(obj){
   actb_toreturn += obj.offsetTop;
   obj = obj.offsetParent;
  }
  return actb_toreturn;
}
function curLeft(){
  actb_toreturn = 0;
  obj = actb_curr;
  while(obj){
   actb_toreturn += obj.offsetLeft;
   obj = obj.offsetParent;
  }
  return actb_toreturn;
}
function actb_generate(){
  if (document.getElementById('tat_table')){ actb_display = false;document.body.removeChild(document.getElementById('tat_table')); } 
  if (actb_kwcount == 0){
   actb_display = false;
   return;
  }
  a = document.createElement('table');
  a.style.filter='alpha(opacity='+actb_opacity+');moz-opacity:.'+actb_opacity+';opacity:.'+actb_opacity+';';
  a.cellSpacing='1px';
  a.cellPadding='2px';
  a.style.position='absolute';
  a.style.top = eval(curTop() + actb_curr.offsetHeight) + "px";
  a.style.left = curLeft() + "px";
  a.style.backgroundColor=actb_bgColor;
  a.id = 'tat_table';
  document.body.appendChild(a);
  var i;
  var first = true;
  var j = 1;
  if (actb_mouse){
   a.onmouseout= actb_table_unfocus;
   a.onmouseover=actb_table_focus;
  }
  var counter = 0;
  for (i=0;i<actb_keywords.length;i++){
   if (actb_bool[i]){
    counter++;
    r = a.insertRow(-1);
    if (first && !actb_tomake){
     r.style.backgroundColor = actb_hColor;
     first = false;
     actb_pos = counter;
    }else if(actb_pre == i){
     r.style.backgroundColor = actb_hColor;
     first = false;
     actb_pos = counter;
    }else{
     r.style.backgroundColor = actb_bgColor;
    }
    r.id = 'tat_tr'+(j);
    c = r.insertCell(-1);
    c.style.color = actb_textColor;
    c.style.fontFamily = actb_fFamily;
    c.style.fontSize = actb_fSize;
    c.style.width=actb_width;    
    c.style.cursor='pointer';    
    c.style.textAlign='left';
    c.innerHTML = actb_parse(actb_keywords[i]);
    c.id = 'tat_td'+(j);
    c.setAttribute('pos',j);
    if (actb_mouse){
     c.onclick=actb_mouseclick;
     c.onmouseover = actb_table_highlight;
    }
    j++;
   }
   if (j - 1 == actb_lim && j < actb_total){
    r = a.insertRow(-1);
    r.style.backgroundColor = actb_bgColor;
    c = r.insertCell(-1);
    c.style.color = actb_textColor;
    c.style.fontFamily = 'arial narrow';
    c.style.fontSize = actb_fSize;
    c.align='center';
    c.innerHTML = '\\/';
    c.style.cursor='pointer';    


    
    if (actb_mouse){
     c.onclick = actb_mouse_down;
    }
    break;
   }
  }
  actb_rangeu = 1;
  actb_ranged = j-1;
  actb_display = true;
  if (actb_pos <= 0) actb_pos = 1;
}
function actb_remake(){
  document.body.removeChild(document.getElementById('tat_table'));
  a = document.createElement('table');
  a.cellSpacing='1px';
  a.cellPadding='2px';
  a.style.position='absolute';
  a.style.top = eval(curTop() + actb_curr.offsetHeight) + "px";
  a.style.left = curLeft() + "px";
  a.style.backgroundColor=actb_bgColor;
  a.style.filter='alpha(opacity='+actb_opacity+');moz-opacity:.'+actb_opacity+';opacity:.'+actb_opacity+';';
  a.id = 'tat_table';
  if (actb_mouse){
   a.onmouseout= actb_table_unfocus;
   a.onmouseover=actb_table_focus;
  }
  document.body.appendChild(a);
  var i;
  var first = true;
  var j = 1;
  if (actb_rangeu > 1){
   r = a.insertRow(-1);
   r.style.backgroundColor = actb_bgColor;
   c = r.insertCell(-1);
   c.style.color = actb_textColor;
   c.style.fontFamily = 'arial narrow';
   c.style.fontSize = actb_fSize;
   c.align='center';
   c.style.cursor='pointer';    
   
   c.innerHTML = '/\\';
   if (actb_mouse){
    c.onclick = actb_mouse_up;
   }
  }
  for (i=0;i<actb_keywords.length;i++){
   if (actb_bool[i]){
    if (j >= actb_rangeu && j <= actb_ranged){
     r = a.insertRow(-1);
     r.style.backgroundColor = actb_bgColor;
     r.id = 'tat_tr'+(j);
     c = r.insertCell(-1);
     c.style.color = actb_textColor;
     c.style.fontFamily = actb_fFamily;
     c.style.fontSize = actb_fSize;
     c.innerHTML = actb_parse(actb_keywords[i]);
     

    c.style.width=actb_width;    
    c.style.cursor='pointer';    
    c.style.textAlign='left';
     c.id = 'tat_td'+(j);
     c.setAttribute('pos',j);
     if (actb_mouse){
      c.onclick=actb_mouseclick;
      c.onmouseover = actb_table_highlight;
     }
     j++;
    }else{
     j++;
    }
   }
   if (j > actb_ranged) break;
  }
  if (j-1 < actb_total){
   r = a.insertRow(-1);
   r.style.backgroundColor = actb_bgColor;
   c = r.insertCell(-1);
   c.style.color = actb_textColor;
   c.style.fontFamily = 'arial narrow';
   c.style.fontSize = actb_fSize;
   c.align='center';
   c.style.cursor='pointer';    
   c.innerHTML = '\\/';
   if (actb_mouse){
    c.onclick = actb_mouse_down;
   }
  }
}
function actb_goup(){
  if (!actb_display) return;
  if (actb_pos == 1) return;
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
  actb_pos--;
  if (actb_pos < actb_rangeu) actb_moveup();
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
}
function actb_godown(){
  if (!actb_display) return;
  if (actb_pos == actb_total) return;
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
  actb_pos++;
  if (actb_pos > actb_ranged) actb_movedown();
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
}
function actb_movedown(){
  actb_rangeu++;
  actb_ranged++;
  actb_remake();
}
function actb_moveup(){
  actb_rangeu--;
  actb_ranged--;
  actb_remake();
}

/* Mouse */
function actb_mouse_down(){
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
  actb_pos++;
  actb_movedown();
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
  actb_curr.focus();
  actb_moue_on_list = 0;
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
}
function actb_mouse_up(evt){
  if (!evt) evt = event;
  if (evt.stopPropagation){
   evt.stopPropagation();
  }else{
   evt.cancelBubble = true;
  }
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
  actb_pos--;
  actb_moveup();
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
  actb_curr.focus();
  actb_moue_on_list = 0;
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
}
function actb_mouseclick(evt){
  if (!evt) evt = event;
  if (!actb_display) return;
  actb_mouse_on_list = 0;
  actb_pos = this.getAttribute('pos');
  actb_penter();
}
function actb_table_focus(){
  actb_mouse_on_list = 1;
}
function actb_table_unfocus(){
  actb_mouse_on_list = 0;
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_timeOut);
}
function actb_table_highlight(){
  actb_mouse_on_list = 1;
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
  actb_pos = this.getAttribute('pos');
  while (actb_pos < actb_rangeu) actb_moveup();
  while (actb_pos > actb_ranged) actb_mousedown();
  document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_timeOut);
}
/* ---- */

function actb_insertword(a){
  if (actb_delimiter.length > 0){
   str = '';
   l=0;
   for (i=0;i<actb_delimwords.length;i++){
    if (actb_cdelimword == i){
     str += a;
     l = str.length;
    }else{
     str += actb_delimwords[i];
    }
    if (i != actb_delimwords.length - 1){
     str += actb_delimchar[i];
    }
   }
   actb_curr.value = str;
   setCaret(actb_curr,l);
  }else{
   actb_curr.value = a;
  }
  actb_mouse_on_list = 0;
  actb_removedisp();
}
function actb_penter(){
  if (!actb_display) return;
  actb_display = false;
  var word = '';
  var c = 0;
  for (var i=0;i<=actb_keywords.length;i++){
   if (actb_bool[i]) c++;
   if (c == actb_pos){
    word = actb_keywords[i];
    break;
   }
  }
  actb_insertword(word);
}
function actb_removedisp(){
  if (!actb_mouse_on_list){
   actb_display = false;
   if (document.getElementById('tat_table')){ document.body.removeChild(document.getElementById('tat_table')); }
   if (actb_toid) clearTimeout(actb_toid);
  }
}
function actb_keypress(){
  return !actb_caretmove;
}
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: case 9:
   case 9:
    actb_penter();
    actb_caretmove = 1;
    return false;
    break;
   default:
    setTimeout(function(){actb_tocomplete(a)},50);
    break;
  }
}

function actb_tocomplete(kc){
  if (kc == 38 || kc == 40 || kc == 13) return;
  var i;
  if (actb_display){ 
   var word = 0;
   var c = 0;
   for (var i=0;i<=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_delimiter.length > 0){
   caret_pos_start = getCaretStart(actb_curr);
   caret_pos_end = getCaretEnd(actb_curr);
   
   delim_split = '';
   for (i=0;i<actb_delimiter.length;i++){
    delim_split += 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 t = actb_delimwords[actb_cdelimword].addslashes().trim();
  }else{
   var t = actb_curr.value.addslashes();
  }
  if (actb_firstText){
   var re = new RegExp("^" + t, "i");
  }else{
   var re = new RegExp(t, "i");
  }
  
  actb_total = 0;
  actb_tomake = false;
  actb_kwcount = 0;
  for (i=0;i<actb_keywords.length;i++){
   actb_bool[i] = false;
   if (re.test(actb_keywords[i])){
    actb_total++;
    actb_bool[i] = true;
    actb_kwcount++;
    if (actb_pre == i) actb_tomake = true;
   }
  }
  if (actb_toid) clearTimeout(actb_toid);
  if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_timeOut);
  actb_generate();
}
}