/*
   Datei: datum.js
   Autor: Struppi struebig@gmx.net
   Datum: 17.05.2004
*/

function getFullYear(date)
{
    if(!date) date = new Date();
    if(typeof date.getFullYear != 'undefined') return date.getFullYear();
    var year = date.getYear();
    if(year < 1000) year += 2000;
    return year;
}

function last_Modified(doc)
{
     if(!doc) doc = document;
     var datum = new Date(doc.lastModified);
     var year = getFullYear(datum);

     if(year < 2000) datum.setYear(year + 100);

     return strftime(datum);
}

function deltaDays(date1, date2)
{
    if(!date2) date2 = new Date();
    if(!date1 || typeof date1.getMonth == 'undefined') return null;

    var check1 = new Date(getFullYear(date1), date1.getMonth(), date1.getDate());
    var check2 = new Date(getFullYear(date2), date2.getMonth(), date2.getDate());

    return Math.round(Math.abs(check1 - check2) / (1000 * 60 * 60 * 24 ));
}

function weekOfMonth(d)
{
    if(!d) return null;
    var t = d.getDate();
    var w = 0;
    while(t>0) {t -=7;w++}
    return w;
}

///////////////////////////////////////////////////////////
// checkDate(string)
// string => TT.MM.YYYY
// auf ein gültiges Datum überprüfen
// gibt ein Datum Objekt zurück
function checkDate(string)
{
    if(!string) return null;
    string += '';

    string = string.replace(/[^0-9^\.]/g, '');

    var split = string.split(".");
    var day = parseInt(split[0], 10);
    var month = parseInt(split[1] || 0, 10);
    var year = parseInt(split[2] || 0, 10);

    if(isNaN(year)) year = getFullYear();;

    var check = new Date(year, month - 1, day);
    var day2 = check.getDate();
    var year2 = getFullYear(check);
    var month2 = check.getMonth() + 1;

    if ( year2 == year && month == month2 && day == day2 ) return check;
    return null;
}

