// JavaScript Document

//var Stadt = new Object();

var intStadtIDCounter = 0;
var intMetaBezirkIDCounter = 0;
var intBezirkIDCounter = 0;
var intLageIDCounter = 0;
var intEXLageIDCounter = 0;
var arrSortThis = new Array();
var booExLageAlleIsSet = true;
var booHist = false;

function setHist (pBoo) { 
	//alert ( "Achtung: booHist wird jetzt auf " + pBoo + " gesetzt!")
	booHist = pBoo; 
	}
function getHist () { return booHist }

/* ---------------------------------------------------------------------------------- */

function mapS7Bezirke ( pName ) {
	this.name = pName || "default";
	
	this.setBezirke = function ( pArrS7Lagen ) {
		// bekommt ein Array von S7Lagen, welche gerade aktiviert wurden
		// setzt das Kartensegment arrBez[pArrS7Lagen[i]-1] entsprechend
		// !!! WICHTIG: auf den Lagen wird der Bezirk ermittelt !!! (die function sollte "setBezirkeByS7Lagen()" heißen
		// poor: ID sollte nicht anhand des Index ermittelt werden
		//$("#liste").prepend( "<br>");
		for (var i=0; i < pArrS7Lagen.length; i++ ) {
			// 2DO: Implementieren NoObj -> activate MBez
			//$("#liste").prepend( "<span style='color:blue;'>" + pArrS7Lagen[i].name  + " <i>[" + pArrS7Lagen[i].getBezirk().ID + "]</i> " );
			dispDiv( "h" + pArrS7Lagen[i].getBezirk().ID, true );
		}
		
	} // set
	
	this.unsetBezirke = function ( pArrS7Lagen ) {
		// bekommt ein Array der S7Lagen, welche gerade deaktiviert wurden
		// setzt das Kartensegment entsprechend
		//$("#liste").prepend( "<br>");
		for (var i=0; i < pArrS7Lagen.length; i++ ) {
			//$("#liste").prepend( "<span style='color:red; '>" + pArrS7Lagen[i].name  + " <i>[" + pArrS7Lagen[i].getBezirk().ID + "]</i> " );
			dispDiv( "h" + pArrS7Lagen[i].getBezirk().ID, false );

		}
		
	} // unset


	this.clickArea = function ( pIntID ) {
		// pIntID ist die ID des angeklickten Bezirkes
		// Toggle Bezirk - set s7Lagen, set ExLagen
	
		//$("#liste").prepend( "Name: " + getBezById(pIntID).name + "<br>" )
		//$("#liste").prepend( " ---- click: " + pIntID + "<br>");
		
		// aktivieren oder deaktivieren?
		if (document.getElementById( "h" + pIntID).style.visibility == "hidden") {
			// Bezirk aktivieren
			dispDiv("h" + pIntID, true);
			
			selExLagen.setExLagen ( getBezById(pIntID).getLagen(), true)
			selS7Lagen.setS7Lagen ( getBezById(pIntID).getLagen(), true)
			
			//$("#liste").prepend( "h" + pIntID + " aktiv <br>" )

		} else {
			// Bezirk deaktivieren
			dispDiv("h" + pIntID, false)
			selExLagen.setExLagen ( getBezById(pIntID).getLagen(), false)
			selS7Lagen.setS7Lagen ( getBezById(pIntID).getLagen(), false)
			//$("#liste").prepend( "h" + pIntID + " deaktiv <br>" )
		}
	}
}
var mapMuenchen = new mapS7Bezirke ( "München" );

