YAHOO.namespace("ostluft.util");
YAHOO.namespace("ostluft.schadstoffverlauf");

MessdatenGruppeApplication = function() {
	
	this.messstationen_url = "./messdatengruppe.php?method=listMessstationen&messdaten_gruppe_id=";
	this.messgruppe_url = "./messdatengruppe.php?method=listMessgruppen";
	this.zeitraum_url = "./messdatengruppe.php?method=listZeitraum&messdaten_gruppe_id=";
	this.kanal_url = "./messdatengruppe.php?method=getMessdatenGruppeKanalList";
	this.resource_url = "./images/";
	this.graph_html_url = "./messdaten.php?method=getGraphHTML";
	this.graph_image_url = "./messdaten.php?method=getGraphImage";

	/**
	 * Standard-Messdatengruppe: Stundenverlauf
	 */
	this.MESSDATEN_GRUPPE_DEFAULT = 1;
	
	this.messstationLoadedEvent = new YAHOO.util.CustomEvent("onMessstationLoaded", this);

	YAHOO.util.Event.addListener("messdatengruppe", "change", this.onChangeMessdatenGruppe);
	YAHOO.util.Event.addListener("messstation", "change", this.onChangeMessstation);
	YAHOO.util.Event.addListener("zeitraum", "change", this.onChangeZeitraum);
	
	//Logger konfigurieren bzw. aktivieren
	YAHOO.widget.Logger.enableBrowserConsole();
	YAHOO.widget.Logger.loggerEnabled = true;
	
} // Ende des Konstruktors: MessdatenGruppeApplication()

/**
 * Klasse fÃ¼r die Verarbeitung von
 */
