// -------------------------------------------------------------------
//
// Copyright 2008 - 2009 Digital Finance GmbH
// Alle Rechte vorbehalten
//
// -------------------------------------------------------------------

var QuickSearch = new Object();

QuickSearch.results = null;
QuickSearch.input = null;
QuickSearch.busy = null;

QuickSearch.init = function()
{
   QuickSearch.busy = document.createElement('div');
   QuickSearch.busy.id = 'qsBusy';
	document.getElementsByTagName('body')[0].appendChild(QuickSearch.busy);
   QuickSearch.results = document.createElement('div');
   QuickSearch.results.id = 'qsResults';
   QuickSearch.results.className = 'qs';
   document.getElementsByTagName('body')[0].appendChild(QuickSearch.results);
}

QuickSearch.addForm = function(id, pUrl, pTimeOut, pAlign, pResultWidth, pText, pColor, pBorder)
{
	var inputBox = getThis(id);
	inputBox.obj = {
		url:						pUrl,
		delay:					pTimeOut || 400,
		align:					pAlign || 'left',
		resultWidth:			pResultWidth || 652,
		activeRequest:       0,
		latestRequest:       null,
		lastValue:           '',
		resultsVisible:      0,
		selectedResult:      0,
		lastSelectedResult:  0
	};
	
	inputBox.setAttribute('autocomplete', 'off');
	
   var eh = new EventHandler(inputBox);
   eh.add('onkeyup', function(){QuickSearch.keyUp(inputBox);});
   eh.add('onkeydown', function(){QuickSearch.keyDown(inputBox);});
   eh.add('onkeypress', function(){QuickSearch.keyPress(inputBox);});
   eh.add('onblur', function(){QuickSearch.resetResultsDelayed(inputBox);});
   if (pText)
   {
   	var c  = pColor || '#b2c7c7';
   	var b = pBorder || '#004545';
   	eh.add('onblur', function(){IXprefill(pText, c, b, inputBox);});
	}
}

QuickSearch.keyUp = function(inputBox)
{
   if (inputBox.value.length <= 1)
   {
      QuickSearch.resetResults(inputBox);
   }
   else if (inputBox.value.length > 1 && inputBox.value != inputBox.obj.lastValue)
   {
      inputBox.obj.selectedResult = 0;
      if (inputBox.obj.activeRequest && inputBox.obj.latestRequest.readyState < 4)
      {
         inputBox.obj.latestRequest.onreadystatechange = function() {} 
         inputBox.obj.latestRequest.abort();
         inputBox.obj.activeRequest = 0;
      }
      
      if (!inputBox.obj.activeRequest)
      {
         if (window.XMLHttpRequest)
         {
            inputBox.obj.latestRequest = new XMLHttpRequest();
         }
         else if (window.ActiveXObject)
         {
            inputBox.obj.latestRequest = new ActiveXObject('Microsoft.XMLHTTP');
         }
         
         if (inputBox.obj.latestRequest)
         {
         	QuickSearch.setResultPosition(inputBox);
            QuickSearch.busy.style.display = 'block';
            inputBox.obj.activeRequest = 1;
            inputBox.obj.lastValue = inputBox.value;
            try
            {
               inputBox.obj.latestRequest.onreadystatechange = QuickSearch.showResults
               QuickSearch.input = inputBox;
               var url = inputBox.obj.url + escape(inputBox.value);
               inputBox.obj.latestRequest.open('GET', url, true);
               inputBox.obj.latestRequest.send(null);
            }
            catch (e)
            {
               QuickSearch.resetResults(inputBox);
            }
         }
      }
   }
}

QuickSearch.showResults = function()
{
	var inputBox = QuickSearch.input;
   if (inputBox.obj.activeRequest && inputBox.obj.latestRequest)
   {
      var readyState = inputBox.obj.latestRequest.readyState;
      if (readyState == 4)
      {
         var httpStatus = inputBox.obj.latestRequest.status;
         if (httpStatus == 404)
         {
            QuickSearch.resetResults(inputBox);
         }
         else if (httpStatus == 200)
         {
            QuickSearch.busy.style.display = 'none';
            QuickSearch.results.innerHTML = inputBox.obj.latestRequest.responseText;
            QuickSearch.setResultPosition(inputBox);
            QuickSearch.results.style.display = 'block';
            inputBox.obj.resultsVisible = 1;
            inputBox.obj.activeRequest = 0;
            QuickSearch.selectRow(1, inputBox);
         }
      }
   }
}