/* --------------------------------------------------------------------------------------------------------------------------- */
function selS7Lagen () {
	// nur ein Objekt - für ein SELECT
	// eigentlich gehört hier das Array arrS7Lagen rein, was aber nur den Aufrug "verlängern" würde"
	var arrLagenPuffer = new Array();
	this.initLagenPuffer = function ( intArrLagenLength ) {
		//arrLagenPuffer alle auf 0 setzen, so can use length -- sollte nicht verwendet werden!
		for (var i=0; i < intArrLagenLength; i++) { arrLagenPuffer[i] = false; }
	}
	
	/* -------- Setzen einer Option -------- */	
	// erwartet den Index im SELECT "s7lagen" und den SetModus
	this.setSelOption = function ( pInt, pBoo ) {
		if (pInt) { document.getElementById('s7lagen').options[pInt].selected = pBoo; }
	}

	this.getSelOption = function ( pInd ) {
      //console.log("Ist der  " + pInd + ". Eintrag in s7lagen (Länge: " + document.getElementById('s7lagen').length + ") gesetzt? " + document.getElementById('s7lagen').options[pInd].selected );
		return  document.getElementById('s7lagen').options[pInd].selected;
	}
	
	this.getLageIndex = function ( pLageID ) {
		for (var k=0; k < document.getElementById('s7lagen').length; k++) {
			if ( document.getElementById('s7lagen').options[k].value == pLageID) {
				return k;
			}
		}

	}

	/* -------- Lagen setzen/Löschen ------- */
	//  erwartet ein Array mit S7lagen und ein Boolean für den SetModus (set/unset)
	this.setS7Lagen = function ( pArrS7Lagen, pBoolSetMode ) {
		// Problem: Das Objekt hat durch den Sortier-Vorgang keine Ahnung, welchen Index es in dem Select hat
		// L_01: Iteration durch das Select und nach der ID suchen.
	
		for (var i=0; i<pArrS7Lagen.length; i++) {
			//$("#liste").append( pArrS7Lagen[i].getExLage() );
			this.setSelOption( this.getLageIndex(pArrS7Lagen[i].ID), pBoolSetMode );
			// puffArr
			//this.getLageIndex(pArrS7Lagen[i].ID)
		}
		// Pufferarray aktualisieren
      // CHANGE#1 - der Puffer beginnt mit Element 1 (Umrechnung auf SEL zu kompliziert)
		for (var i=1; i < arrS7Lagen.length; i++) { arrLagenPuffer[i] = this.getSelOption(i) ; }
		
		//$("#liste").append("<br>");
	}
	

	/* -------- Änderungen im SELECT.S7Lagen ------- */
	this.changeS7Lagen = function ( ) {
		var arrS7LagenAktiv = new Array();		// Array mit den Obj-Refs der zu setzenden Lagen
		var arrS7LagenDeaktiv = new Array();	// Array mit den Obj-Refs der zu löschenden Lagen

		// Sonderfall "ALLE"  ->  alle aktivieren (IE6 mackt wieder?) // 2DO
		if ( document.getElementById('s7lagen').options[0].selected ) {
			for ( var k=1; k<document.getElementById('s7lagen').length; k++) { this.setSelOption(k, true);	}
		}
		
      // iteriert durch alle OPTIONs des SELECTs 's7lagen'
		for ( var mm=1; mm < document.getElementById('s7lagen').length; mm++) {

         // hat sich seit dem letzten Aufruf was geändert?
         // auslesen des "selected"-Wertes jeder OPTION ab 1 (0 ist "alle")
         intOpt = this.getSelOption(mm);

			if ( arrLagenPuffer[mm] != intOpt ) {
				// hat sich was geändert
				if ( arrLagenPuffer[mm] ) {
					// Lage ist gelöscht worden -> auf die Löschliste damit
					// sein Index in der LagenTabelle ist der Value der OPTION
					arrS7LagenDeaktiv.push( arrS7Lagen[document.getElementById('s7lagen').options[mm].value] );
				} else {

					// Lage ist gesetzt worden -> auf die Setzliste damit
					arrS7LagenAktiv.push( arrS7Lagen[document.getElementById('s7lagen').options[mm].value] );
				}	

            // Puffer aktualisieren
				arrLagenPuffer[mm] = this.getSelOption(mm)
			}
         
		} // lagen ermitteln ende

		// Sonderfall: S7Lage ist leer -> kompletten MetaBezirk aktivieren
		// ??? Warnung ausgeben ???

		// Karte akualisieren
		
		mapMuenchen.setBezirke( arrS7LagenAktiv );
		mapMuenchen.unsetBezirke( arrS7LagenDeaktiv );		
		
		// Exlagen aktivieren
		selExLagen.setExLagen( arrS7LagenAktiv, true );
		selExLagen.setExLagen( arrS7LagenDeaktiv, false);
		
		// MetaLagen aktualisieren - nicht aktiviert, Funktionalität ist eher verwirrend
		//chkMBez.setMBez (  arrS7LagenAktiv, true )
		//chkMBez.setMBez (  arrS7LagenDeaktiv, false )
		
	}		
}