MessdatenGruppeApplication.prototype = {
	
	/**
	 * LÃ¤dt die Liste der KanÃ¤le mit den Angaben zu
	 */
	loadKanalList: function(messstation_id, messdaten_gruppe_id, zeitraum_id)
	{
		YAHOO.log("Starte mit dem Laden der neuen Kanalliste!", "info", "loadKanalList");

		var requestURL = this.kanal_url;
		requestURL+= "&station_id=" + messstation_id;
		requestURL+= "&messdaten_gruppe_id=" + messdaten_gruppe_id;
		requestURL+= "&zeitraum_id=" + zeitraum_id;

		YAHOO.log("Request: " + requestURL, "info", this.name);

		YAHOO.util.Connect.asyncRequest("GET", requestURL, this.loadKanalListAsyncCallback);

	}, // Ende der Methode: loadKanalList()

	/**
	 * LÃ¤dt ein Diagramm
	 */
	loadGraph: function(kanal, zeitraum_id)
	{
		YAHOO.log("Starte mit dem Laden eines Diagrammes!", "info", "loadGraph");

		// Request-URL fÃ¼r diesen Kanal zusammenstellen
		var requestURL = this.graph_html_url;
		requestURL+= "&kanal_id=" + kanal.kanal_id;
		requestURL+= "&zeitraum_id=" + zeitraum_id;
		// Diagramm erzeugen
		YAHOO.log("Beginne mit dem Erzeugen des Diagrammes fÃ¼r den Kanal " + kanal.messgroesse + " Request: " + requestURL, "info", "loadGraphHTML");
		YAHOO.util.Connect.asyncRequest("GET", requestURL, {
			success: function(o)
			{
				try
				{
					try
					{
						var graphHTML = eval("(" + o.responseText + ")");
					}
					catch(ex)
					{
						var kanal_id = o.getResponseHeader["X-Ostluft-Kanal-Id"].replace(/\s$/, '');
						var graphListItem = YAHOO.util.Dom.get("imageParagraph" + kanal_id);
						graphListItem.removeChild(YAHOO.util.Dom.get("progress" + kanal_id));
					
						var imageTypeString = "image/png";
						var element = document.createElement("p");
						YAHOO.util.Dom.setStyle(element, "color", "red");
						YAHOO.util.Dom.setStyle(element, "marginTop", "-1.5em");
						
						if (o.getResponseHeader["Content-Type"].substr(0, imageTypeString.length) == imageTypeString)
						{
							element.innerHTML = "Keine gÃ¼ltigen Messwerte fÃ¼r den Kanal " + kanal_id + " vorhanden!";
							YAHOO.log("Die RÃ¼ckgabe ist Fehlerhaft und kann nicht verarbeitet werden.", "error", "loadGraphHTML");
						}
						else
						{
							element.innerHTML = "Für diesen Zeitraum sind keine Daten vorhanden.";
							YAHOO.log("Die Rückgabe des Servers ergab den folgenden Fehler: " + ex + " Rückgabe: " + o.responseText, "error", "loadGraphHTML");
						}
						
						YAHOO.util.Dom.get("item" + kanal_id).appendChild(element);
						
						return;
					}
	
					// ÃœberprÃ¼fen ob der Server eine Exception zurÃ¼ckgegeben hat.
					if (graphHTML.exception)
					{													
						var kanal_id = o.getResponseHeader["X-Ostluft-Kanal-Id"].replace(/\s$/, '');
						var graphListItem = YAHOO.util.Dom.get("imageParagraph" + kanal_id);
						graphListItem.removeChild(YAHOO.util.Dom.get("progress" + kanal_id));
						
						var element = document.createElement("p");
						YAHOO.util.Dom.setStyle(element, "color", "red");
						YAHOO.util.Dom.setStyle(element, "marginTop", "0.5em;");
						
						element.innerHTML = "Für diesen Zeitraum sind keine Daten vorhanden.";
						
						YAHOO.util.Dom.get("item" + kanal_id).appendChild(element);
						
						throw graphHTML.exception;
					}
	
					var graphListItem = YAHOO.util.Dom.get("imageParagraph" + graphHTML.id);
	
					// Ladeanzeige wieder entfernen
					graphListItem.removeChild(YAHOO.util.Dom.get("progresstext" + graphHTML.id));
					graphListItem.removeChild(YAHOO.util.Dom.get("progress" + graphHTML.id));
	
					var imageURL = application.graph_image_url;
					imageURL+= "&graph_id=" + graphHTML.image.src;
	
					// Bild-Element erzeugen.
					var image = graphListItem.appendChild(document.createElement("img"));
					image.src = imageURL;
					image.id = graphHTML.id;
					// image.useMap = graphHTML.image.usemap;
					YAHOO.util.Dom.setStyle(image, 'width', "780px");
					YAHOO.util.Dom.setStyle(image, 'height', '300px');
	
					/*
					var map = graphListItem.appendChild(document.createElement("map"));
					map.id = graphHTML.imagemap.id;
	
					for(var i in graphHTML.imagemap.area)
					{
						var area = graphHTML.imagemap.area[i];
	
						var areaElement = map.appendChild(document.createElement("area"));
						areaElement.shape = area.shape;
						areaElement.coords = area.coords;
						areaElement.href = area.href;
						areaElement.title = area.title;
						areaElement.alt = area.alt;
					}
					
					recalulateContentSize();*/
	
				}
				catch(ex)
				{
					YAHOO.log("Beim Laden des Diagrammes ist folgender Fehler aufgetreten: " + ex, "error", "loadGraphHTML");
				}
			},
			failure: function(o)
			{
				YAHOO.log("Die ZeitrÃ¤ume konnten nicht von der URL geladen werden! Server meldet Fehler " + o.status + " " + o.statusText, "error", "loadGraphHTML");
			},
			scope: this
		});

	}, // Ende der Methode: loadGraph()

	/**
	 * Callback fÃ¼r den Ladevorgang der Kanalliste
	 */
	loadKanalListAsyncCallback: {
		success: function(o)
		{
			try
			{
				try
				{
					var kanalList = eval("(" + o.responseText + ")");
				}
				catch(ex)
				{
					YAHOO.log("Fehler beim Deserialisieren der JSON-RÃ¼ckgabe: " + o.responseText, "warn", "loadKanalList");
				}

				var kanalListe = YAHOO.util.Dom.get("kanalListe");

				if (kanalList && (kanalList.length > 0))
				{
					kanalListe.innerHTML = "";

					var elList = kanalListe.appendChild(document.createElement("ul"));

					if (kanalList.length == 0)
					{
						YAHOO.log("Liste mit den KanÃ¤len wurde zurÃ¼ckgesetzt!", "warn", "loadKanalList");

						recalulateContentSize();
						return;
					}

					for(var i in kanalList)
					{
						var elListItem = elList.appendChild(document.createElement("li"));
						elListItem.id = "item" + kanalList[i].kanal_id;
						elListItem.className = "kanalListItem";

						// Paragraph mit Text erstellen
						var imageParagraph = elListItem.appendChild(document.createElement("p"));
						imageParagraph.id = "imageParagraph" + kanalList[i].kanal_id;

						// Statusanzeige erstellen und dem Paragraph hinzufÃ¼gen
						var progressImage = imageParagraph.appendChild(document.createElement("img"));
						progressImage.id = "progress" + kanalList[i].kanal_id;
						progressImage.src = application.resource_url + "/ajax-loader.gif";

						// Paragraph mit Text erstellen
						var dummyParagraph = imageParagraph.appendChild(document.createElement("span"));
						dummyParagraph.id = "progresstext" + kanalList[i].kanal_id;
						dummyParagraph.appendChild(document.createTextNode("Diagramm fÃ¼r " + kanalList[i].kanal.messgroesse + " laden..."));
						
						// Kanalliste laden
						application.loadGraph(kanalList[i].kanal, kanalList[i].zeitraum_id);
					}

					recalulateContentSize();

				}
				else
				{
					YAHOO.log("Es sind keine KanÃ¤le verfÃ¼gbar!", "warn", "loadKanalList");

					kanalListe.innerHTML = "<p>Oha! FÃ¼r diese Selektion wurden keine KanÃ¤le definiert!</p>";
				}

				YAHOO.log("Ende mit dem Laden der neuen Kanalliste!", "info", "loadKanalList");
			}
			catch(ex)
			{
				YAHOO.log("Beim Laden der ZeitrÃ¤ume ist folgender Fehler aufgetreten: " + ex, "error", "loadKanalList");
			}
		},
		failure: function(o)
		{
			YAHOO.log("Die ZeitrÃ¤ume konnten nicht von der URL geladen werden! Server meldet Fehler " + o.status + " " + o.statusText, "error", "loadKanalList");
		}
	}, // Ende des Callback-Objektes: loadKanalListAsyncCallback

	/**
	 * Wird aufgerufen wenn die Messdatengruppe (Schadstoffverlauf) geÃ¤ndert wird.
	 */
	onChangeMessdatenGruppe: function(e)
	{
		try
		{
			var messdatenGruppe = YAHOO.util.Event.getTarget(e);
			var messdatenGruppeID =  parseInt(messdatenGruppe.options[messdatenGruppe.selectedIndex].value);

			YAHOO.log("Messdatengruppe " + messdatenGruppeID + " gewÃ¤hlt!", "info", this.name);

			application.loadZeitraum(messdatenGruppeID);

			// Inhalt des Zeitraums lÃ¶schen, damit wir nicht versehentlich
			// einen gÃ¼ltigen Eintrag vor der Benachrichtigung des Wechsels
			// im Steuerelement haben.
			YAHOO.util.Dom.get("zeitraum").innerHTML = "";

			application.onChangedSelection(messdatenGruppe);
		}
		catch(ex)
		{
			YAHOO.log("Im Ereignishandler onChangeMessdatenGruppe ist folgender Fehler aufgetreten: " + ex, "error", this.name);
		}

	}, // Ende der Methode: onChangeMessdatenGruppe()

	/**
	 * Wird aufgerufen wenn die Messstation geÃ¤ndert wurde.
	 */
	onChangeMessstation: function(e)
	{
		try
		{
			var messstationElement = YAHOO.util.Event.getTarget(e);
			var messstationID = parseInt(messstationElement.options[messstationElement.selectedIndex].value);

			YAHOO.log("Messstation " + messstationID + " gewÃ¤hlt!", "info", this.name);

			application.onChangedSelection(messstationElement);
		}
		catch(ex)
		{
			YAHOO.log("Im Ereignishandler onChangeMessdatenGruppe ist folgender Fehler aufgetreten: " + ex, "error", this.name);
		}

	}, // Ende der Methode: onChangeMessdatenGruppe()

	/**
	 * Wird aufgerufen wenn der Zeitraum geÃ¤ndert wird.
	 */
	onChangeZeitraum: function(e)
	{
		try
		{
			var zeitraumGruppe = YAHOO.util.Event.getTarget(e);
			var zeitraumGruppeID =  parseInt(zeitraumGruppe.options[zeitraumGruppe.selectedIndex].value);

			YAHOO.log("Zeitraum " + zeitraumGruppeID + " gewÃ¤hlt!", "info", this.name);

			application.onChangedSelection(zeitraumGruppe);
		}
		catch(ex)
		{
			YAHOO.log("Im Ereignishandler onChangeZeitraum ist folgender Fehler aufgetreten: " + ex, "error", this.name);
		}

	}, // Ende der Methode: onChangeZeitraum()

	onChangedSelection: function(target)
	{
		var messstation_id = YAHOO.util.Dom.get("messstation").value;
		var messdaten_gruppe_id = YAHOO.util.Dom.get("messdatengruppe").value;
		var zeitraum_id = YAHOO.util.Dom.get("zeitraum").value;

		var kanalListeElement = YAHOO.util.Dom.get("kanalListe");

		if (messstation_id && messdaten_gruppe_id && zeitraum_id)
		{
			YAHOO.log("Diagramme anzeigen: Messstation " + messstation_id + "; Gruppe " + messdaten_gruppe_id + "; Zeitraum " + zeitraum_id, "info", "ActionPoint");

			application.loadKanalList(messstation_id, messdaten_gruppe_id, zeitraum_id);
		}
		else
		{
			YAHOO.log("Diagramme lÃ¶schen", "info", "ActionPoint");

			kanalListeElement.innerHTML = "";
		}

	} // Ende der Methode: onChangedSelection()

} // Ende der Klasse: MessdatenGruppeApplication

