<!--

/*

Solar-Logger - A Daemon for logging Data from a Solar Plant
Copyright (C) 2007  Klaus Dotterweich (dr.dotti@gmx.de)

This program is free software; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program;
if not, see <http://www.gnu.org/licenses/>.



Solar-Logger - Ein Daemon zum loggen der Daten einer Solaranlage
Copyright (C) 2007  Klaus Dotterweich (dr.dotti@gmx.de)

Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License,
wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren,
entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.

Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird,
aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder
der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.

Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben.
Falls nicht, siehe <http://www.gnu.org/licenses/>.

*/

// Das Objekt MonatsGrafik
// Um diese Funktion nutzen zu können müssen diese LIB's im HTML Document eingebunden sein:
//	<script type="text/javascript" src="ZahlenFormatierung.js"></script>
//	<script type="text/javascript" src="jquery-1.2.1.pack.js"></script>
// 	<script type="text/javascript" src="diagram.js"></script>

// Diese beiden Variablen müssen Global sein!!!
var MonatsGrafik					= new MonatsGrafik (100, 100, 0, 0);

var MonatsDaten						= new Array();
var MonatsDatenZaehler				= 0;



function MonatsGrafik (Breite, Hoehe, Monat, Jahr)
{  
	// Nur für Debug Zwecke
	this.Debug = 0;											// Auf 1 setzen für DebugAusgaben



	// Alle externen Funktionen festlegen
	this.MonatSetzen				= _MonatSetzen;			// Mit dieser Funktion kann der anzuzeigende Monat geändert werden
	this.JahrSetzen					= _JahrSetzen;			// Mit dieser Funktion kann das anzuzeigende Jahr geändert werden
	this.GroesseAendern				= _GroesseAendern;

	this.Zeichnen					= _GrafikZeichnen;
	this.DatenLaden					= _MonatsDatenLaden;
	this.Aktualisieren				= _GrafikAktualisieren;

	// Alle internen Funktionen festlegen
	this.intMaxTageSetzen			= _MaxTageSetzen;
	this.intAchseXSetzen			= _AchseXSetzen;
	this.intBalkenBreiteSetzen		= _BalkenBreiteSetzen;
	this.intDiagrammZeichnen		= _DiagrammZeichnen;

	this.Heute						= new Date();			// Heutiges Datum
	
	this.MonatSetzen (Monat);								// Anzuzeigenden Monat setzten
	this.JahrSetzen (Jahr);									// Anzuzeigendes Jahr setzten
	
	this.AchseYmin   				= 0;
	this.AchseYmax   				= 30000;
	
	this.EinrueckenLinks			= 75;					// Diagramm um 75px von Links einrücken wegen Skalenbeschriftung
	this.EinrueckenOben				= 20;					// Diagramm um 20px von Oben einrücken wegen Skalenbeschriftung
		
	this.FarbeHintergrund			= "#3366FF";			// Blau
	this.FarbeText					= "#000000";			// Schwarz
	this.FarbeGitternetz			= "#000099";			// Dunkel Blau
	this.FarbeBalken				= "#FFFF00";			// Gelb
	this.FarbeBalkenText			= "#FFFFFF";			// Weiß

	this.GroesseAendern (Breite, Hoehe);					// Größe der MonatsGrafik setzen

	this.Diagramm					= new Diagram();		// Das Diagramm Objekt erzeugen
	this.Balken 					= new Array(31);		// Ein Array für die Balken Objekte erzeugen
	
	this.GrafikWurdeGezeichnet 		= 0;					// Wird auf 1 gesetzt wenn die Grafik das erste mal gezeichnet wurde.

	this.DatenDatum 				= new Array(31);		// Ein Array für die Datum's der Daten erzeugen
	this.DatenWert 					= new Array(31);		// Ein Array für die Werte der Daten erzeugen

	for(var i = 0; i < 31; i++)								// Daten löschen
	{
		this.DatenDatum[i]			= 0;
		this.DatenWert[i]			= 0;
	}

	this.Diagramm.SetGridColor(this.FarbeGitternetz);

	this.Diagramm.SetText("kW","h", "");					// Skalenbeschriftung Setzen

	this.Diagramm.XScale			= 2;					// Type der X Skala festlegen (2 = Datum/Zeit)
	this.Diagramm.XScale			= "function _XSkala";	// Funktion zum Beschriften der X Skala festlegen
	this.Diagramm.XScalePosition	= "bottom-right";		// Position der X Skala
	this.Diagramm.XGridDelta		= 86400000;				// Je Tag eine Gitternetzlinie

	this.Diagramm.YScale			= "function _YSkala";	// Funktion zum Beschriften der Y Skala festlegen

	this.Aktualisieren();
				
	// Nur für Debug Zwecke
	if (this.Debug == 1)
	{
		alert (	"MonatsGrafik Objekt erstellt \r\n" + 
				"\n" +			
				"this.Heute = " + this.Heute + "\n" +
				"this.Monat = " + this.Monat + "\n" +
				"this.Jahr = " + this.Jahr + "\n" +
				"this.MaxTage = " + this.MaxTage + "\n" +
				"this.AchseXmin = " + this.AchseXmin + "\n" +
				"this.AchseXmax = " + this.AchseXmax + "\n" +
				"this.AchseYmin = " + this.AchseYmin + "\n" +
				"this.AchseYmax = " + this.AchseYmax + "\n" +
				"this.EinrueckenLinks = " + this.EinrueckenLinks + "\n" +
				"this.Breite = " + this.Breite + "\n" +
				"this.EinrueckenOben = " + this.EinrueckenOben + "\n" +
				"this.Hoehe = " + this.Hoehe + "\n" +
				"this.BalkenBreite = " + this.BalkenBreite + "\n" +
				"");
	}
}



