
/****************************************************************************
 * datelib.js | GPL - GNU PUBLIC LICENSE
 * version: 0.2
 * copyright 2004 by Frank Nägler | mail@naegler.net
 * http://datelib.naegler.net
 ****************************************************************************
 ****************************************************************************
 *
 * Diese library erweitert das Date-Objekt um eine neue Methode.
 * Diese Methode nennt sich getPatternDate(Format) und gibt das
 * Datum des Objektes in dem Format zurück, welches über das 
 * Format betimmt wurde. Möglich Formatierungen sind die folgenden
 * sowie alle Zeichen, die nicht einer der Platzhalter ist.
 * Wenn die Ausgaben in englisch und nicht in deutsch erfolgen
 * soll, so muss dem Pattern nur ein "e#" vorweg gesetzt werden,
 * das eigentliche Pattern startet erst nach der #.
 * 
 * a  =>  Ante meridiem und Post meridiem              [am oder pm]
 * A  =>  Ante meridiem und Post meridiem              [AM oder PM]
 * d  =>  Tag des Monats, 2-stellig mit führender Null [01 bis 31]
 * j  =>  Tag des Monats ohne führende Nullen          [1 bis 31]
 * m  =>  Monat als Zahl, mit führenden Nullen         [01 bis 12]
 * n  =>  Monat als Zahl, ohne führende Nullen         [1 bis 12]
 * Y  =>  Vierstellige Jahreszahl                      [1999 oder 2003]
 * y  =>  Jahreszahl, zweistellig                      [99 oder 03]
 * L  =>  Schaltjahr oder nicht                        [1 oder 0]
 * G  =>  24-Stunden-Format, ohne führende Nullen      [0 bis 23]
 * H  =>  24-Stunden-Format, mit führenden Nullen      [00 bis 23]
 * g  =>  12-Stunden-Format, ohne führende Nullen      [1 bis 12]
 * h  =>  12-Stunden-Format, mit führenden Nullen      [01 bis 12]
 * i  =>  Minuten mit führenden Nullen                 [00 bis 59]
 * s  =>  Sekunden, mit führenden Nullen               [00 bis 59]
 * D  =>  Tag der Woche mit zwei Buchstaben            [Mo bis So]
 * l  =>  Ausgeschriebener Tag der Woche               [Montag bis Sonntag]
 * M  =>  Monatsname mit drei Buchstaben               [Jan bis Dez]
 * F  =>  Monat als ganzes Wort, wie Januar oder März  [Januar bis Dezember]
 * t  =>  Anzahl der Tage des Monats                   [28 bis 31]
 *
 ****************************************************************************
 * since 0.2
 ***********
 * - beliebiger Text kann jetzt angegeben werden, in dem jedem Zeichen ein /
 *   voran gestellt wird (Beispiel: "/H/a/m/b/u/r/g/,/ /d/e/n d.m.Y" wird
 *   zu: "Hamburg, den 23.03.2004"
 **************************************************************************** 
 * Beispiele:
 **************************************************************************** 
 *
 * "d.m.Y H:i:s A"
 * 05.02.2004 23:36:15 PM
 *
 **************************************************************************** 
 *
 * "e#d. F Y"
 * 05. February 2004
 *
 **************************************************************************** 
 *
 * "Y-m-d"
 * 2004-02-05
 *
 **************************************************************************** 
 *
 * "d/m/Y"
 * 05/02/2004
 *
 **************************************************************************** 
 */

Date.prototype.getPatternDate = GetPatternDate;

function GetPatternDate()
{
	var res = "";
	var lang = "g";
	var ii = 0;
	var pattern = arguments[0];
	if (pattern.substr(0,2).indexOf('#') != -1) 
	{
		lang = pattern.substr(0,1);
		pattern = pattern.substr(2,pattern.length);
	}
	var shortDay = new Array('So','Mo','Di','Mi','Do','Fr','Sa','Sun','Mon','Tue','Wed','Thu','Fry','Sat');
	var longDay = new Array('Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
	var shortMonth = new Array('Jan','Feb','Mrz','Apr','Mai','Jun','Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez','Jan','Feb','Mar','Apr','May','Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
	var longMonth = new Array('Januar','Februar','März','April','Mai','Juni','Juli', 'August', 'September', 'Oktober', 'November', 'Dezember','January','February','March','April','May','June','July', 'August', 'September', 'October', 'November', 'December');
	var daysOfMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	
	var j = this.getDate();
	var d = (j < 10)?('0'+j):(j);
	var n = this.getMonth() + 1;
	var m = (n < 10)?('0'+n):(n);
	var y = this.getYear();
	var Y = (y < 999)?(y + 1900):(y);
	    Y = String(Y);
	    y = Y.substr(2,2);
	var G = this.getHours();
	var H = (G < 10)?('0'+G):(G);
	var g = (G > 12)?(G-12):(G);
	    g = (G == 0)?(12):(G);
	var h = (g < 10)?('0'+g):(g);
	var a = (this.getHours() < 12)?("am"):("pm");
	var A = (this.getHours() < 12)?("AM"):("PM");
	var i = this.getMinutes();
	var s = (this.getSeconds() < 10)?('0'+this.getSeconds()):(this.getSeconds());
	var D = (lang == 'e')?(shortDay[this.getDay()+7]):(shortDay[this.getDay()]);
	var l = (lang == 'e')?(longDay[this.getDay()+7]):(longDay[this.getDay()]);
	var M = (lang == 'e')?(shortMonth[this.getMonth()+12]):(shortMonth[this.getMonth()]);
	var F = (lang == 'e')?(longMonth[this.getMonth()+12]):(longMonth[this.getMonth()]);
	
	var schaltjahr;
	if ((Number(Y)%400) == 0) schaltjahr = true;
	else if ((Number(Y)%100) == 0) schaltjahr = false;
	else if ((Number(Y)%4) == 0) schaltjahr = true;
	else schaltjahr = false;

	var t = (this.getMonth() == 1 && schaltjahr)?(daysOfMonth[this.getMonth()]+1):(daysOfMonth[this.getMonth()]);
	
	for (ii=0;ii<pattern.length;ii++)
	{
		switch (pattern.charCodeAt(ii))
		{
			case 97: res += a; break;
			case 65: res += A; break;
			case 106: res += j; break;
			case 100: res += d; break;
			case 110: res += n; break;
			case 109: res += m; break;
			case 121: res += y; break;
			case 89: res += Y; break;
			case 71: res += G; break;
			case 72: res += H; break;
			case 103: res += g; break;
			case 104: res += h; break;
			case 105: res += i; break;
			case 115: res += s; break;
			case 68: res += D; break;
			case 108: res += l; break;
			case 77: res += M; break;
			case 70: res += F; break;
			case 116: res += t; break;
			case 47: res += pattern.charAt(++ii); break;
			default : res += pattern.charAt(ii);break;
		}
	}

	return res;
}