MessdatenGruppeApplication.prototype.loadMessstationen = function(messdatenGruppeID, messstationID) {

	YAHOO.util.Connect.asyncRequest("GET", this.messstationen_url + messdatenGruppeID, {
		success: function(o)
		{
			try
			{
				try
				{
					var messstationList = eval(o.responseText);
				}
				catch(ex)
				{
					YAHOO.log("Fehler beim Deserialisieren der JSON-RÃ¼ckgabe: " + o.responseText, "error", "ServerRequest");
				}

				var messdatenSelect = YAHOO.util.Dom.get("messstation");
				var selectedIndex = 0;
				
				// Optionen lÃ¶schen
				messdatenSelect.innerHTML = "";

				if (messstationList.length == 0)
				{
					var messstationOption = document.createElement("option");
					messstationOption.value = "";
					messstationOption.label = "Keine Messstationen verfÃ¼gbar!";
					messstationOption.text = messstationOption.label;

					messdatenSelect.options[messdatenSelect.options.length] = messstationOption;

					YAHOO.log("Es sind keine Messstationen verfÃ¼gbar...", "info", this.name);
				}
				else
				{
					var messstationOption = document.createElement("option");
					messstationOption.value = "";
					messstationOption.label = "Bitte eine Messstation wÃ¤hlen...";
					messstationOption.text = messstationOption.label;

					messdatenSelect.options[messdatenSelect.options.length] = messstationOption;

						YAHOO.log(messstationList.length + " Messstationen wurden geladen...", "info", this.name);

					for(var i in messstationList)
					{
						var messstationOption = document.createElement("option");
						messstationOption.value = messstationList[i].messstation_id;
						messstationOption.label = messstationList[i].name_mittel;
						messstationOption.text = messstationOption.label;
						
						messdatenSelect.options[messdatenSelect.options.length] = messstationOption;

						if (messstationOption.value == o.argument)
						{
							selectedIndex = messdatenSelect.options.length-1;
						}
					}
				}

				messdatenSelect.selectedIndex = selectedIndex;

				// Event auslÃ¶sen
				this.messstationLoadedEvent.fire(messdatenSelect);
				this.onChangedSelection(messdatenSelect);
			}
			catch(ex)
			{
				YAHOO.log("Beim Laden der Messstationen ist folgender Fehler aufgetreten: " + ex, "error", this.name);
			}
		},
		failure: function(o)
		{
			YAHOO.log("Die Messstationen konnten nicht von der URL geladen werden! Server meldet Fehler " + o.status + " " + o.statusText, "error", this.name);
		}, 
		argument: messstationID,
		scope: this
	});
	
} // Ende der Methode: MessdatenGruppeApplication.prototype.loadMessstationen()


