  // suggest

  function suggestInfoDiv(info) {
    document.getElementById("suggestInfoDiv").innerHTML = info;
  }

  //-------------------------------------------------------------------------

  function ajaxSuggestRequest(suggest) {
    var xmlHttpRequest = getXMLHttpRequest();

    if (xmlHttpRequest != null) {
      clearSuggest();

      xmlHttpRequest.onreadystatechange = function() {
        if (xmlHttpRequest.readyState == 4) {
          ajaxSuggestResponse(xmlHttpRequest.responseText);
        }
      }

      //param = "suggest=" + suggest.replace('ß','@');
      param = "suggest=" + encodeURI(suggest);
      //param = "suggest=" + suggest;
      //alert(param);

      //xmlHttpRequest.open("POST", "../AjaxSuggest", true);
      //xmlHttpRequest.open("POST", "http://www.trackyourkid.de:8080/wand/AjaxSuggest", true);
      //xmlHttpRequest.open("POST", "ajaxSuggest.php", true);
      //xmlHttpRequest.open("POST", "http://www.wandkarten-shop.de/servlet/AjaxSuggest", true);
      //xmlHttpRequest.open("POST", "/wandplan24/servlet/AjaxSuggest", true);
      xmlHttpRequest.open("GET", "/wandplan24/servlet/AjaxSuggest?" + param, true);
      //xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xmlHttpRequest.send(param);
    }
  }

  //-------------------------------------------------------------------------

  function ajaxSuggestResponse(responseText) {
    suggestArray = responseText.split("|");
    for ( var i = 0; i < suggestArray.length; i++) {
      if (suggestArray[i].length > 0) {
        appendSuggest(suggestArray[i], i);
      }
    }

    if (getSuggestRowCnt() > 0) {
      showSuggest();
    } else {
      stopSuggest();
    }
  }

  //-------------------------------------------------------------------------

  function getSuggestRowCnt() {
    return suggestTable.rows ? suggestTable.rows.length : -1;
  }

  //-------------------------------------------------------------------------

  function placeAndResizeSuggest() {
    var element = document.suggest.suggest;

    suggestTableStyle.border = "1px solid black";
    suggestTableStyle.left = evalPosition(element, "offsetLeft") + "px";
    suggestTableStyle.top = evalPosition(element, "offsetTop") + element.offsetHeight - 1 + "px";
    suggestTableStyle.width = element.offsetWidth + "px";
  }

  //-------------------------------------------------------------------------

  function isShownSuggest() {
    return suggestTableStyle.visibility == "visible";
  }

  //-------------------------------------------------------------------------

  function showSuggest() {
    placeAndResizeSuggest();
    suggestTableStyle.visibility = "visible";
  }

  //-------------------------------------------------------------------------

  function hideSuggest() {
    suggestTableStyle.visibility = "hidden";
  }

  //-------------------------------------------------------------------------

  function focusSuggest() {
    // Bringt den Cursor an das Zeielenende ???
    //var value = document.suggest.suggest.value;
    //document.suggest.suggest.value = value + " ";
    //document.suggest.suggest.value = value;
    document.suggest.suggest.focus();
  }

  //-------------------------------------------------------------------------

  function stopSuggest() {
    hideSuggest();
    suggestLine = -1;
    //focusSuggest();
  }

  //-------------------------------------------------------------------------

  function clickSuggest(evt) {
    //stopSuggest();
    hideSuggest();
    suggestLine = -1;
  }

  //-------------------------------------------------------------------------

  function createSuggest() {
    suggestTable = document.createElement("table");
    suggestTable.border = "0";
    suggestTable.cellSpacing = "0";
    suggestTable.cellPadding = "0";

    suggestTableStyle = suggestTable.style;
    suggestTableStyle.position = "absolute";
    suggestTableStyle.background = "white";

    document.body.appendChild(suggestTable);

    //-----

    registerEvent(document.suggest.suggest, "keyup", keySuggest);
    registerEvent(document, "click", clickSuggest);
    registerEvent(window, "resize", placeAndResizeSuggest);
  }

  //-------------------------------------------------------------------------

  function selectSuggest() {
    var elements = elementsForName("suggestTD");
    for ( var i = 0; i < elements.length; i++) {
      if (elements[i].line == suggestLine) {
        elements[i].style.background = "#fdbb13";
        elements[i].innerHTML = elements[i].innerHTML.replace("&gt;","");
        elements[i].innerHTML = "&gt;" + elements[i].innerHTML;
      } else {
        elements[i].style.background = "#fff";
        elements[i].innerHTML = elements[i].innerHTML.replace("&gt;","");
      }
    }
    focusSuggest();
  }

  //-------------------------------------------------------------------------

  function appendSuggest(text, line) {
    tdElement = document.createElement("td");

    try {
      if (text.indexOf("!") != -1) {
        var textB = document.createElement("b");
        textB.appendChild(document.createTextNode(text.substring(0,
            text.indexOf("!"))));
        tdElement.appendChild(textB);
        tdElement.appendChild(document.createTextNode(text.substr(text
            .indexOf("!") + 1)));
      } else {
        tdElement.appendChild(document.createTextNode(text));
      }
    } catch (e) {
    }

    tdElement.text = text.replace("!", "");
    tdElement.line = line;
    tdElement.name = "suggestTD";
    tdElement.onmouseover = function() {
      suggestLine = this.line;
      selectSuggest();
      return false;
    }
    tdElement.onmouseout = function() {
      suggestLine = -1;
      selectSuggest();
      return false;
    }
    tdElement.onclick = function() {
      document.suggest.suggest.value = suggestString = this.text;
      stopSuggest();
      return false;
    }

    row = suggestTable.insertRow(-1);
    row.appendChild(tdElement);
  }

  //-------------------------------------------------------------------------

  function clearSuggest() {
    while (getSuggestRowCnt() > 0) {
      suggestTable.deleteRow(0);
    }
  }

  //-------------------------------------------------------------------------

  function keySuggest(evt) {
    var suggesValue = document.suggest.suggest.value;
    var key = evt.keyCode;

    if (key == 27) {
      document.suggest.suggest.value = suggestString = "";
      stopSuggest();
      evt.cancelBubble = true;
      return false;
    }

    if (suggestString != suggesValue) {
      suggestString = suggesValue;

      if (suggestString.length > 0) {
        ajaxSuggestRequest(suggestString);
      } else {
        stopSuggest();
      }
    }

    if (isShownSuggest()) {
      if (key == 38 || key == 40) {
        if (key == 38) { // up
          if (suggestLine >= 0) {
            suggestLine--;
            // Bringt den Cursor an das Zeielenende ???
            var value = document.suggest.suggest.value;
            document.suggest.suggest.value = value + " ";
            document.suggest.suggest.value = value;
          } else {
            suggestLine = getSuggestRowCnt() - 1;
          }
        }
        if (key == 40) { // down
          if (suggestLine < getSuggestRowCnt() - 1) {
            suggestLine++;
          } else {
            suggestLine = -1;
          }
        }
        selectSuggest();
        return false;
      } else {
        if (key == 13) {
          if (suggestLine >= 0) {
            var elements = elementsForName("suggestTD");
            for ( var i = 0; i < elements.length; i++) {
              if (elements[i].line == suggestLine) {
                document.suggest.suggest.value = suggestString = elements[i].text;
              }
            }
          }
          stopSuggest();
          return false;
        } else {
          suggestLine = -1;
          selectSuggest();
        }
      }

      //suggestInfoDiv(key + " - " + suggestString + " - " + suggesValue + " - " + suggestLine);
    } else {
      if (key == 13) {
        submitSuggest('true');
      }
    }

    return false;
  }