var selS7Lagen = new selS7Lagen ();

function selExLagenO () {
	// verwaltet die Lagen, die aus EXPOSE erzeugt werden und relevant für die Suche sind - SELECT ist unsichtbar
	// Array der ExLagen:		arrExL
	// Bezeichner d. SELECT:	lagen
	// arrS7Lagen[n].getObjAnz // getExLage

	this.setSelOption = function ( pInt, pBoo ) {
		if (pInt) {
			document.getElementById('lagen').options[pInt].selected = pBoo;
		}
	}
	this.resetSelExLagen = function () {
		document.getElementById('lagen').options[0].selected = true;
		for (var i=1; i<document.getElementById('lagen').length; i++) {
			document.getElementById('lagen').options[i].selected = false
		}
	}

	// Lagen setzen/Löschen (erwartet ein Array mit S7lagen und ein Boolean für den SetModus (set/unset)
	this.setExLagen = function ( pArrS7Lagen, pBoolSetMode ) {

		//if (!getHist()) { alert("booHist ist nicht gesetzt - alle alten Lagen löschen!") };
		// "Alle" in den Exlagen (default) muss gelöscht werden
		if (booExLageAlleIsSet) {  document.getElementById('lagen').options[0].selected = false; booExLageAlleIsSet = false; }
		
		// 2DO: Implementierung Sonderfall:NoObj -> activate MBez
		for (var i=0; i<pArrS7Lagen.length; i++) {
			//$("#liste").append( pArrS7Lagen[i].getExLage() );
			if ( pArrS7Lagen[i].getObjAnz() ) {
				// Objekte vorhanden
				this.setSelOption( pArrS7Lagen[i].getExLage(), pBoolSetMode );
			} else {
				// kein Objekt in der Lage -> MBez aktivieren
				if (!pBoolSetMode) continue;
				//$("#liste").prepend(" EMPTY: " + pArrS7Lagen[i].getMBezirk().name + " <br>");
				
				var tmpArr = pArrS7Lagen[i].getMBezirk().getLagen();
				for (var j=0; j<tmpArr.length;j++) {
					//$("#liste").prepend(tmpArr[j].getExLage() + "; ")
					this.setSelOption( tmpArr[j].getExLage(), true );
				}
				
			}
			
		}
		//$("#liste").append("<br>");
	}

}
var selExLagen = new selExLagenO;

/* ---------------------------------------------------------------------------------- */

function s7Stadt ( pName, pID ) {
	this.ID = pID || ++intStadtIDCounter;
	this.name= pName;
}

/* ------------------------------------------------------------------------------------------------------------------------------- */

var arrMBez = new Array(); // of s7MetaBezirk