// Anzuzeigenden Monat setzten
function _MonatSetzen (Monat)
{
	if (Monat < 1 || Monat > 12)
	{
		this.Monat = this.Heute.getMonth() + 1;	// Auf aktuellen Monat wenn Monat ungültig
	}
	else
	{
		this.Monat = Monat;						// Sonst auf den übergebenen Monat
	}
	
	this.intMaxTageSetzen();
	this.intAchseXSetzen();
	if (this.GrafikWurdeGezeichnet == 1) MonatsDatenLaden();
}



// Anzuzeigendes Jahr setzten
function _JahrSetzen (Jahr)
{
	if (Jahr < 2000)
	{
		 this.Jahr = this.Heute.getFullYear();			// Auf aktuelles Jahr wenn Jahr < 2000 ungültig
	}
	else
	{
		this.Jahr = Jahr;								// Sonst auf des übergebene Jahr
	}
	
	this.intMaxTageSetzen();
	this.intAchseXSetzen();
	if (this.GrafikWurdeGezeichnet == 1) MonatsDatenLaden();
}



// Max Anzahl der Tage des Aktuellen Monats Setzen
function _MaxTageSetzen ()
{
	this.MaxTage = 32 - new Date(this.Jahr, this.Monat - 1, 32).getDate();
	
	this.intBalkenBreiteSetzen();
}



// Größe der MonatsGrafik Ändern
function _GroesseAendern (Breite, Hoehe)
{
	this.Breite			= Breite;											// Breite der Monatsgrafik
	this.Hoehe			= Hoehe;											// Höhe der Monatsgrafik
	
	this.intBalkenBreiteSetzen();
	this.Aktualisieren();
}



// AchseX Setzen
function _AchseXSetzen ()
{
	this.AchseXmin 		= Date.UTC(this.Jahr, this.Monat - 1, 1, 0, 0, 0);
	this.AchseXmax 		= Date.UTC(this.Jahr, this.Monat - 1, this.MaxTage, 23, 59, 0, 0);
}



// BalkenBreite Setzen
function _BalkenBreiteSetzen ()
{
	this.BalkenBreite	= (this.Breite - this.EinrueckenLinks) / this.MaxTage / 2;	// Breite der Balken festlegen
}



// Das Diagramm einmalig Zeichnen
function _GrafikZeichnen ()
{
	this.intDiagrammZeichnen();
}