QuickSearch.resetResults = function(inputBox)
{
   if (inputBox.obj.latestRequest)
   {
      inputBox.obj.latestRequest.abort();
   }
   inputBox.obj.activeRequest = 0;
	inputBox.obj.latestRequest = null;
	inputBox.obj.lastValue = '';
	inputBox.obj.resultsVisible = 0;
	inputBox.obj.selectedResult = 0;
	inputBox.obj.lastSelectedResult = 0;
   QuickSearch.results.style.display = 'none';
   QuickSearch.busy.style.display = 'none';
}

QuickSearch.resetResultsDelayed = function(inputBox)
{
	QuickSearch.input = inputBox;
	if (QuickSearch.input)
	{
   	window.setTimeout('QuickSearch.resetResults(QuickSearch.input)', QuickSearch.input.obj.delay);
	}
}

QuickSearch.setResultPosition = function(inputBox)
{
	var posX = 0;
  	var posY = 0;
  	var boxHeight = inputBox.offsetHeight;
  	var boxWidth = inputBox.offsetWidth;
  	var el = inputBox;
  	var tmp;
  	
	while(el != null)
	{
 		posX += el.offsetLeft;
	 	posY += el.offsetTop;
	 	el = el.offsetParent;
  	}
  	
  	tmp = posX + boxWidth - 17;
  	QuickSearch.busy.style.left = tmp + 'px';
  	tmp = posY + 2;
	QuickSearch.busy.style.top = tmp + 'px';
	
  	posY += (boxHeight + 1);
 	if (inputBox.obj.align == 'right')
 	{
	 	posX = posX + boxWidth - (inputBox.obj.resultWidth + 2);
 	}
  	QuickSearch.results.style.left = posX + 'px';
	QuickSearch.results.style.top = posY + 'px';
	
	QuickSearch.results.style.width = inputBox.obj.resultWidth +'px';
}

QuickSearch.selectRow = function(direction, inputBox)
{
	if (inputBox.obj.resultsVisible && inputBox.value == inputBox.obj.lastValue)
	{
		var selectedResult = inputBox.obj.selectedResult;
		var nr = selectedResult + direction;
		if (document.getElementById('qsId-' + nr) == null)
		{
			return;
		}
		var row = document.getElementById('qsId-' + nr);
		row.className += " qsSelected";
		if (document.getElementById('qsId-' + selectedResult) != null)
		{
			var oldRow = document.getElementById('qsId-' + selectedResult);
			oldRow.className = oldRow.className.replace(" qsSelected", "");
		}
	  
		inputBox.obj.selectedResult = nr;
	}
}

QuickSearch.keyDown = function (inputBox)
{
   var keyCode = -1;
   if (window.event) { keyCode = event.keyCode; }
   else { keyCode = inputBox.eventHandler.evt.which; }
   
   if (keyCode == 13)
   {
      if (inputBox.obj.selectedResult)
      {
         inputBox.blur();
         var selectedResult = inputBox.obj.selectedResult;
         var row = document.getElementById('qsId-' + selectedResult);
         row.onclick();
         return false;
      }
      else
      {
      	inputBox.blur();
      	window.location.href = '/suche?suche=' + escape(inputBox.value);
      	return false;
      }
   }
   else if (window.event && keyCode == 38) { QuickSearch.selectRow(-1, inputBox); }
   else if (window.event && keyCode == 40) { QuickSearch.selectRow(1, inputBox); }
   return false;
}

QuickSearch.keyPress = function (inputBox)
{
	var keyCode = -1;
	if (window.event) { keyCode = event.keyCode; }
   else { keyCode = inputBox.eventHandler.evt.keyCode; }
   
	if (keyCode == 27) { inputBox.blur(); }
	else if (keyCode == 38) { QuickSearch.selectRow(-1, inputBox); }
	else if (keyCode == 40) { QuickSearch.selectRow(1, inputBox); }
}

GOYAX.addOnLoadEvent(window, QuickSearch.init);
