function chdate(valid, labelid, dayl){
  var val = document.getElementById(valid).value;
  var date = checkDate(val);
  if (date == null){
    if (labelid) document.getElementById(labelid).style.color = "red";
  } else {
    if (labelid) document.getElementById(labelid).style.color = "black";
    document.getElementById(valid).value = formatDate(date);
    if (dayl) document.getElementById(dayl).innerHTML = getDayofWeek(date);
  }
  return date;
}

function chint(valid, min, max){
  if (!min) min = 0;
  var val = parseInt(document.getElementById(valid).value,10);
  if (!val) val = min;
  if (val < min) val = min;
  if (max) {
    if (val > max) val = max;
  }
  document.getElementById(valid).value = val;
  return val;
}

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 getDayofWeek(datum){
    if (!datum) return "";
    return (new Array( 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'))[datum.getDay()]
}

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 settimestring(datum, uhrzeit){
  datum.setHours(uhrzeit.substr(0,2));
  datum.setMinutes(uhrzeit.substr(3,2));
  return datum;
}
function deltaDaysWithTime(date1, date2){
  var x = new Date();
  var milli = date2.getTime()-date1.getTime();
  milli = Math.floor(milli / (1000 * 60 * 60 * 24 ));
  return milli;
}
function deltaHours(date1, date2){
  var x = new Date();
  var milli = date2.getTime()-date1.getTime();
  x.setTime(milli-(60*60*1000));
  return x.getHours();
}
function deltaMinutes(date1, date2){
  var x = new Date();
  var milli = date2.getTime()-date1.getTime();
  x.setTime(milli-(60*60*1000));
  return x.getMinutes();
}
function addDateToDate(date1, date2){
  var x = new Date();
  var milli = date2.getTime()+date1.getTime();
  x.setTime(milli+(60*60*1000));
  return x;
}
function subDateFromDate(date1, date2){
  var x = new Date();
  var milli = date1.getTime()-date2.getTime();
  x.setTime(milli-(60*60*1000));
  return x;
}

function addDays(date1, days)
{
    if(!date1 || typeof date1.getMonth == 'undefined') return null;
    var check1 = new Date(getFullYear(date1), date1.getMonth(), date1.getDate()+days);
    return check1;
}
function makeDate(cDate){  // tt.mm.yyyymm:hh
  var x = checkDate(cDate.substr(0,10));
  x.setHours(cDate.substr(10,2));
  x.setMinutes(cDate.substr(13,2));
  return x; 
}
function weekOfMonth(d)
{
    if(!d) return null;
    var t = d.getDate();
    var w = 0;
    while(t>0) {t -=7;w++}
    return w;
}

function correctTimeById(targetid,l24allowed){
  try{
    var ele = document.getElementById(targetid);
    if ((ele) && (ele.value)){
      var dt_datetime = (checkTime(ele.value,true,l24allowed));
      if (dt_datetime){
        ele.value = dt_datetime;
      }
    }
  } catch(e){}
}

function correctTime(string){
  if ((string) && (string.indexOf(":")<0)){
    string = string.replace(/ /,'');
    var org = string;
    if (string.length==1){
      string = "0"+org.substr(0,1)+":00";
    }
    if (string.length==2){
      string = org.substr(0,2)+":00";
    }
    if (string.length==4){
      string = org.substr(0,2)+":"+org.substr(2,2);
    }
  }
  return string;
}

function correctDateById(targetid){
  try{
    var ele = document.getElementById(targetid);
    if ((ele) && (ele.value)){
      var dt_datetime = (checkDate(ele.value,true));
      if (dt_datetime){
        ele.value = formatDate(dt_datetime);
      }
    }
  } catch(e){}
}

function correctDate(string){
  if ((string) /*&& (string.indexOf(".")<0)*/){
    string = string.replace(/ /,'');
    var org = string;

    if (string.indexOf(".")>0){
      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(split[2]) || (split[2].length==0)) year = getFullYear();
      if(isNaN(year)) year = getFullYear();
      if (year < 100){
        if (year <= 10){
          year += 2000;
        } else {
          year += 1900;
        }
      }
      var x = "00"+day;
      string = x.substr(x.length-2,2);
      x = "00"+month;
      string += "."+x.substr(x.length-2,2);
      x = "0000"+year;
      string += "."+x.substr(x.length-4,4);
    }

    if (string.length==4){
      string = org.substr(0,2)+"."+org.substr(2,2)+"."+getFullYear();
    } else if (string.length==5){
      if (org.substr(2,1)==".") {
        string = org.substr(0,2)+"."+org.substr(3,2)+"."+getFullYear();
      }
    } else if (string.length==6){
      if ((org.substr(2,1)==".") && (org.substr(5,1)==".")) {
        string = org.substr(0,2)+"."+org.substr(3,2)+"."+getFullYear();
      } else {
        string = org.substr(0,2)+"."+org.substr(2,2)+"."+org.substr(4,2);
      }
    } else if (string.length==8){
      string = org.substr(0,2)+"."+org.substr(2,2)+"."+org.substr(4,4);
    }
  }
  return string;
}

function checkTime(string, lmeckern, l24allowed)
{
  try{
    if(!string) return null;
    string += '';

    string = string.replace(/[^0-9^\.]/g, '');
    string = correctTime(string);

    var split = string.split(":");
    var hour = parseInt(split[0], 10);
    var min  = parseInt(split[1] || 0, 10);
    if (l24allowed == true){
      if (((hour >= 0) && (hour <= 23) && (min>=0) && (min<=59)) || ((hour==24) && (min==0))){
        return string;
      } else {
        if (lmeckern){
          window.alert('Sie haben eine ungültige Uhrzeit eingegeben. Bitte überprüfen Sie Ihre Eingabe.');
        }
      }
    } else {
      if ((hour >= 0) && (hour <= 23) && (min>=0) && (min<=59)){
        return string;
      } else {
        if (lmeckern){
          window.alert('Sie haben eine ungültige Uhrzeit eingegeben. Bitte überprüfen Sie Ihre Eingabe.');
        }
      }
    }  
  }catch(e){
    return null;
  }
}



///////////////////////////////////////////////////////////
// checkDate(string)
// string => TT.MM.YYYY
// auf ein gültiges Datum überprüfen
// gibt ein Datum Objekt zurück
function checkDate(string, lmeckern)
{
  try{
    if(!string) return null;
    string += '';
    string = string.replace(/[^0-9^\.]/g, '');
    string = correctDate(string);

    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();
    if (year < 100){
      if (year <= 10){
        year += 2000;
      } else {
        year += 1900;
      }
    }
    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;
    if (lmeckern){
      window.alert('Sie haben ein ungültiges Datum eingegeben. Bitte überprüfen Sie Ihre Eingabe.');
    }
    return null;
  }catch(e){
    return null;
  }
}

function formatDate(datum, uhrzeit)
{
    if(!datum) datum = new Date();
    var y = getFullYear(datum);
    var m = datum.getMonth();m++;
    m = m < 10 ? '0'.concat(m) : m;
    var d = datum.getDate();
    d = d < 10 ? '0'.concat(d) : d;

    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 (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', 'september', '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';

    LOCALE.std_d_t_fmt = "%d.%m.%Y %H:%M";
}
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.d(d) + '.' + this.m(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 dx = new Date(d);
    dx.setDate(dx.getDate()+6);
    var start = new Date(dx);
    start.setMonth(0);
    start.setDate(1);
    var t = parseInt((Date.UTC(dx.getFullYear(),dx.getMonth(),dx.getDate()) - Date.UTC(start.getFullYear(),start.getMonth(),start.getDate()))/ (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;}


function selectendOfMonth(month) {
  var jetzt = new Date();
  var jahr = jetzt.getYear();
  if (jahr < 999) jahr+=1900;
  switch (month) {
    case "1":
      return "31." + month + "." + jahr;
      break;
    case "2":
      return "28." + month + "." + jahr;
      break;
    case "3":
      return "31." + month + "." + jahr;
      break;
    case "4":
      return "30." + month + "." + jahr;
      break;
    case "5":
      return "31." + month + "." + jahr;
      break;
    case "6":
      return "30." + month + "." + jahr;
      break;
    case "7":
      return "31." + month + "." + jahr;
      break;
    case "8":
      return "31." + month + "." + jahr;
      break;
    case "9":
      return "30." + month + "." + jahr;
      break;
    case "10":
      return "31." + month + "." + jahr;
      break;
    case "11":
      return "30." + month + "." + jahr;
      break;
    case "12":
      return "31." + month + "." + jahr;
      break;
    case "13":
      return "31.03." + jahr;
      break;
    case "14":
    case "17":
      return "30.06." + jahr;
      break;
    case "15":
      return "30.09." + jahr;
      break;
    case "16":
    case "18":
    case "19":
      return "31.12." + jahr;
      break;
    case "20":
      return jetzt;
      break;
    case "21":
      if (month == 21) jahr--;
      return "31.12." + jahr;
      break;
  }
}

function selectbeginOfMonth(month) {
  var jetzt = new Date();
  var jahr = jetzt.getYear();
  if (jahr < 999) jahr+=1900;
  switch (month) {
    case "1":
    case "2":
    case "3":
    case "4":
    case "5":
    case "6":
    case "7":
    case "8":
    case "9":
    case "10":
    case "11":
    case "12":
      return "01." + month + "." + jahr;
      break;
    case "13":
    case "17":
      return "01.01." + jahr;
      break;
    case "14":
      return "01.04." + jahr;
      break;
    case "15":
    case "18":
      return "01.07." + jahr;
      break;
    case "16":
      return "01.10." + jahr;
      break;
    case "19":
      return "01.01." + jahr;
      break;
    case "20":
      return jetzt;
      break;
    case "21":
      if (month == 21) jahr--;
      return "01.01." + jahr;
      break;
  }
  return "...";
}

function selectdate(aFeld) {
  var cbox = document.getElementById("sel" + aFeld);
  var evon = document.getElementById("von" + aFeld);
  var ebis = document.getElementById("bis" + aFeld);
  var bom = "";
  var eom = "";
  if ((cbox != null) && (cbox.value != null) && (cbox.value != "")) {
    bom = selectbeginOfMonth(cbox.value);
    eom = selectendOfMonth(cbox.value);
    if (evon != null)
      evon.value = bom;
    if (ebis != null)
      ebis = eom;
  } else {
    if (evon != null)
      evon.value = "";
    if (ebis != null)
      ebis = "";
  }
}
