function HTTPClient() {
  var xmlHTTP = false;
  this.oncallback = false;
  this.busy = false;
  this.initialize = function() {
    try {
	  xmlHTTP = new ActiveXObject("Msxml2.XMLHTTP");
 	} catch(e) {
      try {
        xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        xmlHTTP = false;
	  }
	}		
    if (!xmlHTTP && typeof XMLHttpRequest != 'undefined') {
      xmlHTTP = new XMLHttpRequest();
    }
  }
	
  this.isSupported = function() {
    return (xmlHTTP != false);
  }
	
  this.post = function(url, str) {
    if (this.isSupported) {
      var thisObj = this;
	  this.busy = true;
      xmlHTTP.open("POST", url, true);
      xmlHTTP.onreadystatechange = function() {
        if(xmlHTTP.readyState == 4) {
          if(typeof thisObj.oncallback == 'function') {
	        thisObj.oncallback(xmlHTTP.responseText);
		  }
		  thisObj.busy = false;
        } 					
	  }			
      xmlHTTP.send(str)			
    }
  }
}

var xmlHTTP = new HTTPClient();
xmlHTTP.initialize();

var suggestTarget = null;
var suggestAlias = null;
var suggestForm = null;
var suggestListObj = null;

var suggestURL = baseURL + 'services/suggest.xml';
var suggestDefaultValue = '';
var suggestArray;
var suggestTypesArray;
var suggestTimer;
var suggestType;

var suggestSelected = 0;

window.onerror = function() {
  return true;
}

function clearSuggestList() {
  while (suggestListObj.childNodes.length > 0) {
    suggestListObj.removeChild(suggestListObj.childNodes[0]); 
  }
}

function suggestHandleMouseOver(e) {
  var targ;
  if(!e) { 
    var e = window.event;
  }
  if(e.target) {
    targ = e.target;
  } else if(e.srcElement) {
    targ = e.srcElement;
  }
  if(targ.nodeType == 3) {
    targ = targ.parentNode;
  }
  
  if(targ.className == 'suggest-type') {
    targ = targ.parentNode;
  }
  
  var targetId = (targ.id.substr(7, targ.id.length - 7));
  suggestSelect(targetId);
}

function suggestHandleClick(e) {
  var targ;
  if(!e) { 
    var e = window.event;
  }
  if(e.target) {
    targ = e.target;
  } else if(e.srcElement) {
    targ = e.srcElement;
  }
  if(targ.nodeType == 3) {
    targ = targ.parentNode;
  }
  
  if(targ.className == 'suggest-type') {
    targ = targ.parentNode;
  }  
  
  var targetId = (targ.id.substr(7, targ.id.length - 7));
  suggestTarget.value = suggestArray[targetId];
  suggestType.value = suggestTypesArray[targetId];
  suggestAlias.value = targ.getElementsByTagName('input')[0].value;
  if(suggestAlias.value > 0) {
    suggestType.value = 'Alias'; 
  }
  suggestForm.submit();
}

function addSuggestItem(title, type, id, listCount) {
  var item = document.createElement('div');
  item.setAttribute('id', 'suggest' + id); 
  item.setAttribute('nodeId', id); 
  var searchId = 0;
  if(type.charCodeAt(0) > 47 && type.charCodeAt(0) < 58) {
    var temp = type.split('-');
    type = type.substr(temp[0].length + 1);
    searchId = temp[0];
  }
  item.innerHTML = '<div class="suggest-type" onmouseover="suggestHandleMouseOver()">' + type + '</div>' + title + '<input type="hidden" value="' + searchId + '" />';
  item.onmouseover = suggestHandleMouseOver;
  item.onclick = suggestHandleClick;
  if(id == suggestSelected && listCount > 1) {
    item.className = 'selected';
  }
  suggestListObj.appendChild(item);
}

xmlHTTP.oncallback = function(responseText) {
  if(suggestListObj) {
    if(responseText.length == 0) {
      hideSuggest();
    } else {
      window.clearTimeout(suggestTimer);
      clearSuggestList();
      
      var item = document.createElement('div');
      item.innerHTML = '<strong>Meinen Sie:</strong>';
      suggestListObj.appendChild(item);
      
      responseText = unescape(responseText);
      suggestArray = responseText.split('\\');
      suggestTypesArray = new Array();
      suggestSelected = 0;
      for(var i = 0; i < suggestArray.length; i++) {
        var suggestVal = suggestArray[i].split(';');              
        suggestTypesArray[i] = suggestVal[1];
        addSuggestItem(suggestVal[0], suggestVal[1], i, suggestArray.length);
        suggestArray[i] = suggestVal[0];
      }
      showSuggest();
    }
  }
}

