function Ajax() {
  //Eigenschaften deklarieren und initialisieren
  this.url="";
  this.params="";
  this.method="GET";
  this.onSuccess=null;
  this.onError=function (msg) {
    alert(msg)
  }
}

Ajax.prototype.doRequest=function() {
  //Ueberpruefen der Angaben
  if (!this.url) {
    this.onError("Es wurde kein URL angegeben. Der Request wird abgebrochen.");
    return false;
  }

  if (!this.method) {
    this.method="GET";
  } else {
    this.method=this.method.toUpperCase();
  }

  //Zugriff auf Klasse für readyStateHandler ermoeglichen
  var _this = this;

  //XMLHttpRequest-Objekt erstellen
  var xmlHttpRequest=getXMLHttpRequest();
  if (!xmlHttpRequest) {
    this.onError("Es konnte kein XMLHttpRequest-Objekt erstellt werden.");
    return false;
  }

  //Fallunterscheidung nach Uebertragungsmethode
  switch (this.method) {
    case "GET": xmlHttpRequest.open(this.method, this.url+"?"+this.params, true);
                xmlHttpRequest.onreadystatechange = readyStateHandler;
                xmlHttpRequest.send(null);
                break;
    case "POST": xmlHttpRequest.open(this.method, this.url, true);
                 xmlHttpRequest.onreadystatechange = readyStateHandler;
                 xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                 xmlHttpRequest.send(this.params);
                 break;
  }

  //Private Methode zur Verarbeitung der erhaltenen Daten
  function readyStateHandler() {
    if (xmlHttpRequest.readyState < 4) {
      return false;
    }
    if (xmlHttpRequest.status == 200 || xmlHttpRequest.status==304) {
      if (_this.onSuccess) {
        _this.onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
      }
    } else {
      if (_this.onError) {
        _this.onError("["+xmlHttpRequest.status+" "+xmlHttpRequest.statusText+"] Es trat ein Fehler bei der Datenbertragung auf.");
      }
    }
  }
}

//Gibt browserunabhaengig ein XMLHttpRequest-Objekt zurueck
function getXMLHttpRequest()
{
  if (window.XMLHttpRequest) {
    //XMLHttpRequest fuer Firefox, Opera, Safari, ...
    return new XMLHttpRequest();
  } else
  if (window.ActiveXObject) {
    try {
      //XMLHTTP (neu) fuer Internet Explorer
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        //XMLHTTP (alt) fuer Internet Explorer
        return new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        return null;
      }
    }
  }
  return false;
}













//Instanz der Klasse Ajax erzeugen und mit der Datenuebertragung starten
var key_navi = null;

function load(suchbegriff, div_id, txt_id, e, sprache)
{
  var eingabe  = suchbegriff.value;

  with (new Ajax())
  {
    var taste = e.keyCode? e.keyCode : e.charCode
    if(!(taste == 37 || taste == 38 || taste == 39 || taste == 40))
    {
      url="http://www.halbleiter.org/javascript/suggest.php";
      method="POST";
      params="eingabe="+eingabe+"&div_id="+div_id+"&txt_id="+txt_id+"&sprache="+sprache;
      onSuccess=successHandler;
      onError=errorHandler;
      doRequest();
    }
  }

  //Den Text in die Seite einfuegen
  function successHandler(txt,xml)
  {
    document.getElementById(div_id).innerHTML=txt;
    var suggest_div = document.getElementById(div_id);
    var txt_div = document.getElementById(txt_id);
    var lis = document.getElementById(div_id).getElementsByTagName('li').length;
    var suggest_list = document.getElementById('suggest_list');

    if(!key_navi)
    {
      key_navi = new keynavigation(suggest_list, div_id, txt_id);
    }
    else
    {
      key_navi.updateList(suggest_list);
    }

    if (lis == 0 || eingabe == "" || eingabe == "Suchbegriff")
    {
      suggest_div.style.visibility = 'hidden';
    }
    else if (suggest_div.innerHTML != "")
    {
      suggest_div.style.visibility = 'visible';
    }
  }

  //Fehler
  function errorHandler(msg)
  {
    document.getElementById(div_id).innerHTML=msg;
  }
}







// Abfraeg Akronyme + Kontaktformular
function abk(eingabe, span, buchstabe)
{
  var input = eingabe;
  var eingabe = document.getElementById(eingabe).value;

  with (new Ajax())
  {
    method = "POST";
    if(span == 'span_akronym')
    {
      url = 'http://www.halbleiter.org/akronym/akronym.php';
      params = "eingabe="+eingabe;
    }
    else if(span == 'span_akronym_liste')
    {
      url = 'http://www.halbleiter.org/akronym/tabelle_gefiltert.php';
      params = "eingabe="+eingabe+"&buchstabe="+buchstabe;
    }
    else
    {
      url = 'http://www.halbleiter.org/kontakt/check.php';
      params = "eingabe="+eingabe+"&input="+input;
    }
    onSuccess = successHandler;
    onError = errorHandler;
    doRequest();
  }

  //Den Text in die Seite einfuegen
  function successHandler(txt,xml)
  {
    document.getElementById(span).innerHTML=txt;
  }

  //Fehler
  function errorHandler(msg)
  {
    document.getElementById(span).innerHTML=msg;
  }
}








function insert_eingabe(begriff, txt_id, div_id)
{
  var txt = document.getElementById(txt_id);
  var div = document.getElementById(div_id);

  if (txt && div)
  {
    txt.value = begriff;
    div.style.visibility = 'hidden';
  }
}

