// Title: Tigra Calendar
// URL: http://www.softcomplex.com/products/tigra_calendar/
// Version: 3.2 (European date format)
// Date: 10/14/2002 (mm/dd/yyyy)
// Feedback: feedback@softcomplex.com (specify product title in the subject)
// Note: Permission given to use this script in ANY kind of applications if
//    header lines are left unchanged.
// Note: Script consists of two files: calendar?.js and calendar.html
// About us: Our company provides offshore IT consulting services.
//    Contact us at sales@softcomplex.com if you have any programming task you
//    want to be handled by professionals. Our typical hourly rate is $20.

var calendars = new Array();
var RE_NUM = /^\-?\d+$/;

var cal_LANG = new Array(); // übersetzte und angepasste Konstanten


cal_LANG.cal_SetLANG_DE= function () {

  cal_LANG.NUM_CENTYEAR = 30;           // if two digit year input dates after this year considered 20 century.
  cal_LANG.BUL_TIMECOMPONENT = false;   // is time input control required by default
  cal_LANG.BUL_YEARSCROLL = true;       // are year scrolling buttons required by default
  cal_LANG.STR_ICONPATH = '/images/';   // path to the directory where calendar images are stored. trailing slash req.
  cal_LANG.stylesheet   = '/style/sheetdata.css';
  cal_LANG.htmlfile     = '/calendar2.htm';

  // months as they appear in the calendar's title
  cal_LANG.ARR_MONTHS = ["Januar", "Februar", "März", "April", "Mai", "Juni",
    "Juli", "August", "September", "Oktober", "November", "Dezember"];
  // week day titles as they appear on the calendar
  cal_LANG.ARR_WEEKDAYS = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
  // day week starts from (normally 0-Su or 1-Mo)
  cal_LANG.NUM_WEEKSTART = 1;
  cal_LANG.showWeek      ='W' // leer für 'keine Wochenausgabe', sonst Spaltenüberschrift

  cal_LANG.dateSep = '.';
  cal_LANG.timeSep = ':';
  cal_LANG.dateFmt0 = 'd'; // Ausgabereihenfolge des Datums, nur dir Zuordnung anpassen, nicht d/m/y "übersetzen"!
  cal_LANG.dateFmt1 = 'm';
  cal_LANG.dateFmt2 = 'y';
  
  cal_LANG.Holidays = new Array();
  cal_LANG.Easter = new Array();
    // feste Feiertage (Jahr=0)
  cal_LANG.addHoliday( 1 ,1,0, "Neujahr")
  cal_LANG.addHoliday( 6, 1,0, "Hl. 3 Könige/ Baden-Würtemberg, Bayern, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Sachsen*, Thüringen*, *Teile")
  cal_LANG.addHoliday( 1, 5,0, "Maifeiertag")
  cal_LANG.addHoliday(15, 8,0, "Marià Himmelfahrt/ Bayern*, Saarland, *Teile")
  cal_LANG.addHoliday( 3,10,0, "Tag der Einheit")
  cal_LANG.addHoliday(31,10,0, "Reformationstag/ Sachsen, Sachsen-Anhalt, Thüringen, Brandenburg, Mecklenburg-Vorpommern")
  cal_LANG.addHoliday( 1,11,0, "Allerheiligen/ Baden-Würtemberg, Bayern, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Thüringen*, *Teile")
  cal_LANG.addHoliday(25,12,0, "1.Weihnachtstag")
  cal_LANG.addHoliday(26,12,0, "2.Weihnachtstag")
  // bewegliche Feiertage, für jedes Jahr einen Block hinzufügen
  cal_LANG.addEasterHoliday(2000);
  cal_LANG.addEasterHoliday(2001);
  cal_LANG.addEasterHoliday(2002);
  cal_LANG.addEasterHoliday(2003);
  cal_LANG.addEasterHoliday(2004);
  cal_LANG.addEasterHoliday(2005);
  cal_LANG.addEasterHoliday(2006);
  cal_LANG.addEasterHoliday(2007);
  cal_LANG.addEasterHoliday(2008);
  cal_LANG.addEasterHoliday(2009);
  cal_LANG.addEasterHoliday(2010);
  /*cal_LANG.addHoliday( 3, 3,2004, "Rosenmontag")
  cal_LANG.addHoliday( 9, 4,2004, "Karfreitag")
  cal_LANG.addHoliday(12, 4,2004, "Ostermontag")
  cal_LANG.addHoliday(20, 5,2004, "Himmelfahrt")
  cal_LANG.addHoliday(30, 5,2004, "Pfingstfest")
  cal_LANG.addHoliday(31, 5,2004, "Pfingstmontag")
  cal_LANG.addHoliday(10, 6,2004, "Fronleichnam/ Baden-Würtemberg, Bayern, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Sachsen*, Thüringen*, *Teile")
  */
  cal_LANG.addHoliday(17,11,2004, "Buß- u. Bettag/ Sachsen")

  cal_LANG.errNoTarget       = 'Fehler beim Aufruf des Kalenders: kein Eingabeelement zugeordnet';
  cal_LANG.errInvalidTarget  = 'Fehler beim Aufruf des Kalenders: kein gültiges Eingabeelement zugeordnet';
  cal_LANG.invalFormat1 = 'Kein gültiges Format: "';
  cal_LANG.invalFormat2 = '".\nDatumsformat muss  dd.mm.jjjj  sein';
  cal_LANG.invalYear1   = 'Kein gültiges Jahr: "';
  cal_LANG.invalMonth1  = 'Kein gültiger Monat: "';
  cal_LANG.invalMonth2  = '".\nDer Monat muss zwischen 01-12 liegen.';
  cal_LANG.invalDay     = 'Kein gültiger Tag: "';
  cal_LANG.invalDay1    = 'Kein gültiger Tag in diesem Monat: "';
  cal_LANG.invalDay2    = '".\nDer Tag muss zwischen 01-';
  cal_LANG.invalDay3    = ' liegen.';
  cal_LANG.notANumber   = '" muss eine Zahl sein.';
  cal_LANG.invalHour1   = 'Keine gültige Stunde: "';
  cal_LANG.invalHour2   = '".\nStunde muss zwischen 00-23 liegen.';
  cal_LANG.invalMin1    = 'Keine gültigen Minute: "';
  cal_LANG.invalMin2    = '".\nMinute muss zwischen 00-59 liegen.';
  cal_LANG.invalSek1    = 'Keine gültige Sekunde: "';
  cal_LANG.invalSek2    = '".\nSekunde muss zwischen 00-59 liegen.';
  
  cal_LANG.lang      = 'DE';
  cal_LANG.title     = 'Suche Datum';
  cal_LANG.prevYear  = 'Jahr zur&uuml;ck';
  cal_LANG.prevMonth = 'Monat zur&uuml;ck';
  cal_LANG.nextMonth = 'Monat weiter';
  cal_LANG.nextYear  = 'Jahr weiter';
  cal_LANG.Time      = 'Uhrzeit: ';
  cal_LANG.imgAlt    = 'Klick hier zur Datumssuche';
}

