/* 20 Aug 2006: This started off as actb.js from
   http://www.codeproject.com/jscript/jsactb.asp.
   
   But it didn't work without the addEvent stuff that was in the demo
   page.  Web browsing suggests that this widely distributed stuff is
   from another source.  There is a warning about it at quirksmode,
   but I think I should be immune from it.  So that was added at the
   top.
   
   Then I hacked in a hook to do server lookups.  This is the code that uses my
   new actb_lastdownload variable.

   Then I wrote the download code.  This is a combination of the demo
   at http://www.w3schools.com/xml/tryit.asp?filename=try_xmlhttprequest_js1
   (although modified to move the state change function into a closure)
   and the "explode" function from http://textsnippets.com/

   This makes it a huge bag of code with mixed copyrights.  I'm comfortable
   saying that the creative commons license that applies to the original actb
   code can be taken as applying to this derivative work, but if you wanted to
   use this in something that costs real money, you'd better check with your
   lawyers
   
   1 Sept 2006 - I noticed a mountain of errors from the Firefox CSS Parser.
   Changing the "=" to ":" in actb_hStyle prevented this, and made the
   highlighted part bold as well!
   
   1 Sept 2006 - added a default of "sans-serif" to the "arial narrow" font
   family, for those of us who don't have arial.
   
   4 Nov 2006 - made "tab" leave the box without selection: much more how I'd
   like it to work
   
   August 2008 - changed the format to work better with names coming from SQL

   April 2009 - fixed (in a messy way) a bug where the top element didn't
   show in some browsers

   June 2009 - Added UTF8 accented character folding - so each entry has
   a "disp"lay and a "match" version
*/

function newtest(a){
    alert(a);
}

function addEvent(obj,event_name,func_name){
  if (obj.attachEvent){
    obj.attachEvent("on"+event_name, func_name);
  }else if(obj.addEventListener){
    obj.addEventListener(event_name,func_name,true);
  }else{
    obj["on"+event_name] = func_name;
  }
}

function removeEvent(obj,event_name,func_name){
  if (obj.detachEvent){
    obj.detachEvent("on"+event_name,func_name);
  }else if(obj.removeEventListener){
    obj.removeEventListener(event_name,func_name,true);
  }else{
    obj["on"+event_name] = null;
  }
}
function stopEvent(evt){
  evt || window.event;
  if (evt.stopPropagation){
    evt.stopPropagation();
    evt.preventDefault();
  }else if(typeof evt.cancelBubble != "undefined"){
    evt.cancelBubble = true;
    evt.returnValue = false;
  }
  return false;
}
function getElement(evt){
  if (window.event){
    return window.event.srcElement;
  }else{
    return evt.currentTarget;
  }
}
function getTargetElement(evt){
  if (window.event){
    return window.event.srcElement;
  }else{
    return evt.target;
  }
}
function stopSelect(obj){
  if (typeof obj.onselectstart != 'undefined'){
    addEvent(obj,"selectstart",function(){ return false;});
  }
}
function getCaretEnd(obj){
  if(typeof obj.selectionEnd != "undefined"){
    return obj.selectionEnd;
  }else if(document.selection&&document.selection.createRange){
    var M=document.selection.createRange();
    try{
      var Lp = M.duplicate();
      Lp.moveToElementText(obj);
    }catch(e){
      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();
    try{
      var Lp = M.duplicate();
      Lp.moveToElementText(obj);
    }catch(e){
      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();
  }
}
function setSelection(obj,s,e){
  obj.focus();
  if (obj.setSelectionRange){
    obj.setSelectionRange(s,e);
  }else if(obj.createTextRange){
    m = obj.createTextRange();    
    m.moveStart('character',s);
    m.moveEnd('character',e);
    m.select();
  }
}
String.prototype.addslashes = function(){
  return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
//" the above string confuses emacs syntax highlighting - this restores it
}
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};
function curTop(obj){
  toreturn = 0;
  while(obj){
    toreturn += obj.offsetTop;
    obj = obj.offsetParent;
  }
  return toreturn;
}
function curLeft(obj){
  toreturn = 0;
  while(obj){
    toreturn += obj.offsetLeft;
    obj = obj.offsetParent;
  }
  return toreturn;
}
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}
function replaceHTML(obj,text){
  while(el = obj.childNodes[0]){
    obj.removeChild(el);
  };
  obj.appendChild(document.createTextNode(text));
}