/**
 * Beginnt mit dem Neuladen der ZeitrÃ¤ume fÃ¼r die unterschiedlichen Messdaten-Gruppen... (Ladevorgang ist asynchron)
 */
MessdatenGruppeApplication.prototype.loadMessdatengruppe = function(messdatengruppeID)
{
	YAHOO.util.Connect.asyncRequest("GET", this.messgruppe_url, {
		success: function(o)
		{
			try
			{
				try
				{
					var zeitraumList = eval(o.responseText);
				}
				catch(ex)
				{
					YAHOO.log("Fehler beim Deserialisieren der JSON-RÃ¼ckgabe: " + o.responseText, "error", "ServerRequest");
				}

				var zeitraumSelect = YAHOO.util.Dom.get("messdatengruppe");
				var selectedIndex = 0;

				// Optionen lÃ¶schen
				zeitraumSelect.innerHTML = "";

				if (zeitraumList.length == 0)
				{
					var zeitraumOption = document.createElement("option");
					zeitraum.value = "";
					zeitraumOption.label = "Keine VerlÃ¤ufe verfÃ¼gbar!";
					zeitraumOption.text = zeitraumOption.label;

					zeitraumSelect.options[zeitraumSelect.options.length] = zeitraumOption;

					YAHOO.log("Es sind keine VerlÃ¤ufe verfÃ¼gbar...", "info", this.name);
				}
				else
				{
					/* CAD:  TICKET #644 UPDATED: "Bitte einen Verlauf wÃ¤hlen..." entfernen.
					var zeitraumOption = document.createElement("option");
					zeitraumOption.value = "";
					zeitraumOption.label = "Bitte einen Verlauf wÃ¤hlen...";
					zeitraumOption.text = zeitraumOption.label;

					zeitraumSelect.options[zeitraumSelect.options.length] = zeitraumOption;
					*/
					YAHOO.log(zeitraumList.length + " VerlÃ¤ufe wurden geladen...", "info", this.name);

					for(var i in zeitraumList)
					{
						var zeitraumOption = document.createElement("option");
						zeitraumOption.value = zeitraumList[i].messdaten_gruppe_id;
						zeitraumOption.label = zeitraumList[i].bezeichnung;
						zeitraumOption.text = zeitraumOption.label;

						zeitraumSelect.options[zeitraumSelect.options.length] = zeitraumOption;
						
						if (zeitraumOption.value == o.argument)
						{
							selectedIndex = zeitraumSelect.options.length-1;
						}
					}
				}

				zeitraumSelect.selectedIndex = selectedIndex;

				this.onChangedSelection(zeitraumSelect);
			}
			catch(ex)
			{
				YAHOO.log("Beim Laden der VerlÃ¤ufe ist folgender Fehler aufgetreten: " + ex, "error", this.name);
			}
		},

		failure: function(o)
		{
			YAHOO.log("Die ZeitrÃ¤ume konnten nicht von der URL geladen werden! Server meldet Fehler " + o.status + " " + o.statusText, "error", this.name);
		}, 
		argument: messdatengruppeID,
		scope: this
	});

} // Ende der Methode: MessdatenGruppeApplication.prototype.loadMessstationen()