function formatDate(datum, uhrzeit)
{
    if(!datum) datum = new Date();

    var y = getFullYear(datum);
    var m = datum.getMonth();m++;
    var d = datum.getDate();
	
	var uhr = "";
    if(uhrzeit)
    {
       var x = '00' + datum.getHours();
       uhr += ' [' + x.substring( x.length - 2);
       x = '00' + datum.getMinutes();
       uhr += ':' + x.substring(  x.length - 2) + ']';
    }
    var wd = (new Array( 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'))[datum.getDay()]
    //return (wd + ' ' + d +"." + m + "." + y + uhr);
    
    return ( d +"." + m + "." + y + uhr);
}

///////////////////////////////////////////////////////////
// strftime(Datum [, format_string])
function strftime(datum, format)
{
    if(typeof datum == 'string') datum = checkDate(datum);
    if(!datum) datum = new Date();
    if(!format) format = '%c';
    var string = '';

    for(var i = 0; i < format.length; i++)
    {
        var c = format.charAt(i);
        if(c == '%')
        {
            var p = format.charAt(++i);
            if(p && typeof date_param[p] == 'function' )
            {
               string += date_param[p](datum);
            }
        }
        else
        {
            string += c;
        }
    }

    return string;
}
var SEC_DAY = 60 * 60 * 24; // Sekunden eines Tages
var LOCALE = new Object();

function setLocale(l)
{
    if(!l) l = navigator.language || navigator.userLanguage;
    l = l.substring(0,2).toLowerCase();

    // t_fmt_ampm - Formatstring für die Zeitausgabe mit AM und PM mit dem %r-Deskriptor.
    LOCALE.t_fmt_ampm = ' ';
    // am_pm - Zwei strings, welche für "AM" und "PM" ausgegeben werden. Für die Verwendung des %p-Deskriptors.
    LOCALE.am_pm = ['AM', 'PM'];
    // abday - Abkürzung der sieben Wochentage (beginnend mit Sonntag) in der Landessprache.
    // Diese werden für den %a-Deskriptor benötigt.
    LOCALE.abday = l == 'de' ? ['son', 'mon', 'die', 'mit', 'don', 'fre', 'sam'] :
    l == 'it' ? ['dom','lun','mar','mer','gio','ven','sab'] :
    l == 'jp' ? ['nic','get','kay','sui','mok','kin','doy'] :
    l == 'fr' ? ['dim','lun','mar','mer','jeu','ven','sam'] :
    l == 'es' ? ['dom','lun','mar','mié','jue','vie','sáb'] :
    l == 'pt' || l == 'br' ? ['dom','seg','ter','qua','qui','sex','sáb'] :
    ['sun','mon','tue','wed','thu','fri','sat']
    ;
    // day - Der vollständige Name der sieben Wochentage. Für den %A-Deskriptor.
    LOCALE.day = l == 'de' ? ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'] :
    ['sunday', 'monday', 'tuesday', 'wendsday', 'thursday', 'friday', 'saturday'];

    // abmon - Dreibuchstabige Abkürzung der 12 Monate (beginnend mit Januar). Für den %b-Deskriptor.
    // mon - Die vollständigen Monatsnamen. Für den %B-Deskriptor.
    LOCALE.mon = l == 'de' ? ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] :
    ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'septemper', 'oktober', 'november', 'dezember']
    ;
    LOCALE.abmon = l == 'de' ? ['Jan', 'Feb', 'Mrz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'] :
    ['jan', 'feb', 'mrz', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dez']
    ;

    // d_t_fmt - Diese Variable enthält einen Formatstring für strftime() etc.,
    // der verwendet werden soll, wenn der %c-Deskriptor (Ausgabe von Datum und Zeit) angegeben wurde.
    // (Beispielsweise "%a %d %b %Y %T %Z")

    LOCALE.d_t_fmt = l == 'de' ? "%Y-%m-%d %H:%M:%S" : // die Zeit im ISO 8601-Format
    "%m-%Y-%d %H:%M:%S"
    ;
    // d_fmt - Formatstring für den %x-Deskriptor.
    // t_fmt - Formatstring für den %X-Deskriptor.
    LOCALE.d_fmt = '%m/%d/%y';
    LOCALE.t_fmt = '%T';

}
setLocale();

var date_param = new Object();
date_param.format = function(i) { i = '00' + i; return i.substring(i.length - 2); };
date_param['%'] = function () { return '%';};
date_param['t'] = function () { return '\t';};
date_param['n'] = function () { return '\n';};

// %H - Stunden, 00 bis 23
date_param.H = function (d){ return this.format( d.getHours() );};

// %k Stunden, 0 bis 23
date_param.k = function (d){ return d.getHours(); };

// %I - Stunden, 00 bis 12
date_param.I = function (d){ return this.format( d.getHours() % 12);};

// %l - Stunden, 1 bis 12
date_param.l = function (d){ return ( d.getHours() % 12) || 1;};

// %M - Minuten 00 bis 59
date_param.M = function (d){ return this.format( d.getMinutes());};

// %s - Sekunden seit dem 1.1.1970, 00:00:00 Uhr (Epoche)
date_param.s = function (d){ return d.getTime();};

// %S -Sekunden 00 bis 59
date_param.S = function (d){ return this.format( d.getSeconds());};

// %p - AM oder PM bzw. die lokale Bezeichnung für Vor- und Nachmittag
date_param.p = function (d){ return this.M(d) > 12 ? LOCALE.am_pm[0] : LOCALE.am_pm[1];};

// %r - die Zeit, 12 Stunden (hh:mm:ss AM/PM)
date_param.r = function (d){ return this.l(d) + ':' + this.M(d) + ':' + this.S(d) + LOCALE.t_fmt_ampm + this.p(d);};

// %R - die Zeit, hh:mm
date_param.R = function (d){ return this.H(d) + ':' + this.M(d);};

// %T - die Zeit, 24 Stunden (hh:mm:ss)
date_param.T = function (d){ return this.k(d) + ':' + this.M(d) + ':' + this.S(d)};

// %X - die Zeit, 24 Stunden (%H:%M:%S)
date_param.X = function (d){ return strftime(d, LOCALE.t_fmt);};

// %A - der ausgeschriebene Wochentag im lokalen Format
date_param.A = function (d){ return LOCALE.day[this.w(d)];};

// %a - der abgekürzte Wochentag im lokalen Format
date_param.a = function (d){ return LOCALE.abday[this.w(d)];};

// %B - der ausgeschriebene Monat im lokalen Format
date_param.B = function (d){ return LOCALE.mon[d.getMonth()];};

// %b - der abgekürzte Monat im lokalen Format
date_param.b = function (d){ return LOCALE.abmon[d.getMonth()];}

// %h - das gleiche wie %b
date_param.h = date_param.b;

// %c - das Datum und die Zeit im bevorzugten lokalen Format
date_param.c = function (d){ return strftime(d, LOCALE.d_t_fmt); };

// %C - das Jahrhundert
date_param.C = function (d){ return parseInt(getFullYear(d) / 100) * 100;}

// %d - der Tag im Monat, 01 bis 31
date_param.d = function (d){ return this.format( this.e(d));};

// %e - der Tag im Monat, 1 bis 31
date_param.e = function (d){ return d.getDate();};

// %D - das Datum (mm/dd/yy)
date_param.D = function (d) { return this.m(d) + '/' + this.d(d) + '/' + this.y(d);}

// %x - das Datum (mm/dd/yy)
date_param.x = function (d) { return strftime(d, LOCALE.d_fmt);}

// %m - der Monat 00 bis 12
date_param.m = function (d){return this.format(1 + d.getMonth()); };

// %j der Tag im Jahr
date_param.j = function (d) {
    var start = new Date(d);
    start.setMonth(0);
    start.setDate(1);

    var t = parseInt((d - start)/ (SEC_DAY * 1000));
    return t;
}

// %U - die Nummer der Woche, Sonntag erster Tag
date_param.U = function (d) { return parseInt(this.j(d) / 7); };

// %W - die Nummer der Woche, Montag erster Tag
date_param.W = function (d) { return parseInt(this.j(d) / 7); };

// %w - der Tag in der Woche 0 bis 6
date_param.w = function (d) { return d.getDay(); };

// %y - die letzten beiden Stellen der Jahreszahl
date_param.Y = function (d) { return getFullYear(d);}

// %Y - die ganze Jahreszahl
date_param.y = function (d) { return (getFullYear(d) + '').substring(2);}

// %Z - die Zeitzone; oder nichts, wenn keine Zeitzone feststellbar ist
date_param.Z = function (d) { return -d.getTimezoneOffset(d) / 60;}