/*
 * Erweiterungen des Date-Objektes
 *
 * @author Thomas Scholz <thomasscholz@maxsysteme.de>
 */

/**
 * Übernimmt das Datum des übergebenen Datumsobjektes
 *
 * @param {Date} date zu kopierendes Datum
 */
Date.prototype.copy = function(date)
{
	this.setTime(date.getTime());
}

/**
 * Setzt den Zeitbestandtteil des Datumsobjektes auf 0
 */
Date.prototype.clearTime = function()
{
	this.setHours(0);
	this.setMinutes(0);
	this.setSeconds(0);
	this.setMilliseconds(0);
}

/**
 * Gibt zurück, ob das übergebene Datum kalendarisch hinter dem Date-Objekt liegt
 *
 * @param {Date} date Vergleichsdatum
 * @param {Boolean} equal Gleiches Datum als wahr oder falsch zurückgeben
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.after = function(date, equal)
{
	//alert(this.toLocaleString()+" => "+this.getTime()+"\n"+date.toLocaleString()+" => "+date.getTime()+"\n"+(this.getTime() > date.getTime()));
	if (equal)
		return (this.getTime() >= date.getTime());
	else
		return (this.getTime() > date.getTime());
}

/**
 * Gibt zurück, ob das übergebene Datum vom Datum her hinter dem Date-Objekt liegt
 * (d.h. ohne Berücksichtigung der Zeit)
 *
 * @param {Date} date Vergleichsdatum
 * @param {Boolean} equal Gleiches Datum als wahr oder falsch zurückgeben
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.afterByDate = function(date, equal)
{
	// um das originale Datumsobjekt nicht zu verändern,
	// wird der Vergleich mit einer Kopie durchgeführt!
	var date0 = new Date();
	date0.copy(this);
	date0.clearTime();
	date.clearTime();
	return date0.after(date, equal);
}

/**
 * Gibt zurück, ob das üergebene Datum kalendarisch vor dem Date-Objekt liegt
 *
 * @param {Date} date Vergleichsdatum
 * @param {Boolean} equal Gleiches Datum als wahr oder falsch zurückgeben
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.before = function(date, equal)
{
	if (equal)
		return (date.getTime() >= this.getTime());
	else
		return (date.getTime() > this.getTime());
}

/**
 * Gibt zurück, ob das übergebene Datum vom Datum her vor dem Date-Objekt liegt
 * (d.h. ohne Berücksichtigung der Zeit)
 *
 * @param {Date} date Vergleichsdatum
 * @param {Boolean} equal Gleiches Datum als wahr oder falsch zurückgeben
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.beforeByDate = function(date, equal)
{
	// um das originale Datumsobjekt nicht zu verändern,
	// wird der Vergleich mit einer Kopie durchgeführt!
	var date0 = new Date();
	date0.copy(this);
	date0.clearTime();
	date.clearTime();
	return date0.before(date, equal);
}

/**
 * Gibt zurück, ob das übergebene Datum dem Date-Objekt im Datum gleicht
 * (ohne Berücksichtigung der Zeit)
 *
 * @param {Date} date Vergleichsdatum
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.equalByDate = function(date)
{
	return (
			this.getFullYear() == date.getFullYear()
		&&	this.getMonth() == date.getMonth()
		&&	this.getDate() == date.getDate()
	);
}

/**
 * Gibt zurück, ob das übergebene Datum dem Date-Objekt in Datum und Zeit gleicht
 * (ohne Berücksichtigung der Sekunden und Millisekunden)
 *
 * @param {Date} date Vergleichsdatum
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.equalByDateTime = function(date)
{
	return (
			this.equalByDate(date)
		&&	this.getHours() == date.getHours()
		&&	this.getMinutes() == date.getMinutes()
	);
}

/**
 * Gibt zurück, ob das Date-Objekt kalendarisch zwischen den übergebenen Daten liegt
 *
 * @param {Date} date1 erstes Vergleichsdatum
 * @param {Date} date2 zweites Vergleichsdatum
 * @param {Boolean} equal Gleiches Datum als wahr oder falsch zurückgeben
 * @return Wahrheitswert
 * @type Boolean
 */
Date.prototype.between = function(date1, date2, equal)
{
	if (equal)
		return (this.after(date1, true) && this.before(date2, true));
	else
		return (this.after(date1) && this.before(date2));
}