function suggestSelect(index) {
  var oldSelected = document.getElementById('suggest' + suggestSelected);
  oldSelected.className = '';
  var newSelected = document.getElementById('suggest' + index);
  newSelected.className = 'selected';
  suggestSelected = index;
}

function suggestNavigate(direction) {
  if(typeof suggestArray != 'undefined' && suggestArray.length == 0) {
    return;
  }
  if(direction == 'up') {
    var newSelected = suggestSelected - 1;
    if(newSelected < 0) {
      newSelected = suggestArray.length - 1;
    }
    suggestSelect(newSelected);
  } else {
    var newSelected = suggestSelected + 1;
    if(newSelected > suggestArray.length - 1) {
      newSelected = 0;
    }  
    suggestSelect(newSelected);
 }
 suggestTarget.value = suggestArray[suggestSelected];
 suggestType.value = suggestTypesArray[suggestSelected]; 
 suggestAlias.value = document.getElementById('suggest' + newSelected).getElementsByTagName('input')[0].value;
 if(suggestAlias.value > 0) {
   suggestType.value = 'Alias'; 
 } 
}

function suggestMatching() {
  if(typeof suggestArray != 'undefined') {
    var suggestVal = suggestTarget.value.toLowerCase();
    for(var i = 0; i < suggestArray.length; i++) {
      var currentVal = suggestArray[i].toLowerCase();
      if(currentVal.indexOf(suggestVal) == 0) {
        suggestSelect(i);
        return;
      }
    }  
  }
}

function suggestKeyHandler(e) {
  var searchVal = suggestTarget.value; 
  var e = (!e?window.event:e); 
  
  if(e.keyCode) {
    var keyCode = e.keyCode;
  } else if(e.which) {
    var keyCode = e.which;
  }  

  if(searchVal == '') {
    hideSuggest();
  }

  switch(keyCode) {
    case 38: 
      suggestNavigate('up');
      break;
    case 40: 
      suggestNavigate('down');
      break;  
    case 16:
    case 32:
	case 35:
	case 36:
	case 37:
	case 39:
      break;    
    default:
      if(searchVal != '') {
        suggestMatching();
        if(!xmlHTTP.busy) {
          xmlHTTP.post(suggestURL, searchVal);
        }
      }
  }
  e.returnValue = 'false';
  e.cancelBubble = true;
  e.preventDefault();  
}

function hideSuggest() {
  suggestListObj.style.visibility = 'hidden';
  showSelects();
}

function showSuggest() {
  suggestListObj.style.visibility = 'visible';
  hideSelects(suggestListObj);
}

function hideSuggestBox() {
  if(suggestListObj) {
    suggestTimer = window.setTimeout('hideSuggest()', 200);
    if(suggestTarget.value == '') {
      suggestTarget.value = suggestDefaultValue;
    }
  }
}

function suggestFocusHandler() {
  if(suggestDefaultValue == '') {
    suggestDefaultValue = suggestTarget.value;
  }
  if(suggestTarget.value == suggestDefaultValue) {
    suggestTarget.value = '';
  }
}

function initSuggest() {
  if(!xmlHTTP.isSupported) {
    return;
  }
  suggestTarget = document.getElementById('suche');
  if(suggestTarget) {
    suggestTarget.onkeyup = suggestKeyHandler;
    suggestTarget.onblur = hideSuggestBox;
    suggestTarget.onfocus = suggestFocusHandler;
  }
  
  suggestListObj = document.createElement('DIV');
  if(suggestListObj) {
    suggestListObj.setAttribute('id', 'suggest-box');
    document.getElementById('schnellsuche').appendChild(suggestListObj);
    suggestListObj.style.left = suggestTarget.offsetLeft + 'px';
    suggestListObj.style.top = suggestTarget.offsetTop + suggestTarget.offsetHeight + 'px';
  }
  
  suggestForm = document.getElementById('sucheform');
  
  suggestType = document.createElement('INPUT');
  suggestType.setAttribute('name', 'suchart');
  suggestType.setAttribute('value', '');
  suggestType.setAttribute('type', 'hidden');
  suggestForm.appendChild(suggestType);

  
  suggestAlias = document.createElement('INPUT');
  suggestAlias.setAttribute('name', 'suchalias');
  suggestAlias.setAttribute('value', '');
  suggestAlias.setAttribute('type', 'hidden');
  suggestForm.appendChild(suggestAlias);
}

onLoadHandlers[onLoadHandlers.length] = initSuggest;