function actb(obj,ca,path){
  /* ---- Public Variables ---- */
  this.actb_timeOut = -1; // Autocomplete Timeout in ms (-1: autocomplete never time out)
  this.actb_lim = 10;    // Number of elements autocomplete can show (-1: no limit)
  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.actb_lastdownload = '';  // last string sent to server
  /* ---- Public Variables ---- */

  /* --- Styles --- */
  this.actb_bgColor = '#FFFFFF';
  this.actb_textColor = '#000000';
  this.actb_hColor = '#c0c0c0';
  this.actb_fFamily = 'Verdana';
  this.actb_fSize = '11px';
  this.actb_hStyle = 'text-decoration:underline;font-weight:bold;';
  this.actb_borderStyle = '1px solid black';
  /* --- Styles --- */

  /* ---- 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;
  this.actb_keywords = new Array();
  /* ---- Private Variables---- */
  
  this.actb_keywords = ca;
  var actb_self = this;

  actb_curr = obj;

  addEvent(actb_curr,"focus",actb_setup);
  function actb_setup(){
    addEvent(document,"keydown",actb_checkkey);
    addEvent(actb_curr,"blur",actb_clear);
    addEvent(document,"keypress",actb_keypress);
  }

  function actb_clear(evt){
    if (!evt) evt = event;
    removeEvent(document,"keydown",actb_checkkey);
    removeEvent(actb_curr,"blur",actb_clear);
    removeEvent(document,"keypress",actb_keypress);
    actb_removedisp();
  }
  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.match.search(re);

    for (i=0;i<p;i++){
      tobuild += n.disp.substr(i,1);
    }
    tobuild += "<font style='"+(actb_self.actb_hStyle)+"'>"
    for (i=p;i<plen+p;i++){
      tobuild += n.disp.substr(i,1);
    }
    tobuild += "</font>";
      for (i=plen+p;i<n.disp.length;i++){
      tobuild += n.disp.substr(i,1);
    }
    return tobuild;
  }
  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.cellSpacing='1px';
    a.cellPadding='2px';
    a.style.position='absolute';
    a.style.top = eval(curTop(actb_curr) + actb_curr.offsetHeight) + "px";
    a.style.left = curLeft(actb_curr) + "px";
    a.style.backgroundColor=actb_self.actb_bgColor;
    a.id = 'tat_table';
    a.style.border = actb_borderStyle;
    document.body.appendChild(a);
    var i;
    var first = true;
    var j = 1;
    if (actb_self.actb_mouse){
      a.onmouseout = actb_table_unfocus;
      a.onmouseover = actb_table_focus;
    }
    var counter = 0;

    for (i=0;i<actb_self.actb_keywords.length;i++){
      if (actb_bool[i]){
        counter++;
        r = a.insertRow(-1);
        if (first && !actb_tomake){
          r.style.backgroundColor = actb_self.actb_hColor;
          first = false;
          actb_pos = counter;
        }else if(actb_pre == i){
          r.style.backgroundColor = actb_self.actb_hColor;
          first = false;
          actb_pos = counter;
        }else{
          r.style.backgroundColor = actb_self.actb_bgColor;
        }
        r.id = 'tat_tr'+(j);
        c = r.insertCell(-1);
        c.style.color = actb_self.actb_textColor;
        c.style.fontFamily = actb_self.actb_fFamily;
        c.style.fontSize = actb_self.actb_fSize;
        c.innerHTML = actb_parse(actb_self.actb_keywords[i]);
        c.id = 'tat_td'+(j);
        c.setAttribute('pos',j);
        if (actb_self.actb_mouse){
          c.style.cursor = 'pointer';
          c.onclick=actb_mouseclick;
          c.onmouseover = actb_table_highlight;
        }
        j++;
      }
      if (j - 1 == actb_self.actb_lim && j < actb_total){
        r = a.insertRow(-1);
        r.style.backgroundColor = actb_self.actb_bgColor;
        c = r.insertCell(-1);
        c.style.color = actb_self.actb_textColor;
        c.style.fontFamily = 'arial narrow, sans-serif';
        c.style.fontSize = actb_self.actb_fSize;
        c.align='center';
        replaceHTML(c,'\\/');
        if (actb_self.actb_mouse){
          c.style.cursor = 'pointer';
          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) + actb_curr.offsetHeight) + "px";
    a.style.left = curLeft(actb_curr) + "px";
    a.style.backgroundColor=actb_self.actb_bgColor;
    a.style.border = actb_borderStyle;
    a.id = 'tat_table';
    if (actb_self.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_self.actb_bgColor;
      c = r.insertCell(-1);
      c.style.color = actb_self.actb_textColor;
      c.style.fontFamily = 'arial narrow, sans-serif';
      c.style.fontSize = actb_self.actb_fSize;
      c.align='center';
      replaceHTML(c,'/\\');
      if (actb_self.actb_mouse){
        c.style.cursor = 'pointer';
        c.onclick = actb_mouse_up;
      }
    }
    for (i=0;i<actb_self.actb_keywords.length;i++){
      if (actb_bool[i]){
        if (j >= actb_rangeu && j <= actb_ranged){
          r = a.insertRow(-1);
          r.style.backgroundColor = actb_self.actb_bgColor;
          r.id = 'tat_tr'+(j);
          c = r.insertCell(-1);
          c.style.color = actb_self.actb_textColor;
          c.style.fontFamily = actb_self.actb_fFamily;
          c.style.fontSize = actb_self.actb_fSize;
          c.innerHTML = actb_parse(actb_self.actb_keywords[i]);
          c.id = 'tat_td'+(j);
          c.setAttribute('pos',j);
          if (actb_self.actb_mouse){
            c.style.cursor = 'pointer';
            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_self.actb_bgColor;
      c = r.insertCell(-1);
      c.style.color = actb_self.actb_textColor;
      c.style.fontFamily = 'arial narrow, sans-serif';
      c.style.fontSize = actb_self.actb_fSize;
      c.align='center';
      replaceHTML(c,'\\/');
      if (actb_self.actb_mouse){
        c.style.cursor = 'pointer';
        c.onclick = actb_mouse_down;
      }
    }
    document.body.appendChild(a);

  }
  function actb_goup(){
    if (!actb_display) return;
    if (actb_pos == 1) return;
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
    actb_pos--;
    if (actb_pos < actb_rangeu) actb_moveup();
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
    if (actb_toid) clearTimeout(actb_toid);
    if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_self.actb_timeOut);
    // opera sometimes needs coaxing to redraw the element
    if (window.opera) {
	document.getElementById('tat_table').style.display='none';
	document.getElementById('tat_table').style.display='block';
    }
  }
  function actb_godown(){
    if (!actb_display) return;
    if (actb_pos == actb_total) return;
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
    actb_pos++;
    if (actb_pos > actb_ranged) actb_movedown();
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
    if (actb_toid) clearTimeout(actb_toid);
    if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_self.actb_timeOut);
    // opera sometimes needs coaxing to redraw the element
    if (window.opera) {
	document.getElementById('tat_table').style.display='none';
	document.getElementById('tat_table').style.display='block';
    }
  }
  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_self.actb_bgColor;
    actb_pos++;
    actb_movedown();
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
    actb_curr.focus();
    actb_mouse_on_list = 0;
    if (actb_toid) clearTimeout(actb_toid);
    if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_self.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_self.actb_bgColor;
    actb_pos--;
    actb_moveup();
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
    actb_curr.focus();
    actb_mouse_on_list = 0;
    if (actb_toid) clearTimeout(actb_toid);
    if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_self.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_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_self.actb_timeOut);
  }
  function actb_table_highlight(){
    actb_mouse_on_list = 1;
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_bgColor;
    actb_pos = this.getAttribute('pos');
    while (actb_pos < actb_rangeu) actb_moveup();
    while (actb_pos > actb_ranged) actb_movedown();
    document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_self.actb_hColor;
    if (actb_toid) clearTimeout(actb_toid);
    if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_self.actb_timeOut);
  }
  /* ---- */

  function actb_insertword(a){
    if (actb_self.actb_delimiter.length > 0){
      str = '';
      l=0;
      for (i=0;i<actb_delimwords.length;i++){
        if (actb_cdelimword == i){
          prespace = postspace = '';
          gotbreak = false;
          for (j=0;j<actb_delimwords[i].length;++j){
            if (actb_delimwords[i].charAt(j) != ' '){
              gotbreak = true;
              break;
            }
            prespace += ' ';
          }
          for (j=actb_delimwords[i].length-1;j>=0;--j){
            if (actb_delimwords[i].charAt(j) != ' ') break;
            postspace += ' ';
          }
          str += prespace;
          str += a;
          l = str.length;
          if (gotbreak) str += postspace;
        }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_self.actb_keywords.length;i++){
      if (actb_bool[i]) c++;
      if (c == actb_pos){
	  word = actb_self.actb_keywords[i].disp;
	word=word.replace('\r','');
        break;
      }
    }
    actb_insertword(word);
    l = getCaretStart(actb_curr);
  }
  function actb_removedisp(){
    if (actb_mouse_on_list==0){
      actb_display = 0;
      if (document.getElementById('tat_table')){ document.body.removeChild(document.getElementById('tat_table')); }
      if (actb_toid) clearTimeout(actb_toid);
    }
  }
  function actb_keypress(e){
    if (actb_caretmove) stopEvent(e);
    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;
      // NMA: Nov 2006  -  split tab and CR and gave tab new properties
      case 9:
        if (actb_display) {
          actb_caretmove = 1;
	  actb_display = 0;
          if (document.getElementById('tat_table')){ document.body.removeChild(document.getElementById('tat_table')); }
          if (actb_toid) clearTimeout(actb_toid);
          return false;
        } else {
          return true;
        }
        break;      
      case 13:
        if (actb_display) {
          actb_caretmove = 1;
          actb_penter();
          return false;
        } else {
          return true;
        }
        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_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");
    }
    if(actb_self.actb_lastdownload == '') {
      Download_Candidates(t,actb_self);
    } else if(t.match(actb_self.actb_lastdownload) == null) {
      Download_Candidates(t,actb_self);
    }          
    actb_total = 0;
    actb_tomake = false;
    actb_kwcount = 0;
    for (i=0;i<actb_self.actb_keywords.length;i++){
      actb_bool[i] = false;
      if (re.test(actb_self.actb_keywords[i].match)){
        actb_total++;
        actb_bool[i] = true;
        actb_kwcount++;
        if (actb_pre == i) actb_tomake = true;
      }
    }

    if (actb_toid) clearTimeout(actb_toid);
    if (actb_self.actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_self.actb_timeOut);

    actb_generate();
  }

  function Download_Candidates(t,actb_self) {
    xmlhttp=null
    // clear keywords now, so we don't get stuff from old set
    actb_self.actb_keywords = new Array();
    // first for all but IE, else for IE
    if (window.XMLHttpRequest) {
      xmlhttp=new XMLHttpRequest()
    } else if (window.ActiveXObject) {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
    }
    if (xmlhttp!=null) {
      xmlhttp.onreadystatechange=function() {
        // if xmlhttp shows "loaded"
        if (xmlhttp.readyState==4) {
          // if "OK"
          if (xmlhttp.status==200) {
            var response = xmlhttp.responseText;
            actb_self.actb_keywords = explode('\n',response);
	    actb_self.actb_lastdownload = t;
            actb_tocomplete(0);  // dummy value
          } 
        }
      };
      if(path == null)
	  path = "../cgi-bin/match.cgi";
      xmlhttp.open("GET",path+"?"+t,true)
      xmlhttp.send(null)
    }
  }
  
  function explode(separator, string) {
    var list = new Array();
  
    if (separator == null) return false;
    if (string == null) return false;
  
    var currentStringPosition = 0;
    while (currentStringPosition<string.length) {
      var nextIndex = string.indexOf(separator, currentStringPosition);
      if (nextIndex == -1) break;
      var word = string.slice(currentStringPosition, nextIndex);
      word=word.replace('\r','');
      list.push({disp:word,match:UTF8_Folded(word)});
      currentStringPosition = nextIndex+1;
    }
    if (list.length<1) {
	list.push({disp:string,match:UTF8_Folded(string)});
    } else {
	list.push({disp:string.slice(currentStringPosition, string.length),match:UTF8_Folded(string.slice(currentStringPosition, string.length))});
    }
    return list;
  }
  return this;
}
  
/* This table is made by merging and capitalising two tables by
 * Andreas Gohr(andi@splitbrain.org) taken from his UTF helper
 * functions.  These are released under the GPL. */

var UTF8_table = {
    'à':'a', 'ô':'o', 'ď':'d', 'ḟ':'f', 'ë':'e', 'š':'s', 'ơ':'o', 
    'ß':'ss','ă':'a', 'ř':'r', 'ț':'t', 'ň':'n', 'ā':'a', 'ķ':'k', 
    'ŝ':'s', 'ỳ':'y', 'ņ':'n', 'ĺ':'l', 'ħ':'h', 'ṗ':'p', 'ó':'o', 
    'ú':'u', 'ě':'e', 'é':'e', 'ç':'c', 'ẁ':'w', 'ċ':'c', 'õ':'o', 
    'ṡ':'s', 'ø':'o', 'ģ':'g', 'ŧ':'t', 'ș':'s', 'ė':'e', 'ĉ':'c', 
    'ś':'s', 'î':'i', 'ű':'u', 'ć':'c', 'ę':'e', 'ŵ':'w', 'ṫ':'t', 
    'ū':'u','č':'c', 'ö':'oe', 'è':'e', 'ŷ':'y', 'ą':'a', 'ł':'l', 
    'ų':'u', 'ů':'u', 'ş':'s', 'ğ':'g', 'ļ':'l', 'ƒ':'f', 'ž':'z', 
    'ẃ':'w', 'ḃ':'b', 'å':'a', 'ì':'i', 'ï':'i', 'ḋ':'d', 'ť':'t', 
    'ŗ':'r', 'ä':'ae', 'í':'i', 'ŕ':'r', 'ê':'e', 'ü':'ue', 'ò':'o', 
    'ē':'e','ñ':'n', 'ń':'n', 'ĥ':'h', 'ĝ':'g', 'đ':'d', 'ĵ':'j', 
    'ÿ':'y', 'ũ':'u', 'ŭ':'u', 'ư':'u', 'ţ':'t', 'ý':'y', 'ő':'o', 
    'â':'a', 'ľ':'l', 'ẅ':'w', 'ż':'z', 'ī':'i', 'ã':'a', 'ġ':'g', 
    'ṁ':'m', 'ō':'o', 'ĩ':'i', 'ù':'u', 'į':'i', 'ź':'z', 'á':'a', 
    'û':'u', 'þ':'th', 'ð':'dh', 'æ':'ae', 'µ':'u',
    'À':'A', 'Ô':'O', 'Ď':'D', 'Ḟ':'F', 'Ë':'E', 'Š':'S', 'Ơ':'O', 
    'ß':'SS','Ă':'A', 'Ř':'R', 'Ț':'T', 'Ň':'N', 'ā':'A', 'Ķ':'K', 
    'Ŝ':'S', 'Ỳ':'Y', 'Ņ':'N', 'Ĺ':'L', 'ħ':'H', 'Ṗ':'P', 'Ó':'O', 
    'Ú':'U', 'ě':'E', 'É':'E', 'Ç':'C', 'Ẁ':'W', 'Ċ':'C', 'Õ':'O', 
    'Ṡ':'S', 'Ø':'O', 'Ģ':'G', 'ŧ':'T', 'Ș':'S', 'Ė':'E', 'Ĉ':'C', 
    'Ś':'S', 'Î':'I', 'Ű':'U', 'Ć':'C', 'Ę':'E', 'Ŵ':'W', 'Ṫ':'T', 
    'ū':'U', 'Č':'C', 'Ö':'OE', 'È':'E', 'Ŷ':'Y', 'Ą':'A', 'ł':'L', 
    'Ų':'U', 'Ů':'U', 'Ş':'S', 'Ğ':'G', 'Ļ':'L', 'Ƒ':'F', 'Ž':'Z', 
    'Ẃ':'W', 'Ḃ':'B', 'Å':'A', 'Ì':'I', 'Ï':'I', 'Ḋ':'D', 'Ť':'T', 
    'Ŗ':'R', 'Ä':'AE', 'Í':'I', 'Ŕ':'R', 'Ê':'E', 'Ü':'UE', 'Ò':'O', 
    'ē':'E', 'Ñ':'N', 'Ń':'N', 'Ĥ':'H', 'Ĝ':'G', 'đ':'D', 'Ĵ':'J', 
    'Ÿ':'Y', 'Ũ':'U', 'Ŭ':'U', 'Ư':'U', 'Ţ':'T', 'Ý':'Y', 'Ő':'O', 
    'Â':'A', 'Ľ':'L', 'Ẅ':'W', 'Ż':'Z', 'ī':'I', 'Ã':'A', 'Ġ':'G', 
    'Ṁ':'M', 'ō':'O', 'Ĩ':'I', 'Ù':'U', 'Į':'I', 'Ź':'Z', 'Á':'A', 
    'Û':'U', 'Þ':'TH', 'Ð':'DH', 'Æ':'AE'
};

function UTF8_Folded(inp) {
  var retv = "";
  for(i=0; i<inp.length;i++) {
      var x = inp.charAt(i);
      if(UTF8_table[x] && typeof(UTF8_table[x]) != 'undefined')
	  retv += UTF8_table[x];
      else
	  retv += x;
  }
  return retv;
}
