/********************************************************************************************
* BlueShoes Framework; This file is part of the php application framework.
* NOTE: This code is stripped (obfuscated). To get the clean documented code goto 
*       www.blueshoes.org and register for the free open source *DEVELOPER* version or 
*       buy the commercial version.
*       
*       In case you've already got the developer version, then this is one of the few 
*       packages/classes that is only available to *PAYING* customers.
*       To get it go to www.blueshoes.org and buy a commercial version.
* 
* @copyright www.blueshoes.org
* @author    sam blum <sam-at-blueshoes-dot-org>
* @author    Andrej Arn <andrej-at-blueshoes-dot-org>
*/
if (!Bs_Objects) {var Bs_Objects = [];};

function bs_dp_inputFieldBlur() {
event.srcElement.bsObj.updateByInputFieldBlur();
}

function bs_dp_inputFieldChange() {
event.srcElement.bsObj.updateByInputFieldChange();
}

function bs_dp_inputFieldWheel() {
 return event.srcElement.bsObj.updateByMouseWheel();
}

function Bs_DatePicker(fieldName) {
 this._objectId;
 this.fieldName = fieldName;this.jsBaseDir = '/_bsJavascript/';
 // this.imgDir = '/_bsJavascript/components/datepicker/img/win2k/';
 this.imgDir = 'http://www.hoteldaten.com/koop-apis/wdba/cal3/images/buttons/';
 this.datefieldwidth = 100;
 this.openByInit = false;
 this.autoClose  = true;
 this.txtHideCalendar = 'Hide Calendar';
 this.txtShowCalendar = 'Show Calendar';
 this.validateErrorMsg = "Not a valid date: '__VALUE__'. Try again or use the date picker. Valid formats are:\nAmerican mm/dd/yyyy (eg 12/31/2003)\nEuropean dd.mm.yyyy (eg 31.12.2003)\nISO yyyy-mm-dd (eg 2003-12-31)";
 this.validateErrorMsgEn;
 this.rangeErrorMsg = "Not a valid date: '__VALUE__'. It is not in the allowed range.";
 this._language = 'en';
 this.monthLong = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
 this.monthLongEn;
 this.monthNumChars = 0;
 this.days = new Array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
 this.daysEn;this.daysNumChars = 2;
 this.useYearField = 3;
 this.useMonthField = 2;
 this.useSpinEditForYear = (typeof(Bs_NumberField) != 'undefined');
 this.useArrows = false;
 this.useButtonToday = false;
 //this.dayHeaderFontColor = '#D4D0C8';
 //this.dayHeaderBgColor   = '#808080';
 this.dayFontColor       = 'black';
 this.dayBgColor         = 'white';
 
 this.dayFontColorActive = 'white';
 this.dayBgColorActive   = '#0A246A';
 this.dayTableBgColor    = 'white';
 
 this.dayBgColorOver     = '#FFFFE1';
 this.dayTableAttributeString = 'width="100%" border="0" cellspacing="0" cellpadding="3"';
 this.width = 150;
 this.internalDateFormat = 'iso';
 this.displayDateFormat = 'iso';
 this.dateFormat = 'iso';
 this.withTime = false;
 this.timeFormat = 'H:i:s';
 this.positionAbsolute = false;
 this.dayClassNameByDay = new Array();
 this.dateRangeLower = '1800-01-01';
 this.dateRangeUpper = '2100-12-31';
 this.allowedWeekdays = new Array(true, true, true, true, true, true, true);
 this._currentDate  = '';
 this._currentTime  = '00:00:00';
 this._currentYear  = 0;
 this._currentMonth = 0;
 this._currentDay   = 0;
 this.toggleButton;
 this._lastCursorPos = 0;
 this._wheelTimeout;
 this.dateToday = new Date();
 this.dateTomorrow = new Date();
 
                // Wir berechnen die Zeit für morgen, damit das im Inputfeld für Abreise angezeigt werden kann
                var jetztZeit = this.dateTomorrow.getTime();	//<<Datum in ms umwandeln
                var morgen = jetztZeit + (1000*60*60*24);       //<<1 Tag zurechnen in ms
                this.dateTomorrow.setTime(morgen);		//<<Neue Zeit setzen
                var Jahr = this.dateTomorrow.getYear();		//<<Neues Jahr auslesen
                var Monat = this.dateTomorrow.getMonth()+1;	//<<Neuen Monat auslesen + Korrektur
                var Tag = this.dateTomorrow.getDate();     
 
 this.holidays = new Array(
	new Array(null, 1, 1),
	new Array(null, 12, 31)
 );
 this._constructor = function() {
	this._id = Bs_Objects.length;
	Bs_Objects[this._id] = this;
	this._objectId = "Bs_DatePicker_"+this._id;
	var btnName = this._objectId + '_tglBtn';
	this.toggleButton = new Bs_Button(btnName);
	eval(btnName + ' = this.toggleButton;');this.toggleButton.group = 'toggleButton';this.toggleButton.imgName = 'bs_calendar';
	this.toggleButton.cssClassDefault = 'bsBtnMouseOver';
	this.toggleButton.attachEvent('Bs_Objects['+this._id+'].toggleSelector();', 'on');
	this.toggleButton.attachEvent('Bs_Objects['+this._id+'].toggleSelector();', 'off');
	}
	
this.setLanguage = function(language) {
if (typeof(Bs_DatePicker_Lang) == 'undefined') return false;
if (typeof(Bs_DatePicker_Lang[language]) == 'undefined') return false;
this._language = language;
this.monthLong = Bs_DatePicker_Lang[language]['months'];
this.days = Bs_DatePicker_Lang[language]['days'];
this.validateErrorMsg = Bs_DatePicker_Lang[language]['errorValidate'];
this.rangeErrorMsg = Bs_DatePicker_Lang[language]['errorRange'];
this.txtHideCalendar = Bs_DatePicker_Lang[language]['hideCalendar'];
this.txtShowCalendar  = Bs_DatePicker_Lang[language]['showCalendar'];
return true;}
this.setDisabled = function(bool) {
	try {
	if (typeof(bool) == 'undefined') {
	bool = !document.getElementById(this.fieldName).disabled;}
	if (bool) {
	this.toggleButton.setStatus(0);document.getElementById(this.fieldName).disabled = true;} else {
	this.toggleButton.setStatus(1);document.getElementById(this.fieldName).disabled = false;}
	} catch (e) {
	}
}

this.resetDate = function() {
	this._currentYear  = 0;
	this._currentMonth = 0;
	this._currentDay   = 0;
	this.updateCurrentDate();
}

this.setDateByChunks = function(year, month, day, reRender) {
	if (typeof(reRender) == 'undefined') reRender = true;
	year = this.fixYear(year);
	var newDate = this.dateToIsoDate(year + '-' + month + '-' + day);
	if (newDate == false) return false;
	if (!this.isDateSelectable(year, month, day)) return false;
	this._currentYear  = year;
	this._currentMonth = month;
	this._currentDay   = day;
	this.updateCurrentDate();
	this.updateInputField();
	if (reRender) this._reRenderDatePicker();
	return true;
}

this.setDateByJunks = function(year, month, day) {
	return this.setDateByChunks(year, month, day);
}

this.setDateByIso = function(isoDate, reRender) {
	if ("" == isoDate) {
		this.resetDate();
	} 
	else {
		var newDate = this.dateToIsoDate(isoDate);
		if (newDate == false) return false;
		var year  = parseInt(newDate.substr(0, 4), 10);
		var month = parseInt(newDate.substr(5, 2), 10);
		var day   = parseInt(newDate.substr(8, 2), 10);
		if (!this.isDateSelectable(year, month, day)) return false;
		this._currentYear  = year;
		this._currentMonth = month;
		this._currentDay   = day;
		this.updateCurrentDate();
		if (newDate.length > 14) {
			var hour   = parseInt(newDate.substr(11, 2), 10);
			var minute = parseInt(newDate.substr(14, 2), 10);
			var second = parseInt(newDate.substr(17, 2), 10);
			if (hour   < 10) hour   += '0';
			if (minute < 10) minute += '0';
			if (second < 10) second += '0';
			this._currentTime = hour + ':' + minute + ':' + second;
		}
	}
	
	this.updateInputField();
	if (reRender) this._reRenderDatePicker();
	return true;
}

this.setDateByObject = function(dateObject, reRender) {
	return this.setDateByChunks(dateObject.getYear(), dateObject.getMonth()+1, dateObject.getDate(), reRender);
}

this.getDate = function() {
	if (this._currentYear == 0) return false;switch (this.dateFormat) {
		case 'eu':
		return this._currentDay   + '.' + this._currentMonth + '.' + this._currentYear;case 'us':
		return this._currentMonth + '/' + this._currentDay   + '/' + this._currentYear;case 'iso':
		default:
		return this._currentYear  + '-' + this._currentMonth + '-' + this._currentDay;
	}
}

this.getDateAsIso = function() {
	if (this._currentYear == 0) return false;
	return this._currentYear + '-' + this._currentMonth + '-' + this._currentDay;
}

this.setTime = function(time) {
	switch (time.length) {
	case 0:
	time = '00:00:00';case 2:
	time += ':00:00';case 5:
	time += ':00';}
	this._currentTime = time;
	this.updateInputField();
	return true;
}

this.seedInternalWithCurrentDate = function() {
	var dateNow = new Date();
	this._currentYear  = this.fixYear(dateNow.getYear());
	this._currentMonth = dateNow.getMonth() +1;
	this._currentDay   = dateNow.getDate();
	this.updateCurrentDate();
}

this.fixYear = function(year) {
	if (year < 100) {
		year = parseInt('19' + year, 10);
	} 
	else if ((year >= 100) && (year < 110)) {
		year = parseInt(200 + '' + year.toString().substr(2, 1), 10);
	}
	return year;
}

this.drawInto = function(tagId) {
	var tag = document.getElementById(tagId);
	if ((tag == null) || !tag) return false;
	if (this.asPopup) {
		this.toggleButton.detachEvents('on');this.toggleButton.detachEvents('off');this.toggleButton.attachEvent('Bs_Objects['+this._id+'].openPopup();', 'on');
	} 
	else {}
	tag.innerHTML = this.render();this._convertYearToSpinEdit();return true;
}


this._calculateFieldMaxlength = function() {
	if (this.withTime) {
			switch (this.timeFormat) {
			case 'H:i':
			return 16;break;default:
			return 19;
		}
	} 
	else {
		return 10;
	}
}
this.convertField = function(fieldId) {
	var origFld = document.getElementById(fieldId);
	if ((origFld == null) || !origFld) return false;
	origFld.maxLength = this._calculateFieldMaxlength();
	if (bs_isEmpty(origFld['name'])) origFld['name'] = fieldId;
	this.fieldName = origFld['name'];
	var htmlCode = this.render(origFld.outerHTML);try {
		origFld.outerHTML = htmlCode;
		origFld = document.getElementById(fieldId);
		this._convertYearToSpinEdit();
		origFld.bsObj = this;
		origFld.attachEvent('onblur',       bs_dp_inputFieldBlur);
		origFld.attachEvent('onkeyup',      bs_dp_inputFieldChange);
		origFld.attachEvent('onmousewheel', bs_dp_inputFieldWheel);
	} catch (e) {}
	if ((origFld.value == '0000-00-00') || (origFld.value == '0000-00-00 00:00:00') || (origFld.value == '0000-00-00 00:00')) {
		origFld.value = '';
	}
	return true;
}

this.render = function(inputField) {
	if (typeof(this.monthLongEn)        != 'undefined') this.monthLong        = this.monthLongEn;
	if (typeof(this.daysEn)             != 'undefined') this.days             = this.daysEn;
	if (typeof(this.validateErrorMsgEn) != 'undefined') this.validateErrorMsg = this.validateErrorMsgEn;
	
	// Hier setzen wir das Input-Feld in eine Tabelle
	var ret = new Array();ret[ret.length] = '<table border="0" cellspacing="0" cellpadding="0"><tr><td valign="top">';
	if (inputField == true) {
	} 
	else if (typeof(inputField) == 'string') {
		ret[ret.length] = inputField;
	} 
	// Hier wird das Input-Feld abgebildet
	else { 'undefined'
		ret[ret.length] = '<input';
		ret[ret.length] = ' type="text"';
		ret[ret.length] = ' name="'    + this.fieldName + '"';
		ret[ret.length] = ' id="'      + this.fieldName + '"';
		ret[ret.length] = ' onblur="Bs_Objects['+this._id+'].updateByInputFieldBlur();"';
		ret[ret.length] = ' onkeyup="Bs_Objects['+this._id+'].updateByInputFieldChange();"';
		ret[ret.length] = ' onmousewheel="Bs_Objects['+this._id+'].updateByMouseWheel(); return false;"';
		ret[ret.length] = ' size="10"';
		ret[ret.length] = ' maxlength="' + this._calculateFieldMaxlength() + '"';
		
		if (this.datefieldwidth) var cssWidth = this.datefieldwidth;
		else { var cssWidth = this.width -22; }
		
		//if (this.withTime) {
		//	if (cssWidth < 140) cssWidth = 140;
		//}
		
		//ret[ret.length] = ' style="width:' + cssWidth + 'px;"';
		ret[ret.length] = ' class="BsDp_date"';
		ret[ret.length] = ' title="' + this.getCurrentDateReadable() + '"';
		ret[ret.length] = ' value="' + this.getCurrentDateFormatted() + '">';
	}
	
	ret[ret.length] = '</td><td valign="top">';
	this.toggleButton.title = (this.openByInit) ? this.txtHideCalendar : this.txtShowCalendar;if (this.openByInit) this.toggleButton.setStatus(2);
	var btnHtml = this.toggleButton.render();
	ret[ret.length] = btnHtml;
	ret[ret.length] = '</td></tr></table>';
	
	if (!this.asPopup) {
		ret[ret.length] = '<div id="' + this._objectId + '_div"';
		ret[ret.length] = ' style="width:' + this.width + 'px;';
		if (!this.openByInit) {
			ret[ret.length] = ' display:none;';
		}
		if (this.positionAbsolute) {
			ret[ret.length] = ' position:absolute;';
		}
		ret[ret.length] = '"';
		ret[ret.length] = ' class="BsDp_div"';
		ret[ret.length] = '>';
		ret[ret.length] = this.renderDatePicker();ret[ret.length] = '</div>';
	}
	
	return ret.join('');
}

this.renderDatePicker = function() {
	var ret = new Array();
	if (this._currentDate.length == 0) {
		this.seedInternalWithCurrentDate();
	}
	
	ret[ret.length] = '<div class="BsDp_monthYearDiv">';
	ret[ret.length] = '<table border="0" width="100%" cellpadding="0" cellspacing="0" align="center"><tr>';
	
	if (this.useArrows) {
		ret[ret.length] = '<td align="center" onclick="Bs_Objects['+this._id+'].dateCalc(0, -1);" style="cursor:hand;cursor:pointer;" class="BsDp_arrowLeft">';
		ret[ret.length] = '&nbsp;';
		ret[ret.length] = '<img src="' + this.imgDir + 'arrowLeft.gif' + '" align="middle" border="0"/>';
		ret[ret.length] = '&nbsp;';ret[ret.length] = '</span>';
		ret[ret.length] = '</td><td align="center">';
	} 
	else {
		ret[ret.length] = '<td align="center">';
	}
	
	if (this.useMonthField == 1) {
		ret[ret.length] = '<span class="BsDp_monthText">' + this.monthLong[this._currentMonth -1] + '</span>';
	} 
	else if (this.useMonthField == 2) {
		ret[ret.length] = '<select name="' + this.fieldName + '_month"';
		ret[ret.length] = ' id="' + this._objectId + '_month" size="1"';
		ret[ret.length] = ' onChange="Bs_Objects['+this._id+'].updateByMonth();"';
		ret[ret.length] = ' class="BsDp_month"';
		ret[ret.length] = '>';
			var i = 1;for (var m=0; m<this.monthLong.length; m++) {
				ret[ret.length] = '<option value="' + i + '"';
					if (this._currentMonth == i) ret[ret.length] = ' selected';ret[ret.length] = '>';if (this.monthNumChars > 0) {
						ret[ret.length] = this.monthLong[m].substr(0, this.monthNumChars);
					} else 
					{
						ret[ret.length] = this.monthLong[m];
					}
				ret[ret.length] = '</option>';i++;
			}
		ret[ret.length] = '</select>';
	}
	
	ret[ret.length] = '</td>';
	
	if (moz && this._useSpinEditForYear()) {
		ret[ret.length] = '<td align="left">';
	} 
	else {
		ret[ret.length] = '<td align="center">';
	}
	if (this.useYearField == 1) {
		ret[ret.length] = '<span class="BsDp_yearText">' + this._currentYear + '</span>';
	} 
	else if (this.useYearField >= 2) {
		ret[ret.length] = '<input type="text" name="' + this.fieldName + '_year"';
		ret[ret.length] = ' id="' + this._objectId + '_year" value="' + this._currentYear + '"';
		ret[ret.length] = ' size="4" maxlength="4" onKeyUp="Bs_Objects['+this._id+'].updateByYearChange();"';
		ret[ret.length] = ' onBlur="Bs_Objects['+this._id+'].updateByYearBlur();"';
		ret[ret.length] = ' class="BsDp_year"';
		ret[ret.length] = '>';
		if (this._useSpinEditForYear()) {
			ret[ret.length] = '&nbsp;&nbsp;&nbsp;';
		}
	}
	
	if (this.useArrows) {
		ret[ret.length] = '</td><td align="center" onclick="Bs_Objects['+this._id+'].dateCalc(0, 1);" style="cursor:hand;cursor:pointer;" class="BsDp_arrowRight">';
		ret[ret.length] = '&nbsp;';
		ret[ret.length] = '<img src="' + this.imgDir + 'arrowRight.gif' + '" align="middle" border="0"/>';
		ret[ret.length] = '&nbsp;';
	}
	
	ret[ret.length] = '</td>';
	ret[ret.length] = '</tr></table>';
	ret[ret.length] = '</div>';
	ret[ret.length] = '<div id="' + this._objectId + '_dayDiv" class="BsDp_dayTableDiv">';
	ret[ret.length] = this.renderDayTable(this._currentYear, this._currentMonth, this._currentDay);
	ret[ret.length] = '</div>';
	
	if (this.useButtonToday) {
		ret[ret.length] = '<div class="BsDp_buttonsDiv">';
		ret[ret.length] = '<img src="' + this.imgDir + 'en_btnToday.gif' + '" align="middle" border="0"';
		ret[ret.length] = ' onclick="Bs_Objects['+this._id+'].setDateByObject(Bs_Objects['+this._id+'].dateToday);"';
		ret[ret.length] = ' style="cursor:hand; cursor:pointer;"';
		ret[ret.length] = '/>';
		ret[ret.length] = '</div>';
	}

	return ret.join('');
}

this._reRenderDatePicker = function() {
	var div = document.getElementById(this._objectId + '_div');
	if ((div == null) || !div) return;
	div.innerHTML = this.renderDatePicker();
	this._convertYearToSpinEdit();
}

this.renderDayTable = function(currentYear, currentMonth, currentDay) {
	var day            = 1;
	var lastDayOfMonth = this.getNumberOfDays(currentYear, currentMonth);
	var ret            = new Array();
	ret[ret.length] = '<table ' + this.dayTableAttributeString;ret[ret.length] = ' bgcolor="' + this.dayTableBgColor + '"';
	ret[ret.length] = ' class="BsDp_dayTable"';
	ret[ret.length] = '>';
	if (currentYear >= 1970) {
		ret[ret.length] = '<tr bgcolor="' + this.dayHeaderBgColor + '">';
			for (var d=0; d<this.days.length; d++) {
				ret[ret.length] = '<td width="14%" bgcolor="' + this.dayHeaderBgColor + '" align="right"';
				ret[ret.length] = ' title="' + this.days[d] + '"';
				ret[ret.length] = ' class="BsDp_dayHeader"';
				if (this.dayHeaderFontColor == "") { ret[ret.length] = ' style="cursor:default;">'; }
				else { ret[ret.length] = ' style="color:' + this.dayHeaderFontColor + '; cursor:default;">'; }
					if (this.daysNumChars > 0) {
						ret[ret.length] = this.days[d].substr(0, this.daysNumChars);
					} 
					else {
						ret[ret.length] = this.days[d];
					}
				ret[ret.length] = '</td>';
			}
		ret[ret.length] = '</tr>';
		var dateObjFirst = new Date(currentYear, currentMonth-1, 1, 0, 0, 0);
		var weekDayFirst = dateObjFirst.getDay();
		if (weekDayFirst == 0) weekDayFirst = 7;
	} 
	else {
		var weekDayFirst = 1;
	}
	
	for (var i=0; i<6; i++) {
		ret[ret.length] = '<tr>';
			for (var j=1; j<8; j++) {
				var isSelectableDate = this.isDateSelectable(this._currentYear, this._currentMonth, day);
				if ((day > lastDayOfMonth) || ((i == 0) && (j < weekDayFirst))) {
					ret[ret.length] = '<td>&nbsp;</td>';
				} 
				else {
					ret[ret.length] = '<td';
					ret[ret.length] = ' id="' + this._objectId + '_td' + day + '"';
					ret[ret.length] = ' align="right"';
					if (isSelectableDate) {
						// ACHTUNG AUSGEBLENDET BY DANIEL ÄNDERUNG
						//ret[ret.length] = ' onMouseOver="Bs_Objects['+this._id+'].dayMouseOver(' + day + ');"';
						//ret[ret.length] = ' onMouseOut="Bs_Objects['+this._id+'].dayMouseOut(' + day + ');"';
						ret[ret.length] = ' onClick="Bs_Objects['+this._id+'].updateByDay(' + day + ');"';
					}
					var classArr = new Array();
					classArr[classArr.length] = 'BsDp_day';
					classArr[classArr.length] = 'BsDp_weekday' +j;
					if (typeof(this.dayClassNameByDay[day])   != 'undefined') classArr[classArr.length] = this.dayClassNameByDay[day];
					if (this.isHoliday(this._currentYear, this._currentMonth, day)) {
						classArr[classArr.length] = 'BsDb_holiday';
					}
					if ((this.dateToday.getDate() == day) && (this.dateToday.getMonth() == (this._currentMonth -1)) && (this.fixYear(this.dateToday.getYear()) == this._currentYear)) {
						classArr[classArr.length] = 'BsDp_dayToday';
					}
					
						if (!isSelectableDate) classArr[classArr.length] = 'BsDp_dayUnselectable';
						if (classArr.length > 0) {
							var clsarr = classArr.join(' ');
							if (day == currentDay) {
								ret[ret.length] = ' class="BsDp_dayToday"';
							}
							else {
								ret[ret.length] = ' class="' + clsarr + '"';
								ret[ret.length] = ' style="';
							}
						} 
						else {
							ret[ret.length] = ' style="font-family:courier; font-size:11px;';
						}
					
						if (isSelectableDate) {
							ret[ret.length] = 'cursor:hand; cursor:pointer;';
						} 
						else {
							ret[ret.length] = 'cursor:default;';
						}
						if (day == currentDay) {
							ret[ret.length] = ' color:' + this.dayFontColorActive + '; background-color:' + this.dayBgColorActive + ';';
						} 
						else {}
					ret[ret.length] = '"';
					ret[ret.length] = '>';
						// if (day == currentDay) {
						//	ret[ret.length] = '<div class=BsDp_dayToday>';
						//}				
					ret[ret.length] = day;
						//if (day == currentDay) {
						//	ret[ret.length] = '</div>';
						//}					
					ret[ret.length] = '</td>';
					day++;
				}
			}
		ret[ret.length] = '</tr>';
		if (day >= (lastDayOfMonth +1)) break;
	}
	ret[ret.length] = '</table>';
	return ret.join('');
}

this.updateDayTable = function() {
	document.getElementById(this._objectId + '_dayDiv').innerHTML = this.renderDayTable(this._currentYear, this._currentMonth, this._currentDay);
}

this.getCurrentDateReadable = function() {
	if (this._currentDay   == 0) return '';
	if (this._currentMonth == 0) return '';
	if (this._currentYear  == 0) return '';
	var ret = '';
	var dateObj = new Date(this._currentYear, this._currentMonth -1, this._currentDay);var weekDay = dateObj.getDay();
	if (weekDay == 0) weekDay = 7;
	ret += this.days[weekDay -1] + ', '
	ret += this.monthLong[this._currentMonth -1] + ' ';
	ret += this._currentDay;switch (this._currentDay) {
		case 1: case 21: case 31:
		ret += 'st'; 
		break;
		case 2: case 22:
		ret += 'nd'; 
		break;
		case 3: case 23:
		ret += 'rd'; 
		break;
		default: 
		ret += 'th';
	}
	ret += ' ' + this._currentYear;
	if (this.withTime) {
		ret += ' ' + this.getCurrentTimeFormatted();
	}
	return ret;
}

this.getCurrentDateFormatted = function() {
	if (this._currentDay   == 0) return '';
	if (this._currentMonth == 0) return '';
	if (this._currentYear  == 0) return '';
	switch (this.dateFormat) {
		case 'us':
		var ret = '';
		if (this._currentMonth < 10) ret += '0';ret += this._currentMonth + '/';
		if (this._currentDay < 10) ret += '0';
		ret += this._currentDay + '/';ret += this._currentYear;break;
		case 'eu':
		var ret = '';
		if (this._currentDay < 10) ret += '0';ret += this._currentDay + '.';
		if (this._currentMonth < 10) ret += '0';
		ret += this._currentMonth + '.';
		ret += this._currentYear;break;
		default:
		var ret = this._currentDate;
	}
	if (this.withTime) {
		ret += ' ' + this.getCurrentTimeFormatted();
	}
	return ret;
}

this.getCurrentTimeFormatted = function() {
	if (!this.withTime) return '';
	switch (this.timeFormat) {
		case 'H:i':
		return this._currentTime.substr(0, 5);
		break;default:
		return this._currentTime;
	}
}

this.updateInputField = function() {
	var fld = document.getElementById(this.fieldName);
	if ((fld == null) || !fld) return;fld.value = this.getCurrentDateFormatted();
	fld.title = this.getCurrentDateReadable();
}

this.updateByMouseWheel = function() {
	if (typeof(this._wheelTimeout) != 'undefined') clearTimeout(this._wheelTimeout)
	var pos = this._rememberCursorPos();if (pos > 0) {
		var negative = (event.wheelDelta < 0);var calcObj = this._posToDateCalcHelper(pos, negative);
		this.dateCalc(calcObj.calcDay, calcObj.calcMonth, calcObj.calcYear, false);
		this._resetCursorPos();
	}
	else {
		if (event.wheelDelta > 0) {
			this.dateCalc(1, 0, 0, false);
		} 
		else if (event.wheelDelta < 0) {
			this.dateCalc(-1, 0, 0, false);
		}
	}
	this._wheelTimeout = setTimeout('Bs_Objects['+this._id+']._reRenderDatePicker();', 300);
	return false;
}

this.updateByInputFieldChange = function() {
	switch (window.event.keyCode) {
		case 16:
		case 35:
		case 36:
		case 37:
		case 39:
		return;case 38:
		case 40:
		var negative = (window.event.keyCode == 40) || ((window.event.keyCode == 34));if ((document.selection) && (document.selection.createRange)) {
			var pos = this._rememberCursorPos();
			var calcObj = this._posToDateCalcHelper(pos, negative);
			this.dateCalc(calcObj.calcDay, calcObj.calcMonth, calcObj.calcYear);this._resetCursorPos();
		} 
		else {
			this.dateCalc((negative) ? -1 : 1);
		}
		return;case 107:
		var fld = document.getElementById(this.fieldName);
		var pos = fld.value.indexOf('+');
		var calcObj = this._posToDateCalcHelper(pos);
		this.dateCalc(calcObj.calcDay, calcObj.calcMonth, calcObj.calcYear);
		this.setCursorPos(pos);return;default:
	}
	var userVal = document.getElementById(this.fieldName).value;
	if ((userVal.length == 10) && (this.dateToIsoDate(userVal) != false)) {
		this.updateByInputFieldBlur();
	}
}

this.updateByInputFieldBlur = function() {
	var fld = document.getElementById(this.fieldName);
	var userVal = fld.value;
	if (userVal == this._currentDate) return;
	if (userVal.length > 0) {
		var isDateOk = false;
		do {
			if (this.withTime) {
				var newVal = this.dateToIsoDate(userVal.substr(0, 10));
				var time   = userVal.substr(11);
			} 
			else {
				var newVal = this.dateToIsoDate(userVal);
			}
			if (newVal == false) {
				alert(this.validateErrorMsg.replace(/__VALUE__/, userVal));
				break;
			}
			var year  = parseInt(newVal.substr(0, 4), 10);
			var month = parseInt(newVal.substr(5, 2), 10);
			var day   = parseInt(newVal.substr(8, 2), 10);
			if (!this.isDateSelectable(year, month, day)) {
				fld.value = '';					
				alert(this.rangeErrorMsg.replace(/__VALUE__/, userVal));
				break;
			}
			isDateOk = true;
		} 
		while (false);
			if (!isDateOk) {
				return;
			}
		this._currentYear  = year;
		this._currentMonth = month;
		this._currentDay   = day;
		this._currentTime  = time;
		this.updateCurrentDate();
		this.updateInputField();
	} 
	else {
		this.seedInternalWithCurrentDate();
	}
	this._reRenderDatePicker();
}

this.dateToIsoDate = function(someDate, allowTime) {
	if (typeof(allowTime) == 'undefined') allowTime = true;var someTime = '';
	someDate = someDate.replace(/^\s*/, '');
  	someDate = someDate.replace(/\s*$/, '');
	if (someDate.length <  6) return false;if (someDate.length > 10) {
		if (allowTime) {
			var tmp = someDate.split(' ', 2);
			if (tmp.length == 2) {
				someDate = tmp[0];
				if ((tmp[1].length == 5) || (tmp[1].length == 8)) {
					someTime = tmp[1];
				}
			}
		} 
		else {
		someDate = someDate.substr(0, 10);
		}
	}
	if (someDate.indexOf('/') >= 0) {
		var chunks = someDate.split('/');if (chunks.length != 3) return false;var day   = parseInt(chunks[1], 10);var month = parseInt(chunks[0], 10);var year  = parseInt(chunks[2], 10);
	} 
	else if (someDate.indexOf('-') >= 0) {
		var chunks = someDate.split('-');
		if (chunks.length != 3) return false;
		var day   = parseInt(chunks[2], 10);
		var month = parseInt(chunks[1], 10);
		var year  = parseInt(chunks[0], 10);
	} 
	else if (someDate.indexOf('.') >= 0) {
		var chunks = someDate.split('.');
		if (chunks.length != 3) return false;
		var day   = parseInt(chunks[0], 10);
		var month = parseInt(chunks[1], 10);
		var year  = parseInt(chunks[2], 10);
	} else {
		return false;
	}
	if (year < 100) {
		if (year < 30) {
			year += 2000;
		} 
		else {
			year += 1900;
		}
	}
	if (!this.isValidDate(year, month, day)) return false;
	var ret = '';
	ret += year + '-';
	if (month < 10) ret += '0';
	ret += month + '-';
	if (day < 10) ret += '0';
	ret += day;
	if (someTime != '') {
		ret += ' ' + someTime;
	}
	return ret;
}

this.updateByDay = function(day) {
	try {
		var oldTd = document.getElementById(this._objectId + '_td' + this._currentDay);
		oldTd.style.backgroundColor = this.dayBgColor;
		oldTd.style.color           = this.dayFontColor;
	} 
	catch (e) {}
	var oldTd = document.getElementById(this._objectId + '_td' + day);
	oldTd.style.backgroundColor = this.dayBgColorActive;
	oldTd.style.color           = this.dayFontColorActive;
	this._currentDay = parseInt(day, 10);
	this.updateCurrentDate();
	this.updateInputField();
	if (this.autoClose) 
	this.toggleSelector();
}

this.updateByMonth = function() {
	var tmp = new Bs_FormFieldSelect();
	var monthSelect = document.getElementById(this._objectId + '_month');
	tmp.init(monthSelect);
	this._currentMonth = parseInt(monthSelect.getValue(), 10);
	var isDateOk = false;
	do {
		if (!this.isValidDate(this._currentYear, this._currentMonth, this._currentDay)) {
			break;
		}
		if (!this.isDateSelectable(this._currentYear, this._currentMonth, this._currentDay)) {
			break;
		}
		isDateOk = true;
	} 
	while (false);
		this.updateCurrentDate();
		if (isDateOk) {
			this.updateInputField();
		} 
		else {
			var fld = document.getElementById(this.fieldName);
			fld.value = '';
			fld.title = '';
		}
this.updateDayTable();
}

this.updateByYearChange = function() {
	var tmpYear = parseInt(document.getElementById(this._objectId + '_year').value, 10);
	if ((tmpYear < 2100) && (tmpYear > 1800)) {
		this.updateByYearBlur();
	}
}

this.updateByYearBlur = function() {
	var tmpYear = parseInt(document.getElementById(this._objectId + '_year').value, 10);
	tmpYear = this.fixYear(tmpYear);
	this._currentYear = tmpYear;var isDateOk = false;
	do {
		if (!this.isValidDate(this._currentYear, this._currentMonth, this._currentDay)) {
			break;
		}
		if (!this.isDateSelectable(this._currentYear, this._currentMonth, this._currentDay)) {
			break;
		}
		isDateOk = true;
	} 
	while (false);
		this.updateCurrentDate();
		if (isDateOk) {
			this.updateInputField();
		} 
		else {
			var fld = document.getElementById(this.fieldName);
			fld.value = '';
			fld.title = '';
		}
	this.updateDayTable();
}

this.updateCurrentDate = function() {
	if ((0 == this._currentYear) && (0 == this._currentMonth) && (0 == this._currentDay) ) {
		this._currentDate = "";
	} 
	else {
		this._currentDate = this._currentYear + '-';
		if (this._currentMonth < 10) this._currentDate += '0';
		this._currentDate += this._currentMonth + '-';
		if (this._currentDay < 10) this._currentDate += '0';
		this._currentDate += this._currentDay;
	}
}

this.toggleSelector = function() {
	var div = document.getElementById(this._objectId + '_div');
	if (div.style.display == 'none') {
		div.style.display = 'block';
		var inputField = document.getElementById(this.fieldName);
		if (inputField.offsetLeft > div.offsetLeft) {
			div.style.marginLeft = inputField.offsetLeft + 'px';
		}
		var newChar  = '-';
		if (this._useSpinEditForYear()) {
			var objName = this._objectId + '_yObj';eval(objName + '.redraw();');
		}
		this.toggleButton.setStatus(2);
		this.toggleButton.setTitle(this.txtHideCalendar);
	} 
	else {
		div.style.display = 'none';
		var newChar  = '+';
		this.toggleButton.setStatus(1);
		this.toggleButton.setTitle(this.txtShowCalendar);
	}
}

this.dayMouseOver = function(day) {
	var td = document.getElementById(this._objectId + '_td' + day);
	if (td.style.backgroundColor.toLowerCase() == this.dayBgColor.toLowerCase()) {
		td.style.backgroundColor = this.dayBgColorOver;
	}
}

this.dayMouseOut = function(day) {
	var td = document.getElementById(this._objectId + '_td' + day);
	if (day != this._currentDay) {
		td.style.backgroundColor = this.dayBgColor;
	}
}

this.isLeapYear = function(year) {
	return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
}

this.isHoliday = function(year, month, day) {
	year  = parseInt(year);
	month = parseInt(month);
	day   = parseInt(day);
	var holidays = this.holidays;
	for (var i=0; i<holidays.length; i++) {
		if ((holidays[i][0] != null) && (holidays[i][0] != year))  continue;
		if ((holidays[i][1] != null) && (holidays[i][1] != month)) continue;
		if ((holidays[i][2] != null) && (holidays[i][2] != day))   continue;
		return true;
	}
return false;
}

this.getNumberOfDays = function(year, month) {
	switch (month) {
		case 2:
		if (this.isLeapYear(year)) return 29;
		return 28;
		break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
		return 31;
		break;
		default:
		return 30;
	}
}

this.dateCalc = function(addDays, addMonths, addYears, reRender) {
	if (typeof(reRender) == 'undefined') reRender = true;
	if (this._currentDay   == 0) return false;
	if (this._currentMonth == 0) return false;
	if (this._currentYear  == 0) return false;
	if (typeof(addDays)   == 'undefined') addDays   = 0;
	if (typeof(addMonths) == 'undefined') addMonths = 0;
	if (typeof(addYears)  == 'undefined') addYears  = 0;
	var tmpDate = new Date(this._currentYear+addYears, this._currentMonth-1+addMonths, this._currentDay+addDays);
	this.setDateByChunks(tmpDate.getYear(), tmpDate.getMonth()+1, tmpDate.getDate(), reRender);
	return true;
}

this.setCursorPos = function(pos) {
	if ((document.selection) && (document.selection.createRange)) {
		var fld = document.getElementById(this.fieldName);
		var x = document.selection.createRange();
		x.move('character', -(fld.value.length - pos));
		x.select();
		return this._lastCursorPos;
	} 
	else {
		return false;
	}
}

this.getCursorPos = function() {
	if ((document.selection) && (document.selection.createRange)) {
		var text = '!';
		var fld = document.getElementById(this.fieldName);
		if (document.activeElement == fld) {
			var caretPos = document.selection.createRange().duplicate();
			caretPos.collapse(false);
			caretPos.text = "!";
			var pos = fld.value.indexOf('!');
			fld.value = fld.value.substring(0, pos) + fld.value.substring(pos +1);
			caretPos.collapse(false);
			return pos;
		}
	}
return 0;
}

this.loadSkin = function(skinName) {
	try {
		var oLink = document.createElement("link")
		oLink.href = this.jsBaseDir + 'components/datepicker/css/' + skinName + '.css';
		oLink.rel  = "stylesheet";
		oLink.type = "text/css";
		document.body.appendChild(oLink);
	} catch (e) { }
	switch (skinName) {
		case 'win2k':
			this.imgDir               = this.jsBaseDir + 'components/datepicker/img/win2k/';
			this.toggleButton.imgPath = this.imgDir;
			this.toggleButton.imgName = 'toggleButton';
			this.daysNumChars   = 1;
			return true;
		case 'osx':
		case 'h2ogtk2':
			this.imgDir                       = this.jsBaseDir + 'components/datepicker/img/' + skinName + '/';
			this.toggleButton.imgPath         = this.imgDir;
			this.toggleButton.imgName         = 'toggleButton';
			this.toggleButton.backgroundColor = 'transparent';
			this.toggleButton.cssClassDefault     = '';
			this.toggleButton.cssClassMouseOver   = '';
			this.toggleButton.cssClassMouseDown   = '';
			this.daysNumChars   = 1;
			this.useMonthField  = 1;
			this.useYearField   = 1;
			this.useArrows      = true;
			this.useButtonToday = true;
			this.dayTableAttributeString    = 'width="100%" border="0" cellspacing="0" cellpadding="2" bordercolor="white"';
			this.dayHeaderFontColor         = 'black';
			this.dayHeaderBgColor           = 'white';
			this.dayFontColor               = 'black';
			this.dayBgColor                 = 'white';
			this.dayFontColorActive         = 'white';
			this.dayBgColorActive           = '#B5B6BD';
			this.dayTableBgColor            = 'white';
			this.dayBgColorOver             = '#B5B6BD';
			return true;
	}
return false;
}

this.openPopup = function() {
	var url = '/_bsJavascript/components/datepicker/popup.html?objectId=' + this._id;
	var w=window.open(url, 'DatePicker', 'toolbar=no,scrollbars=no,resizable=yes,width=180,height=260');
	w.focus();
}

this.isDateSelectable = function(year, month, day) {
	if (typeof(this._dateRangeLower_year) == 'undefined') {
		this._dateRangeLower_year  = this.dateRangeLower.substr(0, 4);
		this._dateRangeLower_month = this.dateRangeLower.substr(5, 2);
		this._dateRangeLower_day   = this.dateRangeLower.substr(8, 2);
		this._dateRangeUpper_year  = this.dateRangeUpper.substr(0, 4);
		this._dateRangeUpper_month = this.dateRangeUpper.substr(5, 2);
		this._dateRangeUpper_day   = this.dateRangeUpper.substr(8, 2);
	}
	var isSelectableDate = false;
	do {
		if (year < this._dateRangeLower_year) break;
		if ((year == this._dateRangeLower_year) && (month < this._dateRangeLower_month)) break;
		if ((year == this._dateRangeLower_year) && (month == this._dateRangeLower_month) && (day < this._dateRangeLower_day)) break;
		if (year > this._dateRangeUpper_year) break;if ((year == this._dateRangeUpper_year) && (month > this._dateRangeUpper_month)) break;
		if ((year == this._dateRangeUpper_year) && (month == this._dateRangeUpper_month) && (day > this._dateRangeUpper_day)) break;
		var checkWeekday = false;
			for (var i=0; i<7; i++) {
				if (!this.allowedWeekdays[i]) {
					checkWeekday = true;
					break;
				}
			}
		if (checkWeekday) {
			var dateObj = new Date(year, month-1, day);
			var weekday = dateObj.getDay();weekday--; 
			if (weekday < 0) weekday = 6;
			if (!this.allowedWeekdays[weekday]) break;
		}
		isSelectableDate = true;
	} 
	while (false);
		return isSelectableDate;
}

this.isValidDate = function(year, month, day) {
	if (year >= 1970) {
		var tDate = new Date(year, month -1, day);
		if (day   != tDate.getDate())               return false;
		if (month != (tDate.getMonth() +1))         return false;
		if (year  != this.fixYear(tDate.getYear())) return false;
	} 
	else {
		if ((day   < 1)    || (day   > 31))   return false;
		if ((month < 1)    || (month > 12))   return false;
		if ((year  < 1000) || (year  > 3000)) return false;
	}
	if (day > 28) {
		if (this.getNumberOfDays(year, month) < day) return false;
	}
return true;
}

this._posToDateCalcHelper = function(pos, negative) {
	var ret = new Object();ret.calcDay   = 0;
	ret.calcMonth = 0;
	ret.calcYear  = 0;
	switch (this.dateFormat) {
		case 'eu':
		if (pos <= 2) {
			ret.calcDay   = 1;
		} 
		else if (pos <= 5) {
			ret.calcMonth = 1;
		} 
		else {
			ret.calcYear  = 1;
		}
		break;
		case 'us':
		if (pos <= 2) {
			ret.calcMonth = 1;
		} 
		else if (pos <= 5) {
			ret.calcDay   = 1;
		} 
		else {
			ret.calcYear  = 1;
		}
		break;
		default:
		if (pos <= 4) {
			ret.calcYear  = 1;
		} else if (pos <= 7) {
			ret.calcMonth = 1;
		} else {
		ret.calcDay   = 1;
		}
	}
	if (negative) {
		ret.calcDay   = -ret.calcDay;
		ret.calcMonth = -ret.calcMonth;
		ret.calcYear  = -ret.calcYear;
	}
return ret;
}

this._convertYearToSpinEdit = function() {
	if (this._useSpinEditForYear()) {
		var objName = this._objectId + '_yObj';
		var myNf = new Bs_NumberField(this._objectId + '_year');
		eval(objName + ' = myNf;');
		myNf.buttonUp.imgPath   = this.jsBaseDir + 'components/numberfield/img/';
		myNf.buttonDown.imgPath = this.jsBaseDir + 'components/numberfield/img/';
		myNf.minValue = 1800;
		myNf.maxValue = 2300;
		myNf.attachEvent('onAfterChange', 'Bs_Objects['+this._id+'].updateByYearBlur();');
		myNf.draw();
	}
}

this._useSpinEditForYear = function() {
	return (!this.asPopup && ( (this.useYearField == 3) && ((typeof(Bs_NumberField) != 'undefined')) ) || ((typeof(this.useYearField) == 'undefined') && this.useSpinEditForYear));
}

this._rememberCursorPos = function() {
	this._lastCursorPos = this.getCursorPos();
	return this._lastCursorPos;
}

this._resetCursorPos = function() {
	return this.setCursorPos(this._lastCursorPos)
}

this._constructor();}
