/** 
 * Enthaelt Funktionen zur Definition einer durch ein eindimensionales Array
 * simulierten Liste zur Verwaltung (Loeschen und Einfuegen, sowie Neuzeichnen)
 * von Zwischenpunkten des Routings
 * 
 * Contains functions defining a one-dimensional array that simulates a list
 * in order to administer (e.g. deleting, inserting and redrawing) stopovers
 * for routing.
 *  
 * @author Geocoding 
 * @version 28.02.2010  
 */

//var zwischenpunktliste = new Array();  
		// Beispiel der benutzten Datenstruktur.
		// wird jedoch extern initialisiert und angesteuert.
		// Example of the used data structure.
		// is initialized and controled externally.

/**
 * Fuegt eine Kopie des Zwischenpunktes (definiert durch x und y) hinter einer
 * bestimmten Stelle (index) in das Listenarray ein.
 * 
 * Adds a copy of a stopover (defined by x and y coordinates) behind a 
 * designated position (index) into the list array.
 */
function insertViaOnIndex(x, y, index) {
	removeAllViasInMap();
	point = new OpenLayers.Geometry.Point(x, y);
	zwischenpunktliste.splice(index, 0, point);
	redrawAllViasInMap();
	addVia2DropDown(); // Anpassung der Dropdown-Auswahlliste
					   // Adaptation of the dropdown selection list
}

/**
 * Fuegt eine Kopie des Zwischenpunktes (definiert durch x und y) an der
 * letzten Stelle in das Listenarray ein.
 * 
 * Adds a copy of a stopover (defined by x and y coordinates) at the last
 * position of the list array.
 */
function insertVia(x, y) {
	removeAllViasInMap();
	point = new OpenLayers.Geometry.Point(x, y);
	zwischenpunktliste.push(point);
	redrawAllViasInMap();
	addVia2DropDown(); // Anpassung der Dropdown-Auswahlliste 
}

/**
 * Loescht die Zwischenpunktrepraesentation eines Zwischenpunktes an einer
 * bestimmten Stelle und sorgt dafuer, dass nachfolgende Punkte neu nummeriert
 * werden.
 * 
 * Deletes the representation of a stopover at the designated position (index)
 * and renames successive stopovers correctly.
 */
function deleteViaOnIndex(index) {
	removeAllViasInMap();
	zwischenpunktliste.splice(index - 1, 1);
	redrawAllViasInMap();
	deleteViaFromDropDown(); // Anpassung der Dropdown-Auswahlliste
}

/**
 * Loescht die Zwischenpunktrepraesentation eines Zwischenpunktes an der
 * letzten Stelle.
 * Eigentlich gedacht als Abfangfunktion fuer deleteViaOnIndex, falls vom
 * Benutzer kein index uebergeben wird. Letztere funktioniert aber
 * verblueffenderweise auch dann, daher zurzeit ohne Funktion!   
 * 
 * Deletes the representation of a stopover at the last position.
 * Originally planned as a catch function for deleteViaOnIndex if no index
 * is transmitted but the latter surpisingly even runs steady in that case.
 * So, out of service at this time.
 */
function deleteVia() {
	removeAllViasInMap();
	zwischenpunktliste.pop();
	redrawAllViasInMap();
	deleteViaFromDropDown(); // Anpassung der Dropdown-Auswahlliste
}

/**
 * Entfernt alle Zwischenpunkte in der Datenstruktur von der Karte.
 * Muss vor jeder Veraenderung der Datenstruktur aufgerufen werden, damit die
 * Neuordnung der Punkte die alte Ordnung nicht ueberschreibt und keine
 * haesslichen Bugs entstehen koennen.
 * 
 * Removes all stopovers contained by the data structure from the map.
 * Has to be called prior to any modification of the data structure so that
 * the new order of the stopovers does not simply overwrite the old one which
 * would cause ugly bugs. 
 */
function removeAllViasInMap() {
	for ( var i = 0; i <= zwischenpunktliste.length - 1; i++) {
		loeschen(i + 1);
	}
}

/**
 * Zeichnet alle Zwischenpunkte der Datenstruktur in korrekter Reihenfolge mit
 * den dazugehoerigen Indizes in die Karte.
 * Wird direkt im Anschluss jedweder Aenderung der Datenstruktur aufgerufen,
 * um die Zwischenpunktdarstellung in der neuen und richtigen Reihenfolge
 * zu realisieren.
 * 
 * Draws all stopovers contained by the data structure in the correct order
 * with belonging index into the map.
 * Is called directly after any modification of the data structure in order
 * to realize the new and correct order of the stopover display.
 */
function redrawAllViasInMap() {
	for ( var i = 0; i <= zwischenpunktliste.length - 1; i++) {
		setzeZwischenpunkt(zwischenpunktliste[i].x, zwischenpunktliste[i].y,
				i + 1);
	}
}

/**
 * Wird nach dem Verschieben eines Navigationspunktes aufgerufen und
 * aktualisiert die Positionen der Zwischenpunkte.  
 * 
 * Is called after dragging a navigation point and refreshes the positions
 * of the stopovers.
 */
function onUpdate(x, y, id) {
	if (id != "start" && id != "stop") {
		deleteViaOnIndex(id);
		insertViaOnIndex(x, y, id - 1);
	}
}

/**
 * Kehrt die Liste der Zwischenpunkte um.
 * Wird beim Umkehren der Route aufgerufen, um die Zwischenpunkte bei fester
 * Reihenfolge sinvoll an die inverse Route anzupassen.
 * 
 * Reverses the list containing the stopover representations.
 * Is called when the user reverses the route in order to adapt the order
 * of the stopovers wisely to the inverse route, especially if viaorder
 * is set "fixed".
 */
function onReverse() {
	removeAllViasInMap();
	zwischenpunktliste.reverse();
	redrawAllViasInMap();
}