var SLopened = false;
var SLchecked = false;
function closeAllSLLists() {
	var contents = document.getElementsByClassName('SLList');
	if(SLopened) {
		contents.invoke('hide');
		SLopened = false;
	}
}	
function handleSelectList() {
	var triggers = document.getElementsByClassName('SLOptiontionSelectedText');
	var contents = document.getElementsByClassName('SLList');
	contents.invoke('hide');
	triggers.each(function(link) {
		Event.observe(link,'click',function(evt) {
			var trigger = this;
			var content = $(trigger.id.split("_")[0]);
			contents.each(function(elem) {
				if(elem === content) {
					$(elem).addClassName('SLOptionenList').toggle();
					if(elem.visible()) {
						SLopened = true;
					} else {
						SLopened = false;
					}
				} else {
					$(elem).removeClassName('SLOptionenList').hide();
				}
			});
			Event.stop(evt);
		}.bindAsEventListener(link));
	});
	Event.observe(document.body, 'click', closeAllSLLists);
}


/**
* Behandelt die Auswahllisten im Transport Assistent
* @param
*       inputSelects: ID der Listen als Array
* @param
*       callback: Callback-Funktion, prüft ob der Assisten aktiviert werden kann
* @param
*       data: die Daten die in den Listen enthalten sind (format: JSON (transportAuswahl))
*/
function TransportAssistent(inputSelects, callback, data) {
	var selects = new Array();
	var noValue = false;
	var next_Select = null;
	var next_SelectData = null;

	/**
	* aktualisiert die Werte in einer Liste nach Änderung der anderen Listen
	* @param
	*       newOptions: Array mit neuen Werten (aus 'data')
	*/
	var replaceOptions = function(newOptions) {
		var oldOptions = new Array();
		var SLOptions = $(this.id).getElementsByTagName( 'li' ); 								// Array der Elemente in der Auswahlliste
		while( SLOptions.length > 0 ) {															// enfernt alle Listenelemente
			var currElem = SLOptions[0].immediateDescendants(); 								// holt das <a>-Element des gerade aktuellen Listenpunkts
			var currID = currElem[0].id.split("_")[2];											// holt die VIPOID aus dem ID des <a>-Elements
			var currRange = currElem[0].id.split("_")[1];										// holt die Ordnertiefe aus dem ID des <a>-Elements
			var currText = currElem[0].firstChild.data;											// holt den Text aus dem <a>-Elements
			var currValue = $("tra" + this.selIndex).value;										// holt den Wert (VIPOID) aus dem hidden-input der aktuellen Liste
			if(currID == currValue){															// falls die beiden VIPOIDs übereinstimmen
				oldOptions.push({'value': currValue,'range': currRange,'text': currText });		// sich die aktuellen Werte merken 
			}
			$(this.id).removeChild( SLOptions[0] ); 											// entferne Listenpunkt
		}
		if( newOptions.length == 0) {															// falls keine neue Werte übergeben wurden, Anzeige und hidden-input auf "Null" setzen
			this.addOption( '', '00', '-----', oldOptions );
			$("tra"+this.selIndex).value = "--";
			$(this.id + "_selected").firstChild.firstChild.data = "-----";
		} else {																				// falls neu Werte übergeben wurden
			for( var i = 0; i < newOptions.length; i++ ) {										// rufe addOptions() für jeden der übergebenen Werte auf
				this.addOption( newOptions[i][0], newOptions[i][1], newOptions[i][2], oldOptions);
			}
			if(oldOptions.length == 0) {														// wenn es keine gemerkte Optionen gibt,
				$(this.id + "_selected").firstChild.firstChild.data = newOptions[0][2];			//setze die Anzeige auf dem ersten Wert (default) der neuen Optionen
			}
		}
	};
	
	/**
	* erzeugt, aufgrund der übergebenen Werte, die neue Listenelemente mit neuen Werten
	* @param
	*       value: eine VIPOID
	* @param
	*       text: Text der ausgewählten Option aus der aktuellen Liste
	* @param
	*       oldOptions: gemerkte Werte aus der jeweils Folgeliste als Array
	*/
	var addOption = function(value, range, text, oldOptions) {
		var SLOption = document.createElement("li"); 										// erzeuge <li>-Element
		$(SLOption).addClassName("SLOption");												// CSS-Klasse (@class) dem Element zuweisen
		var SLOptiontionText = document.createElement("a")									// erzeuge <a>-Element
		// CSS-Klasse (@class) dem El. zuweisen UND @id erzeugen @id= tra + Position der aktuelle Liste + Orderntiefe + übergebener Wert (VIPOID)
		$(SLOptiontionText).addClassName("SLOptiontionText").setAttribute("id", "tra" + this.selIndex + "_" + range + "_" + value);
		$(SLOptiontionText).appendChild(document.createTextNode(text)); 					// Text im <a> aus dem übergebenen Text erzeugen
		$(SLOption).appendChild(SLOptiontionText);											// fügt <a> im <li> ein
		this.appendChild( $(SLOption) );													// fügt das <li> in die aktuelle Liste ein
		if((oldOptions.length != 0 && (range == oldOptions[0].range))) {					// falls gemerkte Optionen gab und der übergebene Text mit dem gemerkten gleich ist
			$("tra" + this.selIndex).value =  value;										// setzt hidden-input auf dem neuen Wert
			$(this.id + "_selected").firstChild.firstChild.data = text;						// setzt Anzeige auf dem gewählten Text
			next_Select = !this.nextSelect ? null : this.nextSelect;						// falls eine weitere Liste gibt, wähle sie aus, sonst wähle "null"
			next_SelectData = !this.nextSelect ? null : data[ this.nextSelect.id ][ value ]; // falls eine weitere Liste gibt, hole die Daten für die Liste, sonst wähle "null"
		}
	};

	/**
	* holt den Wert aus dem hidden-input der aktuellen Liste
	*/
	var selectedValue = function() {
		return $("tra" + this.selIndex).value;
	};

	/**
	* holt den Text der gewählten Option aus der Liste
	*/
	var selectedText = function() {
		return $(this.id + "_selected").firstChild.firstChild.data ;
	};

	/**
	* funktion um die Werte in den Listen eintsprechend der Auswahl zu ändern
	*/
	var changeHandler = function() {
		var value = this.selectedValue(); 										// holt den Wert aus dem hidden input
		if( value == '--' ) {													// wenn value "--" ist, wurde die Liste zurückgesetzt
			if(this.nextSelect) {												// wenn die aktuelle Liste Folgelisten hat, deren Werte ändern (auch zurücksetzen)
				for( var i = this.nextSelect.selIndex; i < selects.length; i++ ) {
					selects[i].replaceOptions( new Array() );					// ruft replaceOptions mit eine leeren Array (als neue Optionen) auf
				}
				checkSelets(inputSelects.length);								// ruft die Überprüfung der hidden inputs auf
				callback(SLchecked);											// ruft die Anzeigefunktion des "Submitbuttons" auf
				return;
			}
		}
		if( typeof(this.nextSelect) == 'object' ) {								// wenn das nächste Element des aktuellen Liste ein Object ist (d.h.: wenn es noch eine Folgeliste gibt)
			if( !data[ this.nextSelect.id ][ value ] ) {						// dummy Abfrage um Elemente ohne ID zu vermeiden
				if( !data[ this.nextSelect.id ] ) {
					data[ this.nextSelect.id ] = {};
				}
				data[ this.nextSelect.id ][ value ] = new Array();
			}
			for( var i = this.nextSelect.selIndex; i < selects.length; i++ ) {	// ruft für alle Folgelisten replaceOptions() auf
				if(next_Select != null && next_SelectData != null) {			// wenn bereits Daten für die Folgeliste vorhanden sind ruft replaceOptions() mit den Daten auf
					next_Select.replaceOptions( next_SelectData );
				} else {														// sind keine Daten vorhanden, holt die Daten aus dem transportAuswahl
					this.nextSelect.replaceOptions( data[ this.nextSelect.id ][ value ] );
				}
			}
			initEvents(this.nextSelect.id);										// initiiert die EventHandler für die durch replaceOptions() neu erzeugte Liste
		} else {
			initEvents(this.id);												// es gibt keine Folgelisten, initiiert die EventHandler für die Aktuelle
		}
		checkSelets(inputSelects.length);										// ruft die Überprüfung der hidden inputs auf
		callback(SLchecked);													// ruft die Anzeigefunktion des "Submitbuttons" auf
	};

	/**
	* intiiert die EventHandler für die <a> - Elemente im übergebenen (<ul>-)Element
	* @param
	*       elem: die jeweilige Liste als DOM-Objekt
	*/
	function initEvents(elem) {
		var el = $(elem);
		$A(el.getElementsByTagName("a")).each(function(index) {
			Event.observe(index,'click',function(evt) {
				var trigger = this;
				var strValue = trigger.id.split("_")[2];					// holt die übergebene VIPOID aus dem ID des aktuellen <a>-Elementes
				var strRange = trigger.id.split("_")[1];					// holt die übergebene Ordnertiefe aus dem ID des aktuellen <a>-Elementes
				var strText = trigger.firstChild.data;						// holt den Text des aktuellen <a>-Elements
				var selOpt = $(elem + "_selected");							// Element (auch ein <a> aber außerhalb der Liste) im dem die ausgewählte Option angezeigt wird
				selOpt.firstChild.firstChild.data = strText;				// ersetzt dem Text (<a><span></span></a>) duch die ausgewählte Option
				$("tra" + el.selIndex).value = strValue;					// setzt den Wert vom hidden-input, auf den Wert der ausgewählten Option
				el.changeHandler();											// ruft changeHandler() auf, um die anderen Listen zu ändern
				closeAllSLLists();											// schließt alle geöffnete Listen
				Event.stop(evt);
			}.bindAsEventListener(index));
			Event.observe(index,'mouseover',function(evt) {					// hover-Effekt für die <a>-Elemente
				var trigger = this;
				trigger.addClassName('SLOptiontionText-hover');
				Event.stop(evt);
			}.bindAsEventListener(index));
			Event.observe(index,'mouseout',function(evt) {					// hover-Effekt für die <a>-Elemente
				var trigger = this;
				trigger.removeClassName('SLOptiontionText-hover');
				Event.stop(evt);
			}.bindAsEventListener(index));
		});
	}

	/**
	*	Erzeugt für alle Elemente (<ul>) die angegeben wurden die nötige Methoden
	*	und bestimmt die nächste Selektion für das jeweilige Element
	*/
	inputSelects.each(function(elem) {
		var el = $(elem);
		el.selIndex = inputSelects.indexOf(elem); 				// die Stelle des Elementes im imput Array
		el.replaceOptions = replaceOptions;						// ordnet die Methode replaceOptions dem El. zu
		el.addOption = addOption;								// ordnet die Methode addOption dem El. zu
		el.selectedValue = selectedValue; 						// ordnet die Methode selectedValue dem El. zu
		el.selectedText = selectedText; 						// ordnet die Methode selectedText dem El. zu
		el.changeHandler = changeHandler; 						// ordnet die Methode changeHandler dem El. zu
		selects.push(el);										// stellt das El. in dem selects-Array
		if( selects.length > 1 ) {								// wenn mehr als zwei Auswahllisten existieren
			selects[ selects.length-2 ].nextSelect = el;		// bestimmt die für welche Liste das aktuelle El. als Nächstes gilt
		}
		initEvents(elem); 										// intiiert die EventHandler für das Element
	});
	
	/**
	* überprüft ob alle hidden-inputs der Lsiten einen Wert haben
	* @param
	*       selects: Anzahl der Listen
	*/
	function checkSelets(selects) {
		for(var i = 0; i < selects; i++) {
			if(($("tra" + i).value != "") && ($("tra" + i).value != "--")) {
				SLchecked = true;
			} else {
				SLchecked = false;
			}
		}				
	}
}