// Das Diagramm einmalig Zeichnen
function _DiagrammZeichnen ()
{
	document.open();

	// Balken Zeichnen
	i = 0;
	while (i < 31)
	{
		x = this.Diagramm.ScreenX (this.DatenDatum[i]);
		this.Balken[i] = new Bar (x - this.BalkenBreite/2, this.Diagramm.ScreenY(this.DatenWert[i]),
								  x + this.BalkenBreite/2, this.Diagramm.ScreenY(0),
								  this.FarbeBalken, "", this.FarbeBalkenText, Math.floor(this.DatenWert[i] / 100)/10+" kW");
		i++;
	}

	this.Diagramm.Draw(this.FarbeHintergrund, this.FarbeText, false);

	document.close();

	this.GrafikWurdeGezeichnet = 1;
}



// Das Diagramm Aktualisieren
function _GrafikAktualisieren ()
{	
	if (this.Diagramm)
	{
		this.Diagramm.SetFrame(this.EinrueckenLinks, this.EinrueckenOben, this.Breite, this.Hoehe);
		this.Diagramm.SetBorder(this.AchseXmin, this.AchseXmax, this.AchseYmin, this.AchseYmax);

		if (this.GrafikWurdeGezeichnet == 1)
		{
			// Daten auswaehlen und sortieren
			for(i = MonatsDaten.length - 1; i >= 0; i--)
			{
				sDatum = _getDatum (MonatsDaten[i]);
								
				if (sDatum.substring(3,10) == (this.Monat.toString().AnzStellen(2) + "." + this.Jahr))
				{
					datum = new Date (sDatum.substring(6,10), sDatum.substring(3,5) - 1, sDatum.substring(0,2), 14, 0, 0);	// die 14 ist zum Verschieben der Balken nach rechts

					this.DatenDatum[datum.getDate() - 1]	= datum;
					this.DatenWert[datum.getDate() - 1]		= _getWert (MonatsDaten[i]);
				}
			}

			// Balken Aktualisieren
			i = 0;
			while (i < 31)
			{
				x = this.Diagramm.ScreenX (this.DatenDatum[i]);
				
				this.Balken[i].ResizeTo (x - this.BalkenBreite/2, this.Diagramm.ScreenY(this.DatenWert[i]),
										 this.BalkenBreite, this.Diagramm.ScreenY(0) - this.Diagramm.ScreenY(this.DatenWert[i]));
				i++;
			}

			this.Diagramm.Draw(this.FarbeHintergrund, this.FarbeText, false);
		}
	}
}



// Funktion zum Beschriften der X Skala
function _XSkala(x)
{
  var day = new Date(x).getDate();
  return "" + day;
}



// Funktion zum Beschriften der X Skala
function _YSkala(y)
{
	return "" + Math.floor (y / 1000) + " kWh";
}



// Hilfsfunktion für DatenLaden
function _getDatum (Zeile)
{
	var Stelle = Zeile.indexOf("|");
	if (Stelle <= 0 )
		return Zeile.substr(0);
	return Zeile.substr(0, Stelle);
}



// Hilfsfunktion für DatenLaden
function _getWert (Zeile)
{
	var pnt2 = Zeile.indexOf("|");
	var pnt1 = pnt2 + 1;
	pnt2 = Zeile.indexOf("|", pnt1);
	if (pnt2 <= 0)
	{
		return Zeile.substr(pnt1);
	}
	else
	{
		return Zeile.substr(pnt1, pnt2 - pnt1);
	}
}



// Mit AJAX die benötigten Daten laden
function _MonatsDatenLaden(Pfad)
{
	this.DatenPfad = Pfad;
	if (this.GrafikWurdeGezeichnet == 1) MonatsDatenLaden();
}



// Mit AJAX die benötigten Daten laden
function MonatsDatenLaden()
{
	if (!MonatsGrafik) return;
	
	for (var i = 0; i < 31; i++)								// Alte Daten löschen
	{
		MonatsGrafik.DatenDatum[i]		= 0;
		MonatsGrafik.DatenWert[i]		= 0;
	}

	MonatsDatenZaehler = 0;										// Daten Zähler zurücksetzen

	MonatsGrafik.Aktualisieren();								// Grafik leer neu Zeichnen

	$.getScript (MonatsGrafik.DatenPfad + (MonatsGrafik.Jahr - 2000).toString().AnzStellen(2) + MonatsGrafik.Monat.toString().AnzStellen(2) + ".js",
					function()
					{
						MonatsGrafik.Aktualisieren();
						setTimeout('MonatsDatenLaden()', 600000);
					}
				);
}



//-->