/**
 * Addiert eine Anzahl an Tagen zum Datum
 *
 * @param {Number} days Tage
 */
Date.prototype.addDays = function(days)
{
	// 86400000 => 1000ms * 60s * 60m * 24h (= 1 Tag)
	this.setTime(this.getTime() + (86400000 * days));
}

/**
 * Gibt die Tagesdifferenz zwischen dem Date-Objekt und einem Vergleichsdatum zurück
 *
 * @param {Date} date Vergleichsdatum
 * @return Differenz in Tagen
 * @type Number
 */
Date.prototype.getDayDiff = function(date)
{
	// 86400000 => 1000ms * 60s * 60m * 24h (= 1 Tag)
	return parseInt((date.getTime() - this.getTime()) / 86400000);
}

/**
 * Gibt die absolute Anzahl an Tagen seit dem 1.1.70 zurück
 *
 * @return Anzahl an Tagen seit dem 1.1.70
 * @type Number
 */
Date.prototype.toDays = function()
{
	// 86400000 => 1000ms * 60s * 60m * 24h (= 1 Tag)
	return parseInt(this.getTime() / 86400000);
}

/**
 * Gibt die Kurzbezeichnung eines Tages zurück
 *
 * @param {String} lg Sprache (optional, Standard = deutsch)
 * @return Kurzbezeichnung eines Tages
 * @type String
 */
Date.prototype.getShortDayName = function(lg)
{
	switch (this.getDay()) {
		case 0:		return (lg == "en") ? "Su" : "So";
		case 1:		return (lg == "en") ? "Mo" : "Mo";
		case 2:		return (lg == "en") ? "Tu" : "Di";
		case 3:		return (lg == "en") ? "We" : "Mi";
		case 4:		return (lg == "en") ? "Th" : "Do";
		case 5:		return (lg == "en") ? "Fr" : "Fr";
		case 6:		return (lg == "en") ? "Sa" : "Sa";
	}
}

/**
 * Importiert ein Datum im SQL-Format
 *
 * @param {String} sql SQL-Datum
 */
Date.prototype.parseSQL = function(sql)
{
	var date	= sql.split(" ");
	var time	= date[1].split(":");
	date		= date[0].split("-");

	this.setFullYear(date[0]);
	this.setMonth(date[1] - 1);
	this.setDate(date[2]);

	this.setHours(time[0]);
	this.setMinutes(time[1]);
	this.setSeconds(time[2]);
	this.setMilliseconds(0);}

/**
 * Gibt das Date-Objekt nach dem deutschen Datumsformat zurück (TT.MM.YYYY)
 *
 * @return formatiertes Datum
 * @type String
 */
Date.prototype.formatDate = function()
{
	/**
	 * Hilfsfunktion, die einstellige Werte mit einer führenden Null zurückgibt
	 *
	 * @param val {Number} Wert
	 * @return zweistelliger Wert
	 * @type String
	 */
	function fillZero(val)
	{
		return ((String(val).length == 1) ? "0" : "") + val;
	}

	return fillZero(this.getDate()) + "." + fillZero((this.getMonth()+1)) + "." + this.getFullYear();
}

/**
 * Gibt das Date-Objekt als formatierte Zeit zurück (HH:MM)
 *
 * @return formatierte Zeit
 * @type String
 */
Date.prototype.formatTime = function()
{
	/**
	 * Hilfsfunktion, die einstellige Werte mit einer fü½hrenden Null zurückgibt
	 *
	 * @param val {Number} Wert
	 * @return zweistelliger Wert
	 * @type String
	 */
	function fillZero(val)
	{
		return ((String(val).length == 1) ? "0" : "") + val;
	}

	return fillZero(this.getHours()) + ":" + fillZero(this.getMinutes());
}

/**
 * Gibt das Date-Objekt als formatiertes Datum mit Zeit zurück (TT.MM.YYYY, HH:MM)
 *
 * @return formatierte Zeit
 * @type String
 */
Date.prototype.formatDateTime = function()
{
	return this.formatDate() + ", " + this.formatTime();
}

/**
 * Gibt den echten Monat zurück, d.h. die interne Darstellung  + 1
 *
 * @return Monat
 * @type {Number}
 */
Date.prototype.getRealMonth = function()
{
	return eval(this.getMonth() + 1);
}