function s7MetaBezirk ( pName, pID ) {
	this.ID = pID || ++intMetaBezirkIDCounter;
	this.name= pName;
	var arrBezirke = new Array ();
	var arrLagen = new Array(); // Zugriff über die Bezirke? Kein Grund für doppelte Daten, oder? Doch, ist aufwändig!
	
	this.addBezirk = function ( objBezirk ) {
		//Element dem Array der Bezirke hinzufügen 
		arrBezirke.push(objBezirk);
	}
	this.addLage = function ( objLage ) {
		arrLagen.push(objLage);
	}
	this.addLagen = function ( objLage ) {
		arrLagen = arrLagen.concat(objLage);
	}
	this.getLagen = function() { return arrLagen; }
	this.getBezirke = function() { return arrBezirke; }
	
	this.getBezirkeById = function ( ) {
		var arrInt = new Array();
		for ( var i=0; i< arrBezirke.length ;i++) {
			arrInt.push (arrBezirke[i].ID);
		}
		return arrInt;
	}
	
	// debug only - da das Array mit Bezirken privat ist, kann Firebug es auch nicht sehen
	//this.printBezirke =  function () { for (var i=0; i < arrBezirke.length; i++) { $("#liste").append( arrBezirke[i].name  + " " ); }; 	}
	
}
// ----------------------------------------------------------------------------------------------------------------------- //
function chkMBezO () {
	// Objekt zur Verwaltung der CHECKBOXen der Metabezirke (arrMBez)
	
	// Klick auf Checkbox
	this.clickMBez = function ( pObj ) {
		// pObj ist die Checkbox
		// ID des Metabezirkes:	pObj.value 
		// Zustand: 			pObj.checked

		// Bezirke ermitteln und an Map übergeben
		// poor: die ID sollte ermittelt werden 
		//$("#liste").append( (arrMBez[pObj.value-1].getBezirkeById()) + " " );
		if (pObj.checked) {
			mapMuenchen.setBezirke ( arrMBez[pObj.value-1].getLagen(), true);
			selExLagen.setExLagen ( arrMBez[pObj.value-1].getLagen(), true)
			selS7Lagen.setS7Lagen ( arrMBez[pObj.value-1].getLagen(), true)
		} else {
			mapMuenchen.unsetBezirke ( arrMBez[pObj.value-1].getLagen());
			selExLagen.setExLagen ( arrMBez[pObj.value-1].getLagen())
			selS7Lagen.setS7Lagen ( arrMBez[pObj.value-1].getLagen())
		}
		
	} // ende: f clickMBez
	
	// setzen der Checkbox
	this.setMBez = function ( pArrS7Lagen, pBooMode ) {
		for ( var i=0; i<pArrS7Lagen.length; i++ ) {
			document.myform.mbez[pArrS7Lagen[i].getMBezirk().ID-1].checked = pBooMode;
			//$("#liste").prepend( "<br>" + document.myform.mbez[pArrS7Lagen[i].getMBezirk().ID-1].value );
		}
	}
	
} // ende: Deklaration chkMBez

var chkMBez = new chkMBezO ();

var arrBez = new Array(); // of s7Bezirk

function isInArrBez ( pName ) {
	// itereriert durch arrS7Lagen und überprüft Doubletten
	// returns S7Lage ? eher den Bez, oder?
	for (var i=0; i<arrBez.length; i++) {
		if ( arrBez[i].name == pName ) { return arrBez[i]; }
	}
	return false
}

function getBezById ( pIntID ) {
	// gibt das Bezirk-Objekt mit der ID = pIntID zurück
	for (var i=0; i<arrBez.length; i++) {
		if ( arrBez[i].ID == pIntID ) { return arrBez[i]; }
	}
	return false
	
}

function s7Bezirk ( pName, pID ) {
	this.ID = pID || ++intBezirkIDCounter;
	this.name= pName;
	// ID ist identisch mit dem Index für die Map-DIVs ( vlt eigene Var? ) 	//this.DivID = pDivID;

	var myMBezirk;
	this.setMBezirk = function ( pMBezirk ) { myMBezirk = pMBezirk }
	this.getMBezirk = function () { return myMBezirk }

	var arrLagen = new Array (); 
	this.addLage = function (objLage) {
		arrLagen.push( objLage );
	}
	this.getLagen = function () { return arrLagen; }
	
	this.printLagen = function () { 
		for (var i=0; i < arrLagen.length; i++) { 
			$("#liste").append( arrLagen[i].name + "<i style='color:#555;'>/" + (arrLagen[i].getBezirk().ID-1) + "</i> " ); } }
	
}

var arrS7Lagen = new Array(); // of s7Lage --------------------------------------------------

