/*
 * Author: Martin Duchrow - md@dumaco.de
 * Organisation: DuMaCo Strategic + BI Solutions
 *  http://www.dumaco.de
*/
var getFunctionsUrl = "/suggest.php?keyword=";
var SuchUrl="http://www.graf-dichtungen.de/advanced_search_result.php?search_in_description=1&categories_id=&inc_subcat=1&UTF8=1&keywords=";
var autocompleteFlag = false;
var httpRequestKeyword = "";
var lastUserKeyword = "";
var suggestions = 0;
var suggestionMaxLength = 30;
var isKeyUpDownPressed = false;
var autocompletedKeyword = "";
var hasResults = false;
var timeoutId = -1;
var position = -1;
var oCacheKeyword = new Object();
var oCacheCount = new Object();
var minVisiblePosition = 0;
var maxVisiblePosition = 5;
var debugMode = true;
var xmlHttpGetSuggestions = createXmlHttpRequestObject();
function createXmlHttpRequestObject(){
  var xmlHttp;
  try { xmlHttp = new XMLHttpRequest();}
  catch(e) {
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
      "MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0",
      "MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)  {
      try { 
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);}
      catch (e) {}}}
  if (!xmlHttp) alert("Fehler beim Erzeugen des XMLHttpRequest-Objekts.");
  else return xmlHttp;}
function init(){  
  var oKeyword = document.getElementById("keyword");    
  oKeyword.setAttribute("autocomplete", "off");  
  oKeyword.value = "";
  setTimeout("checkForChanges()", 500);}
function addToCache(keyword, values, md_count){
  oCacheKeyword[keyword] = new Array();
  oCacheCount[keyword] = new Array();
  for(i=0; i<values.length; i++){
    oCacheKeyword[keyword][i] = values[i];
	oCacheCount[keyword][i] = md_count[i];}}
function checkCache(keyword){
  if(oCacheKeyword[keyword]){
    return true;}
  var md_return = false;
  for(i=keyword.length-2; i>=0; i--){
    var currentKeyword = keyword.substring(0, i+1);
    if(oCacheKeyword[currentKeyword]){
      var cacheResults = oCacheKeyword[currentKeyword];
	  var cacheCount = oCacheCount[currentKeyword];
      var keywordResults = new Array();
      var countResults = new Array();
      var keywordResultsSize = 0;
      for(j=0;j<cacheResults.length;j++){
        cacheResultsG = cacheResults[j].toUpperCase();
        if(cacheResultsG.indexOf(keyword.toUpperCase()) >= 0){
		  md_return = true;
          keywordResults[keywordResultsSize] = cacheResults[j];
		  countResults[keywordResultsSize++] = cacheCount[j];}}
	  addToCache(keyword, keywordResults, countResults);
      return md_return;}}
  return false;}
function getSuggestions(keyword){  
  if(keyword != "" && !isKeyUpDownPressed){
    isInCache = checkCache(keyword);
    if(isInCache == true){   
      httpRequestKeyword=keyword;
      lastUserKeyword=keyword;     
    for (i=0;i<oCacheKeyword[keyword].length; i++)
      displayResults(keyword, oCacheKeyword[keyword], oCacheCount[keyword]);}
    else {
      if(xmlHttpGetSuggestions){ 
        try{
          if (xmlHttpGetSuggestions.readyState == 4 ||
              xmlHttpGetSuggestions.readyState == 0){
            httpRequestKeyword = keyword;
            lastUserKeyword = keyword;
            xmlHttpGetSuggestions.open("GET", getFunctionsUrl + encode(keyword), true);
            xmlHttpGetSuggestions.onreadystatechange = handleGettingSuggestions;
            xmlHttpGetSuggestions.send(null);}
          else {
            lastUserKeyword = keyword;
            if(timeoutId != -1) clearTimeout(timeoutId);          
            timeoutId = setTimeout("getSuggestions(lastUserKeyword);", 500);}}
        catch(e){
          displayError("Kann Server nicht erreichen:\n" + e.toString());}}}}}
function xmlToArray(resultsXml){
  var resultsArray= new Array();  
  for(i=0;i<resultsXml.length;i++)
    resultsArray[i]= resultsXml.item(i).firstChild.data;
  return resultsArray;}
function handleGettingSuggestions(){
  if (xmlHttpGetSuggestions.readyState == 4){
    if (xmlHttpGetSuggestions.status == 200){
      try {
        updateSuggestions();}
      catch(e){
        displayError(e.toString());}}
    else {
      displayError("Problem beim Datenempfang:\n" + xmlHttpGetSuggestions.statusText);}}}
