
/*Zur Unterbindung des submit bei Enter.
* Im Form Tag muss eingebuden werden ( onsubmit="return getSubmitBool()" ).
* Im SubmitKnopf mus eingebunden werden ( onmousedown="setSubmitBool(true)" ).
* Oder die verwendung der Methode setSubmitButtons(array(submits)).
*/
//////////////////////////
var submitBool = false;	
var helper = null;		
function getSubmitBool() {
	//document.getElementById("reportForm").focus();
	window[helper].focus();
	return submitBool;
}
function setSubmitBoolTrue() {
	submitBool = true;
}
//////////////////////////


/**
*	Der FormValueHelper Zeigt Eingabevorschlg fr ein input tag an
*	Er trgt unter dem Inputfeld einen div ein. Dort werden die Inhalte des AjaxRequest eingeschrieben.
*	Per Mouseklick oder per PFeil und Enter Taste kann der Eintrag gewt werden. Dieser wird dann in das 
*	Input übernommen.
*	+ Jedes Imput das einen Helper haben soll muss ein Attribute "helper" haben in dem der Name des Colum stehen muss. s.h. seach()
*	+ Jedes dieser Inputs muss auch per style eine breite haben!
*
*
*	Beispiel für den benötigten AjayRequest wenn das Input name heist.(id=name1, id=name2)
*	<table unselectable="on">
*	  <tr unselectable="on">
*		<td set="value" class="value" id="name1" gesamt="2" unselectable="on">Castlevania - The Dracula X Chronicles</td>
*	  </tr>
*	  <tr unselectable="on">
*		<td set="value" class="value" id="name2" gesamt="2" unselectable="on">Wächter des Tages</td>
*	  </tr>
*	</table>
*
*
*	@author Tim Wettstein
*/
function FormValueHelper(url, subButtons, me) {
	
	var ajaxUrl = url;
	var thisName = me;
	var object = null;
	var infosichtbar = false;	//Info sichtbar ?
	var valueString = null;		//string des Vorschlages
	var valueIndex = null;		//aktuell selectierter Vorschlag
	var valueMaxIndex = null;	//maximale anzahl der aktuell gezeigten Vorschlge
	var submit = true;
	var timeout = null;
	var boolTimeout = false;
	var noAjaxFunction;

	
	var IE = false;
	var IE6 = false;
	var OPERA = false;
	if(navigator.appVersion.match(/MSIE 6/)) IE6 = true;
	if(navigator.appVersion.match(/MSIE/)) IE = true;
	if(navigator.appName.match(/Opera/)) OPERA = true;
	
	setSubmitButtons(subButtons); //die SudbitButtons bekommen den event onfocus
	window.helper = thisName; // fr focus auf object
	
	ini(); //start



	/*
	*	Initialisierung der Elemente, die Inputs mit helper-attribute bekommen Events
	*/
	function ini() {
		var elem = document.getElementsByTagName("INPUT");
		for(var i=0; i < elem.length; i++) {
			if(elem[i].getAttribute("helper") != null) {
				elem[i].onkeyup  = key;
				elem[i].onfocus  = hiddeInfo;
				elem[i].setAttribute("autocomplete", "off");
			}
			//alle anderen Inputs bekommen event ausgenommen mit attribute dbfields (kommt bei der suche vor!) 
			else if(elem[i].getAttribute("dbfields") == null) { 
				elem[i].onfocus  = hiddeInfo;
				elem[i].setAttribute("autocomplete", "off");
			}
		}
		var elem = document.getElementsByTagName("SELECT");
		for(var i=0; i < elem.length; i++) {
			elem[i].onfocus  = hiddeInfo;
		}		
		if(IE) { setSelectFieldsForIEBug(17);}
	}

	this.focus = function() {
		if(object) {
			object.focus();
		}
	}
	function focusInput() {		
		if(false == submit) {
			object.focus();
			submit = true;
		}
	}
	
	 function setSubmitButtons(array) {
		for(var i=0; i < array.length; ++i){
			if(document.getElementById(array[i])) {
				document.getElementById(array[i]).onfocus = focusInput;
				document.getElementById(array[i]).onmousedown = window.setSubmitBoolTrue;
			}
		}
	}
	

	/*
	*	Hier werden alle KEy-Events abgefangen und entsprechend verarbeitet
	*/	
	this.timerKey = function(keyCode, helper, value, nodeName) { 
		key(null, keyCode, helper, value, nodeName, true);
	}
	function key(dasEreignis, keyCode, helper, value, nodeName, set) {
		
		
		if(set) {
			//alert(keyCode+" - "+helper+" - "+value+" - "+nodeName);
		}
		else{						
			var meinEreignis = dasEreignis || window.event;
			var ereignisQuelle = meinEreignis.target || meinEreignis.srcElement;
			
			keyCode = meinEreignis.keyCode;
			helper = ereignisQuelle.getAttribute("helper");
			value = ereignisQuelle.value;
			nodeName = ereignisQuelle.nodeName;
		
			object = ereignisQuelle;
			if(value == "") return; //abbruch wenn input leer ist
			
			if(meinEreignis.keyCode != 9 && meinEreignis.keyCode != 40 && 
			   meinEreignis.keyCode != 38 && meinEreignis.keyCode != 27 && 
			   meinEreignis.keyCode != 13 && meinEreignis.keyCode != 39) {
			   			
				clearTimeout(timeout);
				timeout = setTimeout(function() {
					window[thisName].timerKey(keyCode, helper, value, nodeName)
				},500);
				
				return true;
			}
		}

		if(true) {
			//alert(meinEreignis.keyCode); 
						
			// pfeil-rechts oder pfeil-links/////////////////////////////////// enter :keyCode == 13 |
			if(keyCode == 39 | keyCode == 37)  { 			
				if(infosichtbar) { 
					setValue(); 
					submit=false;
					focusInput();
				}
				return true; 
			}
			
			// ESC /////////////////////////////////////
			if(keyCode == 27)  { 
				hiddeInfo; 
				return false; 
			}
			
			// tab ///////////////////////////////////
			if(keyCode == 9)  { 			
				hiddeInfo; 
				//alert("hidden all")
				return true;
			}
			
			// Pfeil unten /////////////////////////////
			if(keyCode == 40 && infosichtbar)  {
				var tr = object.getAttribute("name");
				
				if(null == valueMaxIndex) valueMaxIndex = parseInt(document.getElementById(tr+"1").getAttribute("gesamt"));
				if(null == valueIndex) {
					valueIndex = 1;
					setSelect(dasEreignis, document.getElementById(tr+"1"));
					return true;
				}
				
				if(valueIndex > 0 && valueIndex < valueMaxIndex) {
					valueIndex++;
					setSelect(dasEreignis, document.getElementById(tr+(valueIndex)));
				}
				return; 
			}

			// Pfeil oben /////////////////////////////
			if(keyCode == 38 && infosichtbar)  {
				var tr = object.getAttribute("name");
				
				if(null == valueMaxIndex) valueMaxIndex = parseInt(document.getElementById(tr+"1").getAttribute("gesamt"));
				if(null == valueIndex) {
					setSelect(dasEreignis, document.getElementById(tr+"1"));
					valueIndex = 1;
					return true;
				}
				
				if(valueIndex > 1 ) {
					valueIndex--;
					setSelect(dasEreignis, document.getElementById(tr+(valueIndex)));
				}
				return; 
			}
			
			if(nodeName == "INPUT") {
				seach(helper,value);
			}
		}		
	}


	/*
	*	Das Ajay-Request wird zusammengestellt und gesendet
	*	Die URL wird bei >new FormValueHelper(url)< bergeben.
	*	Das Helper-Attribute des Inputs wird mit bergeben.
	*	Das Value des Inputs wird bergeben
	*/
	function seach(helper, value)	{
		hiddeInfo();
	
	    
		//Alternative Function für Ajax. Kann über setNoAjaxFunction gesetzt werden. Diese muss den result  als "originalRequest.responseText" bringen.
		if(noAjaxFunction) {
			var request = noAjaxFunction(helper, value);			
			showResponse(request);		
			return;
		}		
		
		
		var pars = 'helper=' + helper + '&seach=' + value;
		    	    	
		var myAjax = new Ajax.Request(
			ajaxUrl, 
			{
				method: 'post', 
				parameters: pars, 
				onComplete: showResponse
			});
	}


	/**
	*	Das Egebnis des Request wird verarbeitet.
	*	1. Ein Div wird hinter dem Inpur eingesetzt.
	*	2. Inhalt des Requests wird in den Div geschrieben
	*	3. Alle <TD> mit Attribute set="value" werden mit Events belegt. --> setValueActions()
	*	4. Ist der Request nicht leer wird der Div angezeigt
	*/
	function showResponse(originalRequest)	{   			
		var div = document.createElement("div");
        var name = document.createAttribute("name");
        name.nodeValue = "valueHelper";
        var cl = document.createAttribute("class");
        cl.nodeValue = "valueHelper";
        var id = document.createAttribute("id");
        id.nodeValue = object.getAttribute("name")+"ValueHelper";
        
        div.setAttributeNode(name);
        div.setAttributeNode(cl);
        div.setAttributeNode(id);


		if(object.getAttribute("have") != "1") {
			var br = document.createElement("br");
			if(IE) {object.parentNode.appendChild(br);}
			object.parentNode.appendChild(div);	
			
			if(OPERA) div.style.marginTop = object.offsetHeight+(-8)+"px";
		}
		
		object.setAttribute("have", 1);
		object.setAttribute("autocomplete", "off");
           
	    var div = document.getElementById(object.getAttribute("name")+"ValueHelper");
		div.style.width = parseInt(object.style.width.replace("px","")) + 2 +"px";	    

	    //inhalt wird gesetzt
	    if(IE6) { //IE6 workarround fr select/div bug 
	    		  //Unter der Info kommt eine ein iframe zum abschotten der selectfields				  
	    	var ie6_inhalt = '<iframe id="'+object.getAttribute("name")+'Iframe" frameborder="0" style="width: 100%; height: 100px;"></iframe>';
	            ie6_inhalt+= '<div id="'+object.getAttribute("name")+'IframeOver" scrolling="no" scrollbarvisable="no" scroll="no" style="position:absolute; top:0px; left:0px; z-index:10; width:100%; height:100%; border:1px solid #FFCC00; background-color:#ffffff;">'+originalRequest.responseText;+'</div>';
	   			div.innerHTML = ie6_inhalt;
	   			
	   			div.style.display = "block";
	   			var iframeOver = document.getElementById(object.getAttribute("name")+"IframeOver");
	   			addCloser(iframeOver);
	   			var iframe = document.getElementById(object.getAttribute("name")+"Iframe");
	   			if(iframeOver.offsetHeight > 10)iframe.style.height = (iframeOver.offsetHeight)+"px";    			
	   			div.style.border = "1px solid #ffffff";
	   			div.style.width = parseInt(div.style.width)+1+"px"
	   			div.style.margin = "-1px";
	   			div.style.display = "none";
	    }
	    else {	
	    	//normale aktion   
	    	div.innerHTML = originalRequest.responseText; //inhalt in den div schreiben
	    	addCloser(div);
	    	div.style.display = "none";	
		}
    
	    if(originalRequest.responseText!="") {	    
		    div.style.display = "block";
		    setValueActions();	//die ihnalte (values) mit aktionen belegen, zur bernahme in das input
		    infosichtbar = true;
		}
	}
	
	
	function hiddeInfo() {		
		var elem = document.getElementsByTagName("DIV");
		for(var i=0; i < elem.length; ++i) {
			if(elem[i].getAttribute("name") == "valueHelper") {
				elem[i].style.display = "none";
				elem[i].innerHTML = "";
			}
		}
		infosichtbar = false;
		valueIndex = null;
		valueMaxIndex = null;
	}

	/**
	*	Der Inhalt des aktuell selectieren Vorschlages ist in valueString.
	*	Dieser wird in das Input geschrieben
	*/
	function setValue() {
		object.value = valueString; //ereignisQuelle.innerHTML;
		hiddeInfo();
        
        pz = valueString;
        document.getElementById('select_bl').selectedIndex = 0;
        loadPushpins('all', false);
        findAddress(valueString, "");
        
		valueString = "";
	}


	/**
	*	Alle <td> aus dem Request bekommen events
	*/
	function setValueActions() {
		var elem = document.getElementsByTagName("TD");
		for(var i=0; i < elem.length; i++) {
			if(elem[i].getAttribute("set") == "value") {
				elem[i].style.cursor = "pointer";
				elem[i].onmousedown = setValue;
				elem[i].onmouseover = setSelect;
			}
		}
	}


	/**
	*	Ein Vorschlag wird selectiert.
	*	dasEreignis = kommt von der Maus
	*	quelle = ist nicht null wenn event vom Keyboard kommmt (beinhaltet direkt die ereignisQuelle)
	*/	
	function setSelect(dasEreignis, quelle) { //Mouserereignis -/- Tastenereignis gibt das TD
		var meinEreignis = dasEreignis || window.event;
		var ereignisQuelle = meinEreignis.target || meinEreignis.srcElement;
	
		if(ereignisQuelle.nodeName == "TD" | meinEreignis.type == "mouseover"){
			valueIndex = ereignisQuelle.getAttribute("id").replace(object.getAttribute("name"), "");
		}
		if(quelle) {
			ereignisQuelle = quelle;
		}
		
		if(ereignisQuelle.style.backgroundColor == "") {
			setColor(true,ereignisQuelle)
		}
		else {
			setColor(false,ereignisQuelle)
		}
		var tr = object.getAttribute("name");
		valueString = document.getElementById(tr+(valueIndex)).innerHTML;
	}


	/**
	*	Die Farbliche selectierungn werden gesetzt
	*/	
	function setColor(set,ereignisQuelle) {
		if(ereignisQuelle.nodeName != "TD") return; 

		//alles weiss machen
		var tr = object.getAttribute("name");
		
		if(null == valueMaxIndex) {
			valueMaxIndex = parseInt(document.getElementById(tr+"1").getAttribute("gesamt"));
		}

		for(var i=0; i < valueMaxIndex; ++i){
			document.getElementById(tr+(i+1)).style.backgroundColor = "";
		}
		//mit farbe selectieren
		document.getElementById(tr+(valueIndex)).style.backgroundColor = "#fc0";
	}


	/**
	*	Setzt den closer in das Info-Div.
	*/
	function addCloser(div) {
		var closeB = document.createElement("div");
	    div.appendChild(closeB);	
	    
	    closeB.style.position = "relative";
	    closeB.style.width = "100%";
	    closeB.style.height= "11px";
	    closeB.style.float = "right";
	    closeB.innerHTML = '<img id="closer" style="float:right; padding:2px; cursor:pointer;" src="' + image_dir +'/close_klein.gif">';
	    document.getElementById("closer").onmousedown = hiddeInfo;  
	}

	function setSelectFieldsForIEBug(set) {
		var elem = document.getElementsByTagName("SELECT");
		for(var i=0; i < elem.length; i++) {
			if(elem[i].getAttribute("modi") == "resizeDown") {
				elem[i].style.width = parseInt(elem[i].style.width)-set+"px";
			}
			if(elem[i].getAttribute("modi") == "resizeUp") {
				elem[i].style.width = parseInt(elem[i].style.width)+set+"px";
			}
		}
		var elem = document.getElementsByTagName("INPUT");
		for(var i=0; i < elem.length; i++) {
			if(elem[i].getAttribute("modi") == "resizeDown") {
				elem[i].style.width = parseInt(elem[i].style.width)-set+"px";
			}
			if(elem[i].getAttribute("modi") == "resizeUp") {
				elem[i].style.width = parseInt(elem[i].style.width)+set+"px";
			}
		}
		var elem = document.getElementsByTagName("TEXTAREA");
		for(var i=0; i < elem.length; i++) {
			if(elem[i].getAttribute("modi") == "resizeDown") {
				elem[i].style.width = parseInt(elem[i].style.width)-set+"px";
			}
			if(elem[i].getAttribute("modi") == "resizeUp") {
				elem[i].style.width = parseInt(elem[i].style.width)+set+"px";
			}
		}	
	}

	this.setNoAjaxFunction = function(p) {
		noAjaxFunction = p;
	}
}