function s7Lage ( pName, pID ) {
	this.ID = pID || intLageIDCounter++;
	this.name = pName;
	
	var myBezirk;	// Referenz auf Bezirk ( = Karte? )
	var myMBezirk;	// Referenz auf Meta-Bezirk
	var myExLage;	// Referenz auf entsprechende Lage in EX-Lagen
	var myObjAnz;	// Anzahl der Objekte

	// Previligierte Methode:
	this.setBezirk = function ( pBezirk ) { myBezirk = pBezirk }
	this.getBezirk = function () { return myBezirk }
	this.setMBezirk = function ( pMBezirk ) { myMBezirk = pMBezirk }
	this.getMBezirk = function () { return myMBezirk }
	this.setExLage = function ( pExLage ) { myExLage = pExLage }
	this.getExLage = function ( ) { return myExLage }
	this.setObjAnz = function ( pObjAnz ) { myObjAnz = pObjAnz }
	this.getObjAnz = function ( ) { return myObjAnz }
	
}



var arrExL = new Array();

function exLage ( pName, pID, pObjAnz ) {
	this.ID = pID;
	this.name = pName;
	this.ObjAnz = pObjAnz;
}

/* ---------------------------------------------------------- */

function initS7Objects () {
	// initialisieren der Objekte anhand des Arrays der Metabezirk-Tabelle
	// Einlesen der Lagen.EX -> Ref in Lage-Daten ablegen
	// Doubletten? check, ob Bezirk schon vorhanden, REferenz in MB.arr
	var mbezTemp;
	var bezTemp;
	var lagTemp;

	/* -------- Initialisieren der MetaBezirke und S7Lagen --------*/
	for (var i= 0; i < arrMeta2B2L.length; i++) {

		// Erstellen eines MetaBezirkes
		// zB: arrMBEZ["Zentrum"] - mbezTemp enthält den Namen des akt. Meta-Bezirks
		mbezTemp = new s7MetaBezirk(arrMeta2B2L[i] [0]) ;

		//debug: Meta-Lage bold
		//$("#liste").append( "Meta " + i + ". <b>" + arrMeta2B2L[i] [0] + "</b><br>");
		
		// iteration durch Bezirke und Lagen
		for ( var j=1; j < arrMeta2B2L[i].length; j++) {
			// wenn Element länger als zwei Felder ist (Name und ID), müssen weitere Lagen durchlaufen werden
			// Name: arrMeta2B2L[i] [j] [0]
			// 
			/* 
				2DO: Doubletten! Ein Bezirk (Lage theoretisch auch) kann in mehreren Metabezirken sein 
				----------------  	1. darf also nicht doppelt angelegt werden
									2. sondern die entsprechende Bez-Ref muss dem MBez hinzugefügt werden.
									
							Bezirke sind für die Karte - LAgen für die Selects!
					-> befindet sich arrMeta2B2L[i] [j] [0] schon in arrBez 
						+ -> dem MBez den Bez hinzufügen
						+ -> dem MBez alle S7Lagen des Bez hinzufügen
			*/
			
			// Doubletten-Check
			bezTemp = 0;
			bezTemp = isInArrBez( arrMeta2B2L[i] [j] [0] ); // change: return OBJ
			if ( bezTemp )  {  
				mbezTemp.addBezirk(bezTemp);
				mbezTemp.addLagen(bezTemp.getLagen()) 
				continue;
			}
			
			
			
			bezTemp = new s7Bezirk ( arrMeta2B2L[i] [j] [0], arrMeta2B2L[i] [j] [1] )
			mbezTemp.addBezirk(bezTemp);
			
			// Besitzt der Bezirk noch Lagen? Dann durchlaufen
			if ( arrMeta2B2L[i] [j].length > 2 ) {
				// Iteration durch die restlichen Elemente
				for (var k= 2; k < arrMeta2B2L[i] [j].length; k++) {
					lagTemp = new s7Lage(arrMeta2B2L[i] [j] [k]);
					lagTemp.setBezirk(bezTemp);
					lagTemp.setMBezirk(mbezTemp);
					bezTemp.addLage( lagTemp );
					bezTemp.setMBezirk( mbezTemp );
					mbezTemp.addLage( lagTemp );
					arrS7Lagen.push( lagTemp );
					
				}
			} 
			else { // Keine Lagen im Bezirk: Bezirk ist identisch mit Lage

				// Bezirk ist gleich Lage => Lage mit Bezirknamen anlegen
				lagTemp = new s7Lage(arrMeta2B2L[i] [j] [0]);
				lagTemp.setBezirk(bezTemp);
				lagTemp.setMBezirk(mbezTemp);
				bezTemp.addLage( lagTemp );
				bezTemp.setMBezirk( mbezTemp );
				mbezTemp.addLage( lagTemp );
				arrS7Lagen.push( lagTemp );
			 	
			}
			// debug $("#liste").append(" " + arrMeta2B2L[i] [j] [0] + "<br>" );
			arrBez.push( bezTemp );
		
		} // Iteration durch Bezirke und Lagen

	arrMBez.push( mbezTemp );

	} // Iteration über Meta-Bezirke - ende init MBez/s7lagen

	
	/* ---- init: Puffer-Var für SELECT.s7lagen ----- */
   // Problem: 1. Lage ist "Alle", blödes Umgerechne - Lösung: Array um ein Element ergänzen
   // CHANGE#1 - der Puffer beginnt mit Element 1 (Umrechnung auf SEL zu kompliziert)
	selS7Lagen.initLagenPuffer( arrS7Lagen.length + 1 );

	var exlTemp;
	var delimiter = 0;
	
	/* ---- Initialisierung der EX-Lagen --- */
	// init von _arrExL_
	for ( i=1; i<document.getElementById('lagen').length; i++ ) {
		delimiter = document.getElementById('lagen').options[i].text.lastIndexOf(':');
		exlTemp = new exLage( document.getElementById('lagen').options[i].text.substring(0, delimiter), i, parseInt(document.getElementById('lagen').options[i].text.substring(delimiter+2, document.getElementById('lagen').options[i].text.length )) )
		arrExL.push(exlTemp);
	}

	/* ---- Sync: Lagen <-> ExLagen ---- */
	// Anzahl der vorhandenen Objekte wird in _arrS7Lagen_ eingetragen
	for ( i=0; i < arrExL.length; i++) {
		for ( j=0; j < arrS7Lagen.length; j++) {
			if (arrExL[i].name == arrS7Lagen[j].name) {
				arrS7Lagen[j].setObjAnz(arrExL[i].ObjAnz);
				arrS7Lagen[j].setExLage(arrExL[i].ID);
				// debug:  ausgabe lagen + anz| $("#liste").append( "<br>" + arrS7Lagen[j].getExLage() + ": " + arrS7Lagen[j].name + " <i style='color:#444;'>" + arrS7Lagen[j].getObjAnz() + "</i>" );
				break;
			}
		}
	} // end sync Lagen-ExLagen
	

	/* -------- init des SELECT.s7lagen -------- */

	for (var i=0; i < arrS7Lagen.length; i++) {
		arrSortThis.push([arrS7Lagen[i].name, arrS7Lagen[i].ID]) }
		
	arrSortThis.sort();

	for (var i=0; i < arrSortThis.length; i++) {
		$("#s7lagen").append("<option value='" + arrSortThis[i] [1] + "'>" + arrSortThis[i] [0] + "</option>");	}

	setWholeSelect(document.getElementById('s7lagen'));

} // ende init


function setBezirk() {
	// 
}

/* ------ TRANSLATE ------ */


/* ------ util ------ */

function dispDiv( objDiv, booMode ) {
	document.getElementById(objDiv).style.visibility = (booMode)?"visible":"hidden";
		//$("#liste").prepend( "set " + objDiv + " " + booMode +  "<br>");	
}

function isArray(o) {
  return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
};
// Determine if a reference is defined
function defined(o) {
  return (typeof(o)!="undefined");
};

function setWholeSelect( pSel, pOpt ) {
	for ( var i=0; i < pSel.length; i++) { try { pSel.options[i].selected = pOpt; } catch(e) {} }
}

function submitSearchFrm(){
   document.getElementById('s7lagen').name = 's7lagen[]';
   document.suche_mieten.submit();
}

function submitSearchFrmInvest(){
   document.getElementById('s7lagen').name = 's7lagen[]';
   document.suche_investment.submit();
}