function updateSuggestions(){
  var response = xmlHttpGetSuggestions.responseText;
  if (response.indexOf("ERRNO") >= 0 
      || response.indexOf("error:") >= 0
      || response.length == 0)
    throw(response.length == 0 ? "Leere Server-Antwort." : response);
  response = xmlHttpGetSuggestions.responseXML.documentElement;
  nameArray = new Array();
  numberArray = new Array();
  if(response.childNodes.length){
    nameArray= xmlToArray(response.getElementsByTagName("name"));
	numberArray= xmlToArray(response.getElementsByTagName("number"));}
  if(httpRequestKeyword == lastUserKeyword)
    displayResults(httpRequestKeyword, nameArray, numberArray);
  else
    addToCache(httpRequestKeyword, nameArray, numberArray);}
function displayResults(keyword, results_array, count_array){  
  var div = "<table width='400' border='0'>";
  if((!oCacheKeyword[keyword] || (oCacheKeyword[keyword].length == 0)) && keyword)
    addToCache(keyword, results_array, count_array);
  if(results_array.length == 0){
    div += "<tr><td>Weiter suchen (Ohne Vorschlaege zu <strong>" + keyword + "</strong>)</td></tr>";
    hasResults = false;
    suggestions = 0;}
  else {
    position = -1;
    isKeyUpDownPressed = false;
    hasResults = true;
    suggestions = oCacheKeyword[keyword].length;
	div += "<tr><td><b>Vorschlag</ b></td><td><b>Anzahl</ b></td></tr>";
    for (var i=0; i<oCacheKeyword[keyword].length; i++){  
      crtSuchbegriff = oCacheKeyword[keyword][i];
      crtNumber = oCacheCount[keyword][i];
      crtSuchbegriffLink = crtSuchbegriff;
       div += "<tr id='tr" + i + 
             "' onclick='location.href=document.getElementById(\"a" + i + 
             "\").href;' onmouseover='handleOnMouseOver(this);' " + "onmouseout='handleOnMouseOut(this);'>" + 
             "<td align='left' width='50' ><a class='suggest_link' id='a" + i + "' href='" + SuchUrl + crtSuchbegriffLink;
      if(crtSuchbegriff.length <= suggestionMaxLength){
		var md_crtSuchbegriff = crtSuchbegriff.toUpperCase();
		var md_found = md_crtSuchbegriff.indexOf(httpRequestKeyword.toUpperCase());
		if (md_found > 0){
		  div += "'>" + (crtSuchbegriff.substring(0, md_found)) + "<b>" + (crtSuchbegriff.substring(md_found, md_found + httpRequestKeyword.length));
		  div += "</b>" + (crtSuchbegriff.substring(md_found + httpRequestKeyword.length, crtSuchbegriff.length)) + "</a></td>";}
		else {
		  div += "'><b>" + (crtSuchbegriff.substring(0, httpRequestKeyword.length)) + "</b>";
          div += (crtSuchbegriff.substring(httpRequestKeyword.length, crtSuchbegriff.length)) + "</a></td>";
		  }
		div += "<td align='right' width='50' >" + crtNumber + " Treffer</td></tr>";
      } else {
        if(httpRequestKeyword.length < suggestionMaxLength){
		if (md_found > 0){
		  div += "'>" + (crtSuchbegriff.substring(0, md_found)) + "<b>" + (crtSuchbegriff.substring(md_found, md_found + httpRequestKeyword.length));
		  div += "</b>"  + (crtSuchbegriff.substring(md_found + httpRequestKeyword.length, suggestionMaxLength)) + "</a></td>";}
		else {
          div += "'><b>" + (crtSuchbegriff.substring(0, httpRequestKeyword.length)) + "</b>"
          div += (crtSuchbegriff.substring(httpRequestKeyword.length, suggestionMaxLength)) + "</a></td></tr>";}
        } else {
          div += "'><b>" + crtSuchbegriff.substring(0,suggestionMaxLength) + "</b></td></tr>"}}}}
  div += "</table>";
  var oSuggest = document.getElementById("suggest");  
  var oScroll = document.getElementById("scroll");
  oScroll.scrollTop = 0;
  oSuggest.innerHTML = div;
  oScroll.style.visibility = "visible";
  if((results_array.length > 0) && autocompleteFlag)
    autocompleteKeyword();}