function SimpleSelectList(inputSelects) {
	function invokeEvents(elem) {
		var el = $(elem);
		$A(el.getElementsByTagName("a")).each(function(index) {
			Event.observe(index,'click',function(evt) {
				var trigger = this;
				var strValue = trigger.id.split("_")[1];
				var strText = trigger.firstChild.data;
				$(elem + "_selected").firstChild.update(strText);
				$(trigger.id.split("_")[0]).value = strValue;
				closeAllSLLists();
				Event.stop(evt);
			}.bindAsEventListener(index));
			Event.observe(index,'mouseover',function(evt) {
				var trigger = this;
				trigger.addClassName('SLOptiontionText-hover');
				Event.stop(evt);
			}.bindAsEventListener(index));
			Event.observe(index,'mouseout',function(evt) {
				var trigger = this;
				trigger.removeClassName('SLOptiontionText-hover');
				Event.stop(evt);
			}.bindAsEventListener(index));
		});
	}
	inputSelects.each(function(elem) {
		var dimensions = $(elem).getDimensions();
		if(dimensions.height > 100) {
			$(elem).setStyle({
				height: '100px',
				overflowY: 'scroll',
				overflowX: 'hidden'
			});
		}
		invokeEvents(elem);
	});
}

function ChainedSelectList(inputSelects, callbackFunctions) {
	function invokeEvents(elem) {
		var el = $(elem);
		var fct = (inputSelects.length < callbackFunctions[el.selIndex]) ?  callbackFunctions[0] : callbackFunctions[el.selIndex];
		$A(el.getElementsByTagName("a")).each(function(index) {
			Event.observe(index,'mouseover',function(evt) {
				var trigger = this;
				trigger.addClassName('SLOptiontionText-hover');
				Event.stop(evt);
			}.bindAsEventListener(index));
			Event.observe(index,'mouseout',function(evt) {
				var trigger = this;
				trigger.removeClassName('SLOptiontionText-hover');
				Event.stop(evt);
			}.bindAsEventListener(index));
			Event.observe(index,'click',function(evt) {
				var trigger = this;
				var strValue = trigger.id.split("_")[1];
				var strText = trigger.firstChild.data;
				$(elem + "_selected").firstChild.update(strText);
				$(trigger.id.split("_")[0]).value = strValue;
				eval(fct);
				closeAllSLLists();
				Event.stop(evt);
			}.bindAsEventListener(index));
		});
	}
	inputSelects.each(function(elem) {
		var el = $(elem);
		var dimensions = el.getDimensions();
		el.selIndex = inputSelects.indexOf(elem);
		if(dimensions.height > 100) {
			el.setStyle({
				height: '100px',
				overflowY: 'scroll',
				overflowX: 'hidden'
			});
		}
		invokeEvents(elem);
	});
}