function schliessen(div_id)
{
  document.getElementById(div_id).style.visibility = 'hidden';
}

function eingabe(eingabe_id)
{
  var eingabe = document.getElementById(eingabe_id);
  eingabe.focus();
}

function div_close(div_fast, div)
{
  if(document.getElementById(div_fast))
  {
    document.getElementById(div_fast).style.visibility = 'hidden';
  }

  if(document.getElementById(div))
  {
    document.getElementById(div).style.visibility = 'hidden';
  }
}








// Event Handling Funktion
function eventHandling(element,type,callBack,returnParams)
{
  var returnParams = returnParams;
  if(document.addEventListener) //gute Browser
  {
    if(type.match(/^on/)) type = type.replace(/^on/,"");
    element.addEventListener(type,handleEvent,false);
  }
  else
  { // IE
    if(!type.match(/^on/))  type = "on"+type;
    element.attachEvent(type,handleEvent);
  }

  function handleEvent (evt)
  {
    var event  = (evt)?evt:(window.event)?window.event:'';
    if(event.stopPropagation)
    {
      event.stopPropagation();
    }
    else
    {
      event.cancelBubble = true;
    }
    var target = event.srcElement || event.currentTarget;
    callBack.call(callBack,event,target,(returnParams)?returnParams:null);
  }
}

function keynavigation (obj, div_id, txt_id)
{
  var curElement  = null;
  obj.innerHTML   = clearSpaces(obj.innerHTML)
  var naviElement = obj;

  // gleich Events festnageln die brauchen nur einmal belegt werden
  // darum habe ich einen Singleton Pattern bei der anderen Klasse
  // ich kann keine Instanzen von der Tastennavigation anlegen
  // aber mehere Listen anhängen somit kann auch immer nur ein Event gesetzt werden
  // ist hier nun aber etwas schwieriger umzusetzen so also solltest Du darauf achten das es nur eine Listnavigation gibt
  eventHandling(document,"keydown",keyPressed);

  function clearSpaces (strOut)
  {
    strOut = strOut.replace(/li>\s+/gm,'li>');
    strOut = strOut.replace(/\s+<li/gm,'<li');
    strOut = strOut.replace(/li>\s+<li/gm,'li><li');
    return strOut;
  };

  function keyPressed (evt)
  {
    var curKey = evt.keyCode;
    switch (curKey)
    {
      case 38: // hoch
      if(curElement && !curElement.previousSibling)
      {
        curElement = naviElement.lastChild; //.previousSibling; // previousSibling wegen schließen-Link als letztes li-Element
        document.getElementById(txt_id).value = curElement.firstChild.id;
        curElement.style.backgroundColor = '#6990b6';
        curElement.style.color = '#ffffff';

        firstElement = naviElement.firstChild;
        firstElement.style.backgroundColor = '';
        firstElement.style.color = '';
      }
      else if(curElement && curElement.previousSibling)
      {
        curElement = curElement.previousSibling;
        document.getElementById(txt_id).value = curElement.firstChild.id;
        curElement.style.backgroundColor = '#6990b6';
        curElement.style.color = '#ffffff';

        if(curElement.nextSibling)
        {
          curElement.nextSibling.style.color = '';
          curElement.nextSibling.style.backgroundColor = '';
        }
      }
      else if(!curElement)
      {
        curElement = naviElement.lastChild; //.previousSibling;  // previousSibling wegen schließen-Link als letztes li-Element
        document.getElementById(txt_id).value = curElement.firstChild.id;
        curElement.style.backgroundColor = '#6990b6';
        curElement.style.color = '#ffffff';
      }
      break;

      case 40: // runter
      if(curElement)
      {
        if(!curElement.nextSibling)//.nextSibling) // übernächstes nextSibling wegen schließen-Link als letztes li-Element
        {
          curElement = naviElement.firstChild;
          document.getElementById(txt_id).value = curElement.firstChild.id;
          curElement.style.backgroundColor = '#6990b6';
          curElement.style.color = '#ffffff';

          lastElement = naviElement.lastChild;//.previousSibling;  // previousSibling wegen schließen-Link als letztes li-Element
          lastElement.style.backgroundColor = '';
          lastElement.style.color = '';

        }
        else if(curElement.nextSibling)
        {
          curElement = curElement.nextSibling;
          document.getElementById(txt_id).value = curElement.firstChild.id;
          curElement.style.backgroundColor = '#6990b6';
          curElement.style.color = '';

          if(curElement.previousSibling)
          {
            curElement.previousSibling.style.color = '';
            curElement.previousSibling.style.backgroundColor = '';
          }
        }
      }
      else
      {
        curElement = naviElement.firstChild;
        document.getElementById(txt_id).value = curElement.firstChild.id;
        curElement.style.backgroundColor = '#6990b6';
        curElement.style.color = '#ffffff';
      }
      break;

      case 13: // Enter Taste
      if(curElement)
      {
        document.getElementById(div_id).style.visibility = 'hidden';
      }
      break;

      case 9: // Tabulator
      if(curElement)
      {
        document.getElementById(div_id).style.visibility = 'hidden';
      }

      default:  return;
    }
  };

  this.updateList = function (obj_new_list)
  {
    obj_new_list.innerHTML = clearSpaces(obj_new_list.innerHTML)
    naviElement = obj_new_list;
    curElement = null;
  };
}