cal_LANG.cal_SetLANG_ES= function () {

  cal_LANG.NUM_CENTYEAR = 30;           // if two digit year input dates after this year considered 20 century.
  cal_LANG.BUL_TIMECOMPONENT = false;   // is time input control required by default
  cal_LANG.BUL_YEARSCROLL = true;       // are year scrolling buttons required by default
  cal_LANG.STR_ICONPATH = '/images/';   // path to the directory where calendar images are stored. trailing slash req.
  cal_LANG.stylesheet   = '/style/sheetdata.css';
  cal_LANG.htmlfile     = '/calendar2.htm';

  // months as they appear in the calendar's title
  cal_LANG.ARR_MONTHS = ["Januar", "Februar", "März", "April", "Mai", "Juni",
    "Juli", "August", "September", "Oktober", "November", "Dezember"];
  // week day titles as they appear on the calendar
  cal_LANG.ARR_WEEKDAYS = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
  // day week starts from (normally 0-Su or 1-Mo)
  cal_LANG.NUM_WEEKSTART = 1;
  cal_LANG.showWeek      ='W' // leer für 'keine Wochenausgabe', sonst Spaltenüberschrift

  cal_LANG.dateSep = '.';
  cal_LANG.timeSep = ':';
  cal_LANG.dateFmt0 = 'd'; // Ausgabereihenfolge des Datums, nur dir Zuordnung anpassen, nicht d/m/y "übersetzen"!
  cal_LANG.dateFmt1 = 'm';
  cal_LANG.dateFmt2 = 'y';
  
  cal_LANG.Holidays = new Array();
  cal_LANG.Easter = new Array();
    // feste Feiertage (Jahr=0)
  cal_LANG.addHoliday( 1 ,1,0, "Neujahr")
  cal_LANG.addHoliday( 6, 1,0, "Hl. 3 Könige/ Baden-Würtemberg, Bayern, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Sachsen*, Thüringen*, *Teile")
  cal_LANG.addHoliday( 1, 5,0, "Maifeiertag")
  cal_LANG.addHoliday(15, 8,0, "Marià Himmelfahrt/ Bayern*, Saarland, *Teile")
  cal_LANG.addHoliday( 3,10,0, "Tag der Einheit")
  cal_LANG.addHoliday(31,10,0, "Reformationstag/ Sachsen, Sachsen-Anhalt, Thüringen, Brandenburg, Mecklenburg-Vorpommern")
  cal_LANG.addHoliday( 1,11,0, "Allerheiligen/ Baden-Würtemberg, Bayern, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Thüringen*, *Teile")
  cal_LANG.addHoliday(25,12,0, "1.Weihnachtstag")
  cal_LANG.addHoliday(26,12,0, "2.Weihnachtstag")
    // bewegliche Feiertage, für jedes Jahr einen Block hinzufügen
  cal_LANG.addEasterHoliday(2004)
  /*cal_LANG.addHoliday( 3, 3,2004, "Rosenmontag")
  cal_LANG.addHoliday( 9, 4,2004, "Karfreitag")
  cal_LANG.addHoliday(12, 4,2004, "Ostermontag")
  cal_LANG.addHoliday(20, 5,2004, "Himmelfahrt")
  cal_LANG.addHoliday(30, 5,2004, "Pfingstfest")
  cal_LANG.addHoliday(31, 5,2004, "Pfingstmontag")
  cal_LANG.addHoliday(10, 6,2004, "Fronleichnam/ Baden-Würtemberg, Bayern, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Sachsen*, Thüringen*, *Teile")
  */
  cal_LANG.addHoliday(17,11,2004, "Buß- u. Bettag/ Sachsen")

  cal_LANG.errNoTarget       = 'Fehler beim Aufruf des Kalenders: kein Eingabeelement zugeordnet';
  cal_LANG.errInvalidTarget  = 'Fehler beim Aufruf des Kalenders: kein gültiges Eingabeelement zugeordnet';
  cal_LANG.invalFormat1 = 'Kein gültiges Format: "';
  cal_LANG.invalFormat2 = '".\nDatumsformat muss  dd.mm.jjjj  sein';
  cal_LANG.invalYear1   = 'Kein gültiges Jahr: "';
  cal_LANG.invalMonth1  = 'Kein gültiger Monat: "';
  cal_LANG.invalMonth2  = '".\nDer Monat muss zwischen 01-12 liegen.';
  cal_LANG.invalDay     = 'Kein gültiger Tag: "';
  cal_LANG.invalDay1    = 'Kein gültiger Tag in diesem Monat: "';
  cal_LANG.invalDay2    = '".\nDer Tag muss zwischen 01-';
  cal_LANG.invalDay3    = ' liegen.';
  cal_LANG.notANumber   = '" muss eine Zahl sein.';
  cal_LANG.invalHour1   = 'Keine gültige Stunde: "';
  cal_LANG.invalHour2   = '".\nStunde muss zwischen 00-23 liegen.';
  cal_LANG.invalMin1    = 'Keine gültigen Minute: "';
  cal_LANG.invalMin2    = '".\nMinute muss zwischen 00-59 liegen.';
  cal_LANG.invalSek1    = 'Keine gültige Sekunde: "';
  cal_LANG.invalSek2    = '".\nSekunde muss zwischen 00-59 liegen.';
  
  cal_LANG.lang      = 'DE';
  cal_LANG.title     = 'Suche Datum';
  cal_LANG.prevYear  = 'Jahr zur&uuml;ck';
  cal_LANG.prevMonth = 'Monat zur&uuml;ck';
  cal_LANG.nextMonth = 'Monat weiter';
  cal_LANG.nextYear  = 'Jahr weiter';
  cal_LANG.Time      = 'Uhrzeit: ';
  cal_LANG.imgAlt    = 'Klick hier zur Datumssuche';
}

cal_LANG.cal_SetLANG_EN= function () {

  cal_LANG.NUM_CENTYEAR = 30;           // if two digit year input dates after this year considered 20 century.
  cal_LANG.BUL_TIMECOMPONENT = false;   // is time input control required by default
  cal_LANG.BUL_YEARSCROLL = true;       // are year scrolling buttons required by default
  cal_LANG.STR_ICONPATH = '/images/';   // path to the directory where calendar images are stored. trailing slash req.
  cal_LANG.stylesheet   = '/style/sheetdata.css';
  cal_LANG.htmlfile     = '/calendar2.htm';

  cal_LANG.ARR_MONTHS = ["January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"];
  // week day titles as they appear on the calendar
  cal_LANG.ARR_WEEKDAYS = ["So", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
  // day week starts from (normally 0-Su or 1-Mo)
  cal_LANG.NUM_WEEKSTART = 0;
  cal_LANG.showWeek      ='' // leer für 'keine Wochenausgabe', sonst Spaltenüberschrift

  cal_LANG.dateSep = '.';
  cal_LANG.timeSep = ':';
  cal_LANG.dateFmt0 = 'd'; // Ausgabereihenfolge des Datums, nur dir Zuordnung anpassen, nicht d/m/y "übersetzen"!
  cal_LANG.dateFmt1 = 'm';
  cal_LANG.dateFmt2 = 'y';

  cal_LANG.Holidays = []; // dt. Feiertage entfernen
  cal_LANG.Easter = new Array();

  cal_LANG.errNoTarget       = 'Fehler beim Aufruf des Kalenders: kein Eingabeelement zugeordnet';
  cal_LANG.errInvalidTarget  = 'Fehler beim Aufruf des Kalenders: kein gültiges Eingabeelement zugeordnet';
  cal_LANG.invalFormat1 = 'Kein gültiges Format: "';
  cal_LANG.invalFormat2 = '".\nDatumsformat muss  dd.mm.yyyy  sein';
  cal_LANG.invalYear1   = 'Kein gültiges Jahr: "';
  cal_LANG.invalMonth1  = 'Kein gültiger Monat: "';
  cal_LANG.invalMonth2  = '".\nDer Monat muss zwischen 01-12 liegen.';
  cal_LANG.invalDay     = 'Kein gültiger Tag: "';
  cal_LANG.invalDay1    = 'Kein gültiger Tag in diesem Monat: "';
  cal_LANG.invalDay2    = '".\nDer Tag muss zwischen 01-';
  cal_LANG.invalDay3    = ' liegen.';
  cal_LANG.notANumber   = '" muss eine Zahl sein.';
  cal_LANG.invalHour1   = 'Keine gültige Stunde: "';
  cal_LANG.invalHour2   = '".\nStunde muss zwischen 00-23 liegen.';
  cal_LANG.invalMin1    = 'Keine gültigen Minute: "';
  cal_LANG.invalMin2    = '".\nMinute muss zwischen 00-59 liegen.';
  cal_LANG.invalSek1    = 'Keine gültige Sekunde: "';
  cal_LANG.invalSek2    = '".\nSekunde muss zwischen 00-59 liegen.';
  
  cal_LANG.lang      = 'EN';
  cal_LANG.title     = 'Suche Datum';
  cal_LANG.prevYear  = 'Jahr zur&uuml;ck';
  cal_LANG.prevMonth = 'Monat zur&uuml;ck';
  cal_LANG.nextMonth = 'Monat weiter';
  cal_LANG.nextYear  = 'Jahr weiter';
  cal_LANG.Time      = 'Uhrzeit: ';
  cal_LANG.imgAlt    = 'Klick hier zur Datumssuche';
}

cal_LANG.cal_SetLANG_mais = function (){
  cal_LANG.attrMonth   = 'color="#386838"';
  cal_LANG.attrWeekTD  = 'bgcolor="#386838" align="center"';
  cal_LANG.attrWeek    = 'color="#ffffff"';
  cal_LANG.attrToday   = 'bgcolor="#FFB973"';
  cal_LANG.attrHoliday = 'bgcolor="#c8b594"';
  cal_LANG.attrWeekend = 'bgcolor="#89B489"';
  cal_LANG.attrWorkday = 'bgcolor="#E7F0DB"';
  cal_LANG.attrActualM = 'color="#000000"';
  cal_LANG.attrOtherM  = 'color="#606060"';
  cal_LANG.attrTimeTD  = 'bgcolor="#87CEFA"';
  cal_LANG.attrTime    = 'color="White" face="tahoma, verdana" size="2"';

  cal_LANG.attrWeekCap = 'style="color:#ffffff; background-color:#588858;font-size:70%"';
  cal_LANG.attrWeekNr  = 'style="color:#777777; background-color:#E7F0DB;font-size:70%"';
}

function cal_SetLANG(code) {
  if (typeof(code)=='array' || typeof(code)=='object') {
    for (var x in code) cal_SetLANG(code[x]);
    cal_LANG.lang = code;
  } else if (typeof(code)=='string') {
    var fct=cal_LANG['cal_SetLANG_'+code];
    if (fct && typeof(fct)=='function') fct(code);
  }
}

cal_LANG.calendar1 = function (obj_target) {
  // assigning methods
  this.gen_date = cal_LANG.cal_gen_date1;
  this.gen_time = cal_LANG.cal_gen_time1;
  this.gen_tsmp = cal_LANG.cal_gen_tsmp1;
  this.prs_date = cal_LANG.cal_prs_date1;
  this.prs_time = cal_LANG.cal_prs_time1;
  this.prs_tsmp = cal_LANG.cal_prs_tsmp1;
  this.popup    = cal_LANG.cal_popup1;
  this.getHolidayDesc = cal_LANG.getHolidayDesc;
  this.addHoliday = cal_LANG.addHoliday;
  this.addEasterHoliday = cal_LANG.addEasterHoliday;
  this.Holidays = new Array();

  this.cal_LANG = new Array();
  for(var x in cal_LANG) this.cal_LANG[x] = cal_LANG[x]; // aktuelle Sprachdef. ins Objekt kopieren

  // validate input parameters
  if (!obj_target && 0)
    return cal_LANG.cal_error(cal_LANG.errNoTarget);
  if (obj_target.value == null)
    return cal_LANG.cal_error(cal_LANG.errInvalidTarget);
  this.target = obj_target;
  this.time_comp = cal_LANG.BUL_TIMECOMPONENT;
  this.year_scroll = cal_LANG.BUL_YEARSCROLL;
  
  // register in global collections
  this.id = calendars.length;
  calendars[this.id] = this;

}

cal_LANG.cal_popup1 = function (str_datetime) {
  this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value);
  if (!this.dt_current) return;

  this.obj_calwindow = window.open(
    this.cal_LANG.htmlfile+'?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
    'Calendar', 'width=200,height='+(this.time_comp ? 215 : 190)+
    ',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes'
    //',status=yes,resizable=yes,location=1,menubar=1,toolbar=1,top=200,left=200,dependent=yes,alwaysRaised=yes'
  );
  this.obj_calwindow.opener = window;
  this.obj_calwindow.focus();
}

// timestamp generating function
cal_LANG.cal_gen_tsmp1 = function (dt_datetime) {
  return(this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));
}

// date generating function
cal_LANG.cal_gen_date1 = function (dt_datetime) {
  var d_array = new Array();
  d_array['d'] = (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate();
  d_array['m'] = (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1);
  d_array['y'] = dt_datetime.getFullYear();
  return  d_array[this.cal_LANG.dateFmt0] + this.cal_LANG.dateSep +
    d_array[this.cal_LANG.dateFmt1] + this.cal_LANG.dateSep +
    d_array[this.cal_LANG.dateFmt2]
}
// time generating function
cal_LANG.cal_gen_time1 = function (dt_datetime) {
  return (
    (  dt_datetime.getHours()   < 10 ? '0' : '') + dt_datetime.getHours()   + this.cal_LANG.timeSep
    + (dt_datetime.getMinutes() < 10 ? '0' : '') + dt_datetime.getMinutes() + this.cal_LANG.timeSep
    + (dt_datetime.getSeconds() < 10 ? '0' : '') + dt_datetime.getSeconds()
  );
}

// timestamp parsing function
cal_LANG.cal_prs_tsmp1 = function (str_datetime) {
  // if no parameter specified return current timestamp
  if (!str_datetime || str_datetime==String.fromCharCode(160) || str_datetime==" ") 
    return (new Date());

  // if positive integer treat as milliseconds from epoch
  if (RE_NUM.exec(str_datetime))
    return new Date(str_datetime);
    
  // else treat as date in string format
  
  var arr_datetime = str_datetime.split(' ');
  return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));
}

// date parsing function
cal_LANG.cal_prs_date1 = function (str_date) {

  var arr_date = str_date.split(this.cal_LANG.dateSep);

  if (arr_date.length != 3) return cal_LANG.cal_error (this.cal_LANG.invalFormat1 + str_date + this.cal_LANG.invalFormat2);
  if (!arr_date[0] || !arr_date[1] || !arr_date[2]) return cal_LANG.cal_error (this.cal_LANG.invalFormat1 + str_date + this.cal_LANG.invalFormat2);
  arr_date[this.cal_LANG.dateFmt0] = arr_date[0];
  arr_date[this.cal_LANG.dateFmt1] = arr_date[1];
  arr_date[this.cal_LANG.dateFmt2] = arr_date[2];
  
  if (!RE_NUM.exec(arr_date['d'])) return cal_LANG.cal_error (this.cal_LANG.invalDay    + arr_date['d'] + this.cal_LANG.notANumber);
  if (!RE_NUM.exec(arr_date['m'])) return cal_LANG.cal_error (this.cal_LANG.invalMonth1 + arr_date['m'] + this.cal_LANG.notANumber);
  if (!RE_NUM.exec(arr_date['y'])) return cal_LANG.cal_error (this.cal_LANG.invalYear1  + arr_date['y'] + this.cal_LANG.notANumber);
  
  var dt_date = new Date();
  dt_date.setDate(1);

  if (arr_date['m'] < 1 || arr_date['m'] > 12) return cal_LANG.cal_error (this.cal_LANG.invalMonth1 + arr_date['m'] + this.cal_LANG.invalMonth2);
  dt_date.setMonth(arr_date['m']-1);
   
  if (arr_date['y'] < 100) arr_date['y'] = Number(arr_date['y']) + (arr_date['y'] < this.cal_LANG.NUM_CENTYEAR ? 2000 : 1900);
  dt_date.setFullYear(arr_date['y']);

  var dt_numdays = new Date(arr_date['y'], arr_date['m'], 0);
  if (arr_date['d'] < 1 || arr_date['d'] > dt_numdays.getDate()) 
    return cal_LANG.cal_error (this.cal_LANG.invalDay1 + arr_date['d'] + this.cal_LANG.invalDay2 + dt_numdays.getDate() + this.cal_LANG.invalDay3);
  dt_date.setDate(arr_date['d']);

  return (dt_date)
}

// time parsing function
cal_LANG.cal_prs_time1 = function (str_time, dt_date) {

  if (!dt_date) return null;
  var arr_time = String(str_time ? str_time : '').split(this.cal_LANG.timeSep);

  if (!arr_time[0]) dt_date.setHours(0);
  else if (RE_NUM.exec(arr_time[0]) && arr_time[0] < 24) dt_date.setHours(arr_time[0]);
  else return cal_LANG.cal_error (this.cal_LANG.invalHour1 + arr_time[0] + this.cal_LANG.invalHour2);
  
  if (!arr_time[1]) dt_date.setMinutes(0);
  else if (RE_NUM.exec(arr_time[1]) && arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);
  else return cal_LANG.cal_error (this.cal_LANG.invalMin1 + arr_time[1] + this.cal_LANG.invalMin2);

  if (!arr_time[2]) dt_date.setSeconds(0);
  else if (RE_NUM.exec(arr_time[2]) && arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);
  else return cal_LANG.cal_error (this.cal_LANG.invalSek1 + arr_time[2] + this.cal_LANG.invalSek2);

  dt_date.setMilliseconds(0);
  return dt_date;
}


cal_LANG.Holidays = new Array();
cal_LANG.Easter = new Array();
cal_LANG.addHoliday = function (d, m, y, desc) {
  if (!this.Holidays[m*100+d]) this.Holidays[m*100+d]=new Array();
  this.Holidays[m*100+d][y]=desc;
}

cal_LANG.addEasterHoliday = function (y) { // bewegliche Feiertage hinzufügen
  // Gauss-Algorithmus,  von 1900 bis 2099 korrekt, sonst teilw. fehlerhaft
  if (!this.Easter) this.Easter=new Array();
  if (this.Easter[y]) return false;
  var a = y%19;
  var m = [24, 13, 2, 21, 10, 28, 18, 7, 26, 15, 4, 23, 12, 1, 20, 9, 27, 17, 6, 25] [a];
  var d=new Date(y, 2, 28+m);
  d.setDate(d.getDate()-d.getDay());
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Ostersonntag");
  d.setDate(d.getDate()-2);
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Karfreitag");
  d.setDate(d.getDate()+2+1);
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Ostermontag");
  d.setDate(d.getDate()-1+39);
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Himmelfahrt");
  d.setDate(d.getDate()-39+49);
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Pfingstfest");
  d.setDate(d.getDate()-49+50);
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Pfingstmontag");
  d.setDate(d.getDate()-50+60);
  this.addHoliday(d.getDate(), d.getMonth()+1, y, "Fronleichnam/ Baden-Würtemberg, Bayern, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Sachsen*, Thüringen*, *Teile");
  this.Easter[y]=1;
  return true;
/*
 Differenzen zu Ostersonntag:
    Aschermittwoch   -46
    Karfreitag        -2
    Ostermontag        1
    Himmelfahrt       39
    Pfingstmontag     50
    Frohnleichnam     60
*/
  cal_LANG.addHoliday( 3, 3,2004, "Rosenmontag")
  cal_LANG.addHoliday( 9, 4,2004, "Karfreitag")
  cal_LANG.addHoliday(12, 4,2004, "Ostermontag")
  cal_LANG.addHoliday(20, 5,2004, "Himmelfahrt")
  cal_LANG.addHoliday(30, 5,2004, "Pfingstfest")
  cal_LANG.addHoliday(31, 5,2004, "Pfingstmontag")
  cal_LANG.addHoliday(10, 6,2004, "Fronleichnam/ Baden-Würtemberg, Bayern, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Sachsen*, Thüringen*, *Teile")
}
  
cal_LANG.getHolidayDesc = function (dat) {
  var yy=this.cal_LANG.Holidays[(dat.getMonth()+1)*100+dat.getDate()];
  return yy && (yy[dat.getFullYear()] || yy[0]);
}

cal_LANG.cal_error = function (str_message) {
  alert (str_message);
  return null;
}

cal_SetLANG(['DE','mais']); // default-Initialisierung: Deutsch + mais-Farben

function cal_ShowCalendar(input_elem, Sprache) {
  if (!input_elem || input_elem.value===null) return false;
  var cal;
  if (!calendars.length) {
    if (Sprache) cal_SetLANG(Sprache);
    cal = new cal_LANG.calendar1(input_elem);
  } else {
    cal = calendars[0];
    cal.target = input_elem;
  }
  cal.popup();
  return false;
}

function cal_ShowCalendar_img(input_elem, gif, Sprache, return_as_string) {
  if (!input_elem || input_elem.value===null) return false;
  if (Sprache) cal_SetLANG(Sprache);
  if (!gif) gif = '<img src="'+cal_LANG.STR_ICONPATH+'cal.gif" width="16" height="16" border="0" style="margin-top:3px" alt="'+cal_LANG.imgAlt+'"/>';

  var cal= new cal_LANG.calendar1(input_elem);
  //cal.year_scroll = true;
  //cal.time_comp = false;
  var s_out="<a href=\"javascript:calendars["+cal.id+"].popup();\">"+gif+'</a>';
  if (return_as_string) return s_out;
  document.write(s_out);
  return cal;
}