function checkForChanges(){
   var keyword = document.getElementById("keyword").value;
  if(keyword == ""){
    hideSuggestions();
    lastUserKeyword="";
    httpRequestKeyword="";}
  setTimeout("checkForChanges()", 500);
  if((lastUserKeyword != keyword) && (autocompletedKeyword != keyword) && (!isKeyUpDownPressed)){
    getSuggestions(keyword);}
  else if (!hasResults) getSuggestions(keyword);
  }
function handleKeyUp(e){
  e = (!e) ? window.event : e;
  target = (!e.target) ? e.srcElement : e.target;
  if (target.nodeType == 3) 
    target = target.parentNode;
  code = (e.charCode) ? e.charCode :
       ((e.keyCode) ? e.keyCode :
       ((e.which) ? e.which : 0));
  if (e.type == "keyup"){    
    isKeyUpDownPressed =false; 
    if ((code < 13 && code != 8) || 
        (code >=14 && code < 32) || 
        (code >= 33 && code <= 46 && code != 38 && code != 40) || 
        (code >= 112 && code <= 123)){
// uninteressante Zeichen werden ignoriert
    } else
    if(code == 13){
      if(position>=0){
        location.href = document.getElementById("a" + position).href;}}
    else
      if(code == 40){
        newTR=document.getElementById("tr"+(++position));
        oldTR=document.getElementById("tr"+(--position));
        if(position>=0 && position<suggestions-1)
          oldTR.className = "";
        if(position < suggestions - 1){
          newTR.className = "moduleRowOver";
          updateKeywordValue(newTR);
          position++;}
        e.cancelBubble = true;
        e.returnValue = false;
        isKeyUpDownPressed = true;        
        if(position > maxVisiblePosition){
          oScroll = document.getElementById("scroll");
          oScroll.scrollTop += 18;
          maxVisiblePosition += 1;
          minVisiblePosition += 1;}}
      else
      if(code == 38){
        newTR=document.getElementById("tr"+(--position));
        oldTR=document.getElementById("tr"+(++position));
        if(position>=0 && position <= suggestions - 1) oldTR.className = "";
        if(position > 0){
          newTR.className = "moduleRowOver";
          updateKeywordValue(newTR);
          position--;
          if(position<minVisiblePosition){
            oScroll = document.getElementById("scroll");
            oScroll.scrollTop -= 18;
            maxVisiblePosition -= 1;
            minVisiblePosition -= 1;}}
        else
          if(position == 0) position--;
        e.cancelBubble = true;
        e.returnValue = false;
        isKeyUpDownPressed = true;}}}
function updateKeywordValue(oTr){
  var oKeyword = document.getElementById("keyword");
  var crtLink = document.getElementById("a" + oTr.id.substring(2,oTr.id.length)).toString();
  crtLink = crtLink.substring(SuchUrl.length, crtLink.length);
  oKeyword.value = unescape(crtLink);}
function deselectAll(){
  for(i=0; i<suggestions; i++){
    var oCrtTr = document.getElementById("tr" + i);
    oCrtTr.className = "";}}
function handleOnMouseOver(oTr){
  deselectAll();  
  oTr.className = "moduleRowOver";  
  position = oTr.id.substring(2, oTr.id.length);}
function handleOnMouseOut(oTr){
  oTr.className = "";   
  position = -1;}
function encode(uri){
  if (encodeURIComponent) return encodeURIComponent(uri);
  if (escape) return escape(uri);}
function hideSuggestions(){
  var oScroll = document.getElementById("scroll");
  oScroll.style.visibility = "hidden";}
function selectRange(oText, start, length){
  if (oText.createTextRange){
    var oRange = oText.createTextRange(); 
    oRange.moveStart("character", start); 
    oRange.moveEnd("character", length - oText.value.length); 
    oRange.select();}
  else 
    if (oText.setSelectionRange) oText.setSelectionRange(start, length);
  oText.focus();}
function autocompleteKeyword(){
  var oKeyword = document.getElementById("keyword");
  position=0;
  deselectAll();
  document.getElementById("tr0").className="moduleRowOver";  
  updateKeywordValue(document.getElementById("tr0"));
  selectRange(oKeyword,httpRequestKeyword.length,oKeyword.value.length);  
  autocompletedKeyword=oKeyword.value;}
function displayError(message){
  alert("Fehler beim Zugriff auf den Server! "+ (debugMode ? "\n" + message : ""));}