function getRealLeft(elemyup)
{
	xPos = elemyup.offsetLeft;
	tempEl = elemyup.offsetParent;
	while (tempEl != null) {
		xPos += tempEl.offsetLeft;
		tempEl = tempEl.offsetParent;
	}
	return xPos;
}

function getRealTop(el)
{
	yPos = el.offsetTop;
	tempEl = el.offsetParent;
	while (tempEl != null)
	{
		yPos += tempEl.offsetTop;
		tempEl = tempEl.offsetParent;
	}
	return yPos;
}

function changeSelDate(count, ho, master) {

 	var cDate = document.getElementById(ho + '_val').value;

  var ctg = 1*(cDate.substring(0,cDate.indexOf(".")));
  var cmt = 1*(cDate.substring((cDate.indexOf(".")+1),cDate.lastIndexOf(".")));
  var cjr = (cDate.substring((cDate.lastIndexOf(".")+1),cDate.length));
  if(ctg=="" || cmt=="" || cjr=="")
  {
  }
  else
  {
  	dho = master ? master : ho;
  	if(cjr.length==4){cjr = cjr.substring(2,4);};
    if(cjr.length==1){cjr = "0"+cjr;};
    var gDate = gregDate(1*count+1*(getDaysSince1980((1*("20"+cjr)),cmt,ctg)));
    var days = (1*count+1*(getDaysSince1980((1*("20"+cjr)),cmt,ctg)));
    setNewSelDate(dho, gDate, cDate, days);
    document.getElementById(dho + '_val').onchange();
  }
}

function setNewSelDate(ho, gDate, cDate, days)
{
   if(gDate[0]<10){gDate[0]="0"+gDate[0];}
   if(gDate[1]<10){gDate[1]="0"+gDate[1];}
   var nDate = gDate[0]+"."+gDate[1]+".20"+gDate[2];
   if(nDate.indexOf("NaN")!=-1) var nDate = cDate;
   document.getElementById(ho + '_val').value = nDate;
}

function Calendar2(oName, mStart, sEnd, oMaster)
{
    this.layer          = null;

    this.oName = oName;
    this.selectfield_image = document.getElementById(oName);
    this.selectfield_val   = document.getElementById(oName + '_val');
		this.selectfield_wday  = document.getElementById(oName + '_wday');

    this.start          = ( !mStart || mStart == 0 )    ? this.getDateString(0)   : this.getDateString(mStart);
    this.end            = ( !sEnd || sEnd == 0 )        ? this.getDateString(365) : this.getDateString(sEnd);

    this.lock           = 'false';
    this.currentMonth   = null;
    this.currentYear    = null;

    this.master         = (oMaster) ? oMaster : null;

    this.firstdayofweek = firstdayofweek;

    this.lang_monday = 'Montag';
    this.lang_tuesday = 'Dienstag';
    this.lang_wednesday = 'Mittwoch';
    this.lang_thursday = 'Donnerstag';
    this.lang_friday = 'Freitag';
    this.lang_saturday = 'Samstag';
    this.lang_sunday = 'Sonntag';

		this.wdayTexts = new Array(this.lang_sunday, this.lang_monday, this.lang_tuesday, this.lang_wednesday, this.lang_thursday, this.lang_friday, this.lang_saturday);

    this.lang_january = 'Januar';
    this.lang_february = 'Februar';
    this.lang_march = 'März';
    this.lang_april = 'April';
    this.lang_may = 'Mai';
    this.lang_june = 'Juni';
    this.lang_july = 'Juli';
    this.lang_august = 'August';
    this.lang_september = 'September';
    this.lang_october = 'Oktober';
    this.lang_november = 'November';
    this.lang_december = 'Dezember';

    this.init();
};

Calendar2.prototype.init = function()
{
	var oThis = this;

	var oDate           = new Date();
	if (this.master) oDate.setMonth(this.master.start.substr(4,2)-1);
	else oDate.setMonth(this.start.substr(4,2)-1);
	this.currentMonth   = oDate.getMonth();
	this.currentYear    = oDate.getFullYear();

	this.selectfield_val.onchange   = function()
	{
		if ( oThis.selectfield_val.value.length == 10 )
		{
			selDate = oThis.parseDate(oThis.selectfield_val.value);
			oThis.checkDate(selDate[0], selDate[1], selDate[2]);
			oThis.confirmDate();
			oThis.selDate = selDate[2].toString(4) + selDate[1].toString(2) + selDate[0].toString(2);
		}
		else
		{
			oThis.confirmDate();
		}
	};

	this.selectfield_val.onkeyup = function(e)
	{
			if ( oThis.selectfield_val.value.length < 10 && e.which != 8 )
			{
				oThis.fillHelp();
			}
			else if ( oThis.selectfield_val.value.length > 10 )
			{
				oThis.modify();
			}
			else if ( oThis.selectfield_val.value.length == 10 )
			{
				if ( oThis.oName == 'datum_start' )
				{
					//document.getElementById('datum_ende_val').focus();
				}
				else if ( oThis.oName == 'datum_ende' )
				{
					//document.getElementById('fq').focus();
				}
				//oThis.confirmDate();
			}
	}

	this.selectfield_image.onclick = function()
	{
		oThis.showCalendar();
	};

	this.selectfield_image.onmouseout = function()
	{
		if ( this.lock == 'false' )
		{
			oThis.hideCalendar();
		}
	}

	this.createCalendar();
};

Calendar2.prototype.modify = function() {
}

Calendar2.prototype.parseDate = function(date) {
	
	return new Array(date.substr(0, 2), date.substr(3, 2), date.substr(6, 4));
}
	

Calendar2.prototype.fillHelp = function() {

	var oThis = this;

	if ( oThis.selectfield_val.value.length == 2 )
	{
		oThis.selectfield_val.value = oThis.selectfield_val.value + '.';
	}
	else if ( oThis.selectfield_val.value.length == 5 )
	{
		oThis.selectfield_val.value = oThis.selectfield_val.value + '.20';
	}
	return true;
}

Calendar2.prototype.confirmDate = function() {

	var oThis = this;

	if ( oThis.selectfield_val.value.length == 7 )
	{
		oThis.selectfield_val.value = oThis.selectfield_val.value.substr(0, 6) + '20' + oThis.selectfield_val.value.substr(6, 2);
	}

	var day = oThis.selectfield_val.value.substr(0, 2);
	var month = oThis.selectfield_val.value.substr(3, 2);
	var year = oThis.selectfield_val.value.substr(6, 4);

	var selDate = new Date(year, month - 1, day);

  var weekday = selDate.getDay();

	var selwDay = this.getNameOfDay(weekday);

	oThis.selectfield_wday.innerHTML = selwDay ? selwDay.substr(0, 2) + ',' : '';

	return true;
}

Calendar2.prototype.createCalendar = function() {

    var oThis   = this;

    this.layer                  = document.createElement("div");
    this.layer.className        = "minicalendar";
    this.layer.style.visibility = "hidden";
    this.layer.innerHTML        = '<table border="0" cellpadding="0" cellspacing="0"><thead class="minicalendarNav"><tr><td colspan="7" class="top" style="padding-right: 5px;"><img src="http://public.bahn.ibs-live.de/icons/inaktiv/close.png" onclick="obj_cal_' + oThis.oName + '.hideCalendar();" onmouseout="this.src=\'http://public.bahn.ibs-live.de/icons/inaktiv/close.png\'" onmouseover="this.src=\'http://public.bahn.ibs-live.de/icons/aktiv/close.png\'" alt="Schließen" title="Schließen" /></td></tr><tr><td colspan="1">«</td><td colspan="5">-</td><td colspan="1">»</td></tr><tr><th>' + ( this.firstdayofweek == 1 ? this.lang_monday.substr(0,1) : this.lang_sunday.substr(0,1) ) + '</th><th>' + ( this.firstdayofweek == 1 ? this.lang_tuesday.substr(0,1) : this.lang_monday.substr(0,1) )  + '</th><th>' + ( this.firstdayofweek == 1 ? this.lang_wednesday.substr(0,1) : this.lang_tuesday.substr(0,1) ) + '</th><th>' + ( this.firstdayofweek == 1 ? this.lang_thursday.substr(0,1) : this.lang_wednesday.substr(0,1) ) + '</th><th>' + ( this.firstdayofweek == 1 ? this.lang_friday.substr(0,1) : this.lang_thursday.substr(0,1) ) + '</th><th>' + ( this.firstdayofweek == 1 ? this.lang_saturday.substr(0,1) : this.lang_friday.substr(0,1) ) + '</th><th>' + ( this.firstdayofweek == 1 ? this.lang_sunday.substr(0,1) : this.lang_saturday.substr(0,1) ) + '</th></tr></thead><tbody class="minicalendarContent"></tbody></table>';

    this.layer.onmouseover      = function() {
    }
    this.layer.onmouseout      = function() {
    }

    this.nav        = this.layer.getElementsByTagName('thead')[0].childNodes[1];
    this.content    = this.layer.getElementsByTagName('tbody')[0];

    this.nav.firstChild.style.cursor    = 'pointer';
    this.nav.firstChild.onclick         = function() { oThis.currentMonth--; oThis.showCalendar(); };
    this.nav.lastChild.style.cursor     = 'pointer';
    this.nav.lastChild.onclick          = function() { oThis.currentMonth++; oThis.showCalendar(); };

    document.getElementById('space_calendar').appendChild(this.layer);
		//body = document.getElementsByTagName('body').item(0);
		//space = document.getElementById('space_calendar');
		//space.insertBefore(this.layer, space.firstChild);

};

Calendar2.prototype.showCalendar = function() {

    var oThis = this;

		oThis.hideAllInstances();

		while(this.content.childNodes.length > 0)
		{
			this.content.removeChild(this.content.firstChild);
		}

    if (this.currentMonth == -1) {
        this.currentMonth = 11;
        this.currentYear--;
    } else if (this.currentMonth == 12) {
        this.currentMonth = 0;
        this.currentYear++;
    }

		var tmp_1 = parseInt(this.start.substr(0, 4));
		tmp_1 -= 20;
		var tmp_2 = parseInt(this.end.substr(0, 4));
		tmp_2 += 20;
		var limitStart = this.master && this.master.selDate ? this.master.selDate : tmp_1.toString(10).concat(this.start.substr(4, 4));
		var limitEnd = tmp_2.toString(10).concat(this.end.substr(4, 4));

    if (this.getDateStringByDate(1, this.currentMonth, this.currentYear) < limitStart) {
        this.currentMonth   = limitStart.substr(4, 2) - 1;
        this.currentYear    = limitStart.substr(0, 4);
    } else if (this.getDateStringByDate(1, this.currentMonth, this.currentYear) > limitEnd) {
        this.currentMonth   = limitEnd.substr(4, 2) - 1;
        this.currentYear    = limitEnd.substr(0, 4);
    }

    this.nav.childNodes[1].firstChild.data = this.getNameOfMonth(this.currentMonth) + ' ' + this.currentYear.toString().substr(2);

    var currentDateString = this.getDateStringSelects();

    var oDate = new Date();
    oDate.setYear(this.currentYear);
    oDate.setMonth(this.currentMonth);
    oDate.setDate(1);
    oDate.setHours(12);

    var newTr   = document.createElement('tr');
    var newTd   = document.createElement('td');
    newTd.appendChild(document.createTextNode(' '));

    var limiter = this.firstdayofweek == 1 ? oDate.getDay() - 1 : oDate.getDay;
    limiter = limiter < 0 ? 6 : limiter;

    for (var i=1; i<=limiter; i++) {
        newTr.appendChild(newTd.cloneNode(true));
    }

    for (var i=0; i<43; i++) {

        var newDate = newTd.cloneNode(true);

        if (oDate.getMonth() == this.currentMonth)
        {
            var dateString          = this.getDateStringByDate(oDate.getDate(), this.currentMonth, this.currentYear);
            dateString              = parseInt(dateString);

            newDate.firstChild.data = oDate.getDate();

						newDate.name            = 'date' + dateString;
            if (dateString <= limitStart)
            {
            	newDate.className = 'history';
            }
          	else if (dateString == currentDateString)
            {
            	newDate.className    = 'high';
	            newDate.style.cursor = 'pointer';
            }
            else
            {
	            newDate.style.cursor = 'pointer';
            	newDate.onmouseover  = function() { this.className = 'high'; };
              newDate.onmouseout   = function() { this.className = 'low'; };
            }
            if ( dateString > limitStart )
            {
	            newDate.onclick         = function() {
  	                oThis.selDate = this.name.substr(4, 4) + this.name.substr(8, 2) + this.name.substr(10, 2);
  	                oThis.updateSelects(this.name.substr(10, 2), this.name.substr(8, 2), this.name.substr(4, 4));
										oThis.confirmDate();
    	              oThis.lock = 'false';
      	            oThis.hideCalendar();
        	    }
        	  }
        }
        newTr.appendChild(newDate);
        if ( ( oDate.getDay() <= 0 && this.firstdayofweek == 1 ) || ( oDate.getDay() == 6 && this.firstdayofweek == 0 ) )
        {
					this.content.appendChild(newTr);
					newTr = document.createElement('tr');
					if (oDate.getMonth() != this.currentMonth) break;
        }
        oDate.setTime(oDate.getTime() + 24 * 3600 * 1000);

    }

    this.layer.style.left = getRealLeft(this.selectfield_image) + this.selectfield_image.offsetWidth + "px";
    this.layer.style.top = (getRealTop(this.selectfield_image)) + "px";
    //obj_gui.hideSelects(this.layer);
    this.layer.style.visibility = "visible";
		// DEBUG: document.getElementById('textareayup').value=this.layer.innerHTML;

};

Calendar2.prototype.parseUserDateInput = function(userInput)
{
   var weekdays = new Array(this.lang_sunday,this.lang_monday,this.lang_tuesday,this.lang_wednesday,this.lang_thursday,this.lang_friday,this.lang_saturday);
   wDay = weekdays.join("|");
   reg_exp = eval("/^ *("+wDay+")\, */");
   clearedUserInput = userInput.replace(reg_exp,"");
   userInput_day = (clearedUserInput.substring(0,clearedUserInput.indexOf(".")));
   userInput_month = (clearedUserInput.substring((clearedUserInput.indexOf(".")+1),clearedUserInput.lastIndexOf(".")));
   userInput_year = (clearedUserInput.substring((clearedUserInput.lastIndexOf(".")+1),clearedUserInput.length));
   userInput_day *= 1; userInput_month *= 1; userInput_year *= 1;
   // attention: userInput_month is 1-12-ranged!
   // ~~~
   if(userInput_month!="") {
     userInput_month -= 1;
     if(userInput_month<0) {
       userInput_month = 11;
     } else if(userInput_month>11) {
       userInput_month = 0;
     }
   }
   if(userInput_year!="") {
     if(userInput_year<100) {
       if(userInput_year<50){
          userInput_year+=2000;
        } else {
          userInput_year+=1900;
        }
     } else if (userInput_year < 1000) {
       if(userInput_year<200){
          userInput_year+=1900;
        } else {
          userInput_year+=1000;
        }
     }
   }
   return new Date(userInput_year, userInput_month, userInput_day);
}

Calendar2.prototype.hideAllInstances = function()
{
	if ( this.oName == 'datum_start' )
	{
		if ( typeof obj_cal_datum_ende == 'object' ) obj_cal_datum_ende.hideCalendar();
	}
	else if ( this.oName == 'datum_ende' )
	{
		if ( typeof obj_cal_datum_start == 'object' ) obj_cal_datum_start.hideCalendar();
	}
	
}

Calendar2.prototype.hideCalendar = function()
{
    if (this.lock == 'false') {
       // obj_gui.showSelects();
        this.layer.style.visibility = "hidden";
    }
};

Calendar2.prototype.checkDate = function(sDate_day, sDate_month, sDate_year) {

    var check       = new Date();

    var userInput_day   = sDate_day;
    userInput_day       = userInput_day.replace(/[^0-9-.]/gi,'');
    userInput_day       = userInput_day.replace(/-/gi,'.');

    var userInput_month   = sDate_month;
    userInput_month       = userInput_month.replace(/[^0-9-.]/gi,'');
    userInput_month       = userInput_month.replace(/-/gi,'.');

    var userInput_year   = sDate_year;
    userInput_year       = userInput_year.replace(/[^0-9-.]/gi,'');
    userInput_year       = userInput_year.replace(/-/gi,'.');

   
    var newDate     = Array(userInput_day, userInput_month, userInput_year);

    if (newDate.length == 3) {
        if (newDate[2].length == 2) newDate[2] = '20' + newDate[2];
        else if (newDate[2].length == 1) newDate[2] = '200' + newDate[2];
        else if (newDate[2].length == 0) newDate[2] = check.getFullYear();
        check.setFullYear(newDate[2]);
        check.setMonth(newDate[1]-1);
        check.setDate(newDate[0]);
    }

    var newWeekday  = check.getDay() + '';
    var newDay      = check.getDate() + '';
    var newMonth    = (check.getMonth() + 1) + '';
    var newYear     = check.getFullYear();

    if (newDay.length == 1)     newDay      = '0' + newDay;
    if (newMonth.length == 1)   newMonth    = '0' + newMonth;

    this.currentMonth   = newMonth - 1;
    this.currentYear    = newYear;

    //var ret = this.getNameOfDay(newWeekday) + ', ' + newDay + '.' + newMonth + '.' + newYear;
    return true;
    //var ret = Array(this.getNameOfDay(newWeekday), newDay, newMonth, newYear);
    //return ret;

};


Calendar2.prototype.getNameOfDay = function(iDay) {
    var weekdays = new Array(this.lang_sunday,this.lang_monday,this.lang_tuesday,this.lang_wednesday,this.lang_thursday,this.lang_friday,this.lang_saturday);
    return weekdays[iDay];
};

Calendar2.prototype.getNameOfMonth = function(iMonth) {
    var months = new Array(this.lang_january,this.lang_february,this.lang_march, this.lang_april, this.lang_may, this.lang_june, this.lang_july, this.lang_august, this.lang_september, this.lang_october, this.lang_november, this.lang_december);
    return months[iMonth];
};

Calendar2.prototype.getDateStringByDate = function(newDay, newMonth, newYear)
{
	var oDate = new Date();

	oDate.setFullYear(newYear);
	oDate.setMonth(newMonth);
	oDate.setDate(newDay);
	oDate.setHours(12);

	var formattedYear   = oDate.getFullYear();
	var formattedMonth  = oDate.getMonth() + 1;
	var formattedDay    = oDate.getDate();

	var formattedDate = '';
	formattedDate   += formattedYear;
	formattedDate	+= (formattedMonth.toString().length == 1) ? '0' + formattedMonth.toString() : formattedMonth.toString();
	formattedDate	+= (formattedDay.toString().length == 1) ? '0' + formattedDay.toString() : formattedDay.toString();

	return formattedDate.toString();

};

Calendar2.prototype.getDateString = function(sInput) {

    var checkInput   = sInput.toString();
    checkInput       = checkInput.replace(/[^0-9-.]/gi,'');
    checkInput       = checkInput.replace(/-/gi,'.');
    if (checkInput.length == 0) return '';
    checkInput       = checkInput.split('.');
    if (checkInput.length == 3) return this.getDateStringByDate(checkInput[0], checkInput[1]-1, checkInput[2]);

    var oDate = new Date();
    oDate.setHours(12);
    oDate.setTime(oDate.getTime() + (sInput * 24 * 3600 * 1000));

    var formattedYear   = oDate.getFullYear();
    var formattedMonth  = oDate.getMonth() + 1;
    var formattedDay    = oDate.getDate();

    var dateString = '';
    dateString  += formattedYear;
    dateString	+= (formattedMonth.toString().length == 1) ? '0' + formattedMonth.toString() : formattedMonth.toString();
    dateString	+= (formattedDay.toString().length == 1) ? '0' + formattedDay.toString() : formattedDay.toString();

    return dateString.toString();

};

Calendar2.prototype.getDateStringSelects = function() {

    return this.getDateStringByDate(this.selectfield_val.value.substr(0, 2), this.selectfield_val.value.substr(3, 2) - 1, this.selectfield_val.value.substr(6, 4));

};

Calendar2.prototype.updateSelects = function(uDay, uMonth, uYear) {

		oThis = this;

    oThis.selectfield_val.value = uDay + '.' + uMonth + '.' + uYear;
    return true;

};
