
xfJS = {
	logOutputNode : null,	

	recognizeBrowser: function(){
		var ns6=(document.getElementById&&!document.all)?1:0;
		var ns=(document.layers)?1:0;
		var ie=(document.all)?1:0;
		if(ns || ns6){
			return 'NS';
		}else{
			return 'IE';
		} 
	},
	
	initLog : function(outputElementId){
		outputNode = $(outputElementId);
		if(outputNode != null){
			this.logOutputNode = outputNode;
		}else{
			this.createLogOutputNode();
		}
	},
	
	createLogOutputNode : function(){
		var bodyRef = document.getElementsByTagName("body").item(0);
		var divElement = document.createElement("div");
		divElement.style.position='absolute';	
		divElement.style.overflow='scroll';
		divElement.style.top='0px';
		divElement.style.right='0px';
		divElement.style.height='150px';
		divElement.style.width='450px';
		divElement.style.fontSize='12px';
		divElement.style.display='block';
		divElement.style.background='white';
		divElement.style.border='1px solid black';
		divElement.style.color='black';
		divElement.style.opacity='0.9';
		divElement.style.filter='alpha(opacity=90)';				
		this.logOutputNode = bodyRef.appendChild(divElement);
	},
	
	log : function(string) 
	{  
    	if (this.logOutputNode == null)
    	{  
    		this.initLog();
    	}    	
     	this.logOutputNode.appendChild(document.createTextNode(string));
     	this.logOutputNode.appendChild(document.createElement('br'));
	}
}



xfSuggest = {
    suggestDisplayNode: null,
    suggestInputNode: null,
    parameter: null,
    activ : false,
    wait : null,
	waitOn : null,
    browser:'IE',
	
	initWindow : function(suggestDisplayNodeId,suggestInputNodeId,parameter)
	{
		this.waitOn = null;				
		this.suggestDisplayNode = $(suggestDisplayNodeId);		
		this.suggestInputNode = $(suggestInputNodeId);		
		this.active = 1;
		if(parameter != null){
			this.parameter = parameter;
		}		
		this.updateContent();				
	},


	createWindow : function()
	{
		xfSuggest.createSuggestDisplayNode();
		if(xfJS.recognizeBrowser() == 'NS'){
		    xfSuggest.browser = 'NS';
	    	    document.captureEvents(Event.FOCUS); 
		}			
	    document.onkeypress = xfSuggest.checkFocus;
		document.onselect = xfSuggest.checkFocus;
		document.onclick = xfSuggest.checkFocus;    	
	},
	

	applyWindow: function(suggestInputNode, parameter, active)
	{	
		this.waitOn = 1;	
		if(active != null){
			this.active = active;
		}else{
			this.active = null;
			return;
		}		
		if(suggestInputNode == null){
				xfJS.log("appendSuggest Error: Die InputNode ist nicht gesetzt");
		 		return;
		}else{
			this.resetListener();
			this.suggestInputNode = suggestInputNode;
		}		 
		if(parameter != null){
			this.parameter = parameter;
		}		
		if(this.suggestDisplayNode == null){
			this.createWindow();
		}

		this.applyListener();			
		this.updateContent();		
	},	
	
	
	resetListener : function(){
		if(this.suggestInputNode != null){
			this.suggestInputNode.onkeyup = null;
		} 
		if(this.suggesDisplayNode != null){
			this.suggestDisplayNode.onmousemove = null;
		}
	},
	
	
	applyListener : function(){
		this.suggestInputNode.onkeyup = xfSuggest.inputListener; 	
		this.suggestDisplayNode.onmousemove = xfSuggest.mouseListener;		 
		this.suggestDisplayNode.onclick = xfSuggest.setValue;
	},

    getEvent : function(event){
	return (xfSuggest.browser == 'IE' ? window.event : event);
    },
	
	inputListener : function(event) {
	    event = xfSuggest.getEvent(event);
    	    var node = xfSuggest.getEventTarget(event);
    	if(node != null && xfSuggest.suggestInputNode == node) {
			if(event.keyCode == 38) {
				xfSuggest.moveSelection(0);
				xfSuggest.setValue();
			} else if(event.keyCode == 40) {
				xfSuggest.moveSelection(1);
				xfSuggest.setValue();
			} else {
				xfSuggest.updateContent();
			}
			
    	}
	},	
	
	setValue : function(){				
		var c = xfSuggest.suggestDisplayNode.getElementsByTagName('tr');
		var i = xfSuggest.getSelect(c);
		if(i!=null && c != null){
			var d = c.item(i).getElementsByTagName('td');
			xfSuggest.suggestInputNode.value = d.item(0).firstChild.nodeValue;
		}
	},
	
	moveSelection : function(dir){		 
		var c = xfSuggest.suggestDisplayNode.getElementsByTagName('tr');
		if(c != null){
			var i = xfSuggest.getSelect(c);
			var n = 0;
			if(i!=null){
				c.item(i).className = null;
				if(dir == 0){			
					n=i-1;
					if(n >= 0){ c.item(n).className = 'select'; }else{c.item(0).className = 'select';}
				}
				if(dir == 1){
					n=i+1;
					if(n < c.length){ c.item(n).className = 'select'; }else{c.item(c.length-1).className = 'select';}		
				}
			}else{
				c.item(0).className = 'select';
			}
		}
	},
	
	close : function(){
		xfSuggest.active = null;
		xfSuggest.suggestDisplayNode.style.display = 'none';  
	},
	
	getSelect : function(c){
		var p=null;
		for(i=0;i<c.length;i++){
			if(c.item(i).className == 'select'){				
				p=i;
				break; 
			}
		}
		return p;
	},
	
	createSuggestDisplayNode : function(){
		var bodyRef = document.getElementsByTagName("body").item(0);
		var div = document.createElement("div");
		div.id = 'suggestWindow';
		var stl = div.style;
		stl.position='absolute';	
		stl.overflow='hidden';
		stl.top='0px';
		stl.left='0px';
		stl.height='200px';
		stl.width='300px';
		stl.fontSize='12px';
		stl.display='none';
		stl.background='white';
		stl.border='1px solid black';
		stl.opacity='0.90';
		stl.filter='alpha(opacity=90)';				
		this.suggestDisplayNode = bodyRef.appendChild(div);
	},
	
	
	checkFocus: function(event) {
		if(xfSuggest.active != null) {				
    		    var node = xfSuggest.getEventTarget(xfSuggest.getEvent(event));	    
    		if(node != null && (xfSuggest.suggestInputNode == node || xfSuggest.isInnerElement(node, xfSuggest.suggestDisplayNode, 4)))
    		{

				var pos = xfSuggest.findPos(xfSuggest.suggestInputNode);
				xfSuggest.suggestDisplayNode.style.display = 'block';			
				xfSuggest.suggestDisplayNode.style.left = pos[0]+"px";			
				xfSuggest.suggestDisplayNode.style.top  = (pos[1]+20)+"px";
				xfSuggest.wait = setInterval('xfSuggest.waitForCloseNode()',1);			
    		}
    		else
    		{
				xfSuggest.suggestDisplayNode.style.display = 'none';
    		}
    	}
	},

	waitForCloseNode : function(){
		var close = $('suggestClose');
		if(close != null && close != undefined){
			xfSuggest.suggestDisplayNode.style.height = (close.offsetTop+20)+"px";
			clearInterval(xfSuggest.wait);
		}					
	},


	updateContent: function(){
		if(xfSuggest.active != null){
			var request = new Array();
			var i = 0;
			if(xfSuggest.parameter != null){
				for (var property in xfSuggest.parameter){
					request[i] = property+'='+xfSuggest.parameter[property];i++;
				}
			}
			request[i] = 'suggest='+xfSuggest.suggestInputNode.value;i++
			request[i] = 'action=suggest';
			new Ajax.Updater(xfSuggest.suggestDisplayNode.id,'xajax', {parameters: request.join("&") });
			if(xfSuggest.waitOn != null){
				xfSuggest.wait = setInterval('xfSuggest.waitForCloseNode()',1);
			}
		}
	},
    
    mouseListener : function(event){
		var node = xfSuggest.getEventTarget(xfSuggest.getEvent(event));
		var c = xfSuggest.suggestDisplayNode.getElementsByTagName('tr');
		var i = xfSuggest.getSelect(c);
		for(var j = 0;j<c.length;j++){			
			if(xfSuggest.isInnerElement(node, c.item(j) , 3) && i != j){
				if(i != undefined && i != null){
					c.item(i).className = null;
				}
				c.item(j).className = "select";				
				break;
			}
		}    	
    },
 
	findPos: function(obj) {
    	var curleft = curtop = 0;
    	if (obj.offsetParent) {
			curleft = obj.offsetLeft
			curtop = obj.offsetTop
			while (obj = obj.offsetParent) {
	    		curleft += obj.offsetLeft
	    		curtop  += obj.offsetTop
			}
    	}
    	return [curleft,curtop];
	},

	getEventTarget:function(e){
    	if(e != null){
    		if (e.srcElement != null){ 
				return e.srcElement;
			}else{
			 if (e.target != null){
			  return e.target;
			  }
			}
    	}
    	return null;
	},
	
	
	isInnerElement: function(element, of_element, depth){
    	if (element != null && depth >= 0) {
			if(element == of_element) return true;	 
			return xfSuggest.isInnerElement(element.parentNode, of_element, depth--);
    	}else{
			return false;
    	}
	}
}