/**
 * Beginnt mit dem Neuladen der ZeitrÃ¤ume fÃ¼r die unterschiedlichen Messdaten-Gruppen... (Ladevorgang ist asynchron)
 */
MessdatenGruppeApplication.prototype.loadZeitraum = function(messdatenGruppeID)
{
	YAHOO.util.Connect.asyncRequest("GET", this.zeitraum_url + messdatenGruppeID, {
		success: function(o)
		{
			try
			{
				try
				{
					var zeitraumList = eval(o.responseText);
				}
				catch(ex)
				{
					YAHOO.log("Fehler beim Deserialisieren der JSON-RÃ¼ckgabe: " + o.responseText, "error", "ServerRequest");
				}

				var zeitraumSelect = YAHOO.util.Dom.get("zeitraum");

				// Optionen lÃ¶schen
				zeitraumSelect.innerHTML = "";

				if (zeitraumList.length == 0)
				{
					var zeitraumOption = document.createElement("option");
					zeitraumOption.value = "";
					zeitraumOption.label = "Bitte zuerst einen Verlauf wÃ¤hlen";
					zeitraumOption.text = zeitraumOption.label;

					zeitraumSelect.options[zeitraumSelect.options.length] = zeitraumOption;

					YAHOO.log("Bis ein Verlauf gewÃ¤hlt wurde sind keine Daten verfÃ¼gbar!", "warn", this.name);
				}
				else
				{
					/* CAD: TICKET #644: UPDATED: "Bitte einen Zeitraum wÃ¤hlen..." entfernen.
					var zeitraumOption = document.createElement("option");
					zeitraumOption.value = "";
					zeitraumOption.label = "Bitte einen Zeitraum wÃ¤hlen...";
					zeitraumOption.text = zeitraumOption.label;

					zeitraumSelect.options[zeitraumSelect.options.length] = zeitraumOption;
					*/	
					YAHOO.log(zeitraumList.length + " ZeitrÃ¤ume wurden geladen...", "info", this.name);

					for(var i in zeitraumList)
					{
						var zeitraumOption = document.createElement("option");
						zeitraumOption.value = zeitraumList[i].messdaten_gruppe_zeitraum_id;
						zeitraumOption.label = zeitraumList[i].bezeichnung;
						zeitraumOption.text = zeitraumOption.label;

						zeitraumSelect.options[zeitraumSelect.options.length] = zeitraumOption;
					}
				}

				if (zeitraumSelect.options.length > 1)
				{
					zeitraumSelect.selectedIndex = 1;
				}

				this.onChangedSelection(zeitraumSelect);
			}
			catch(ex)
			{
				YAHOO.log("Beim Laden der ZeitrÃ¤ume ist folgender Fehler aufgetreten: " + ex, "error", this.name);
			}
		},
		failure: function(o)
		{
			YAHOO.log("Die ZeitrÃ¤ume konnten nicht von der URL geladen werden! Server meldet Fehler " + o.status + " " + o.statusText, "error", this.name);
		},
		scope:this
	});

} // Ende der Methode: MessdatenGruppeApplication.prototype.loadZeitraum()

YAHOO.ostluft.util.getURLParameter = function(name) {
	
	var queryString = (window.location.search.indexOf("?") == -1) ? window.location.search : window.location.search.substring(1);
	var queryParameters = queryString.split("&");
	
	for(var i = 0; i < queryParameters.length; i++)
	{
		var queryParameter =  queryParameters[i].split("=");
		if (queryParameter[0] == name)
		{
			return queryParameter[1];
		}
	}
	
	return null;
}
