// BKE Calendar Library // default settins var A_TCALDEF = { 'months' : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], 'weekdays' : ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], 'yearscroll': true, // show year scroller 'weekstart': 1, // first day of week: 0-Su or 1-Mo 'centyear' : 70, // 2 digit years less than 'centyear' are in 20xx, othewise in 19xx. 'imgpath' : 'http://reservations.leopoldhotelantwerp.com/calendar/img/'} var padout = function(number) { var number = String(number); return (number.length < 2) ? '0' + number : number; } // date parsing function function f_tcalParseDate (s_date) { var re_date = /^\s*(\d{1,2})\-(\d{1,2})\-(\d{2,4})\s*$/; if (!re_date.exec(s_date)) return alert ("Invalid date: '" + s_date + "'.\nAccepted format is dd-mm-yyyy.") var n_day = Number(RegExp.$1), n_month = Number(RegExp.$2), n_year = Number(RegExp.$3); if (n_year < 100) n_year += (n_year < this.a_tpl.centyear ? 2000 : 1900); if (n_month < 1 || n_month > 12) return alert ("Invalid month value: '" + n_month + "'.\nAllowed range is 01-12."); var d_numdays = new Date(n_year, n_month, 0); if (n_day > d_numdays.getDate()) return alert("Invalid day of month value: '" + n_day + "'.\nAllowed range for selected month is 01 - " + d_numdays.getDate() + "."); return new Date (n_year, n_month - 1, n_day); } // date generating function function f_tcalGenerDate (d_date, type) { if (type == 'day') { return (d_date.getDate()); } if (type == 'month') { return (d_date.getMonth() + 1); } if (type == 'year') { return (d_date.getFullYear()); } } // implementation function tcal (a_cfg, a_tpl) { // apply default template if not specified if (!a_tpl) a_tpl = A_TCALDEF; // register in global collections if (!window.A_TCALS) window.A_TCALS = []; if (!window.A_TCALSIDX) window.A_TCALSIDX = []; this.s_id = a_cfg.id ? a_cfg.id : A_TCALS.length; window.A_TCALS[this.s_id] = this; window.A_TCALSIDX[window.A_TCALSIDX.length] = this; // assign methods this.f_show = f_tcalShow; this.f_hide = f_tcalHide; this.f_toggle = f_tcalToggle; this.f_update = f_tcalUpdate; this.f_relDate = f_tcalRelDate; this.f_parseDate = f_tcalParseDate; this.f_generDate = f_tcalGenerDate; // create calendar icon this.s_iconId = 'tcalico_' + this.s_id; this.e_icon = f_getElement(this.s_iconId); if (!this.e_icon) { document.write(''); this.e_icon = f_getElement(this.s_iconId); } // save received parameters this.a_cfg = a_cfg; this.a_tpl = a_tpl; } function f_tcalShow (d_date) { // find input field if (!this.a_cfg.inputname_day) throw("TC: input name day is not specified"); if (!this.a_cfg.inputname_month) throw("TC: input name month is not specified"); if (!this.a_cfg.inputname_year) throw("TC: input name year is not specified"); if (this.a_cfg.formname) { this.e_form = document.forms[this.a_cfg.formname]; if (!this.e_form) throw("TC: form '" + this.a_cfg.formname + "' can not be found"); this.e_input_day = this.e_form.elements[this.a_cfg.inputname_day]; this.e_input_month = this.e_form.elements[this.a_cfg.inputname_month]; this.e_input_year = this.e_form.elements[this.a_cfg.inputname_year]; if (this.e_input_nights = this.e_form.elements[this.a_cfg.inputname_nights]) { this.nights = this.e_input_nights.value; } else { if (this.a_cfg.minstay > 0) { this.nights = this.a_cfg.minstay; } else { this.nights = 1; } } } else { this.e_input_day = f_getElement(this.a_cfg.inputname_day); this.e_input_month = f_getElement(this.a_cfg.inputname_month); this.e_input_year = f_getElement(this.a_cfg.inputname_year); if (this.e_input_nights = f_getElement(this.a_cfg.inputname_nights)) { this.nights = this.e_input_nights.value; } else { this.nights = 1; } } if (!this.e_input_day || !this.e_input_day.tagName) throw("TC: element '" + this.a_cfg.inputname_day + "' does not exist in " + (this.a_cfg.formname ? "form '" + this.a_cfg.formname + "'" : 'this document')); if (!this.e_input_month || !this.e_input_month.tagName) throw("TC: element '" + this.a_cfg.inputname_month + "' does not exist in " + (this.a_cfg.formname ? "form '" + this.a_cfg.formname + "'" : 'this document')); if (!this.e_input_year || !this.e_input_year.tagName) throw("TC: element '" + this.a_cfg.inputname_ + "' does not exist in " + (this.a_cfg.formname ? "form '" + this.a_cfg.formname + "'" : 'this document')); // dynamically create HTML elements if needed this.e_div = f_getElement('tcal'); if (!this.e_div) { this.e_div = document.createElement("DIV"); this.e_div.id = 'tcal'; document.body.appendChild(this.e_div); } this.e_shade = f_getElement('tcalShade'); if (!this.e_shade) { this.e_shade = document.createElement("DIV"); this.e_shade.id = 'tcalShade'; document.body.appendChild(this.e_shade); } this.e_iframe = f_getElement('tcalIF') if (b_ieFix && !this.e_iframe) { this.e_iframe = document.createElement("IFRAME"); this.e_iframe.style.filter = 'alpha(opacity=0)'; this.e_iframe.id = 'tcalIF'; this.e_iframe.src = this.a_tpl.imgpath + 'pixel.gif'; document.body.appendChild(this.e_iframe); } // hide all calendars f_tcalHideAll(); // generate HTML and show calendar this.e_icon = f_getElement(this.s_iconId); if (!this.f_update()) return; this.e_div.style.visibility = 'visible'; this.e_shade.style.visibility = 'hidden'; if (this.e_iframe) this.e_iframe.style.visibility = 'visible'; // change icon and status this.e_icon.src = this.a_tpl.imgpath + 'no_cal.gif'; this.e_icon.title = 'Close Calendar'; this.b_visible = true; } function f_tcalHide (n_date) { if (n_date) { this.e_input_day.value = this.f_generDate(new Date(n_date), 'day'); this.e_input_month.value = this.f_generDate(new Date(n_date), 'month'); this.e_input_year.value = this.f_generDate(new Date(n_date), 'year'); if (this.a_cfg.update_dates) { bke_update_dropdown(this.e_form, this.e_input_day.value, this.e_input_month.value, this.e_input_year.value, this.nights); } if (typeof calendar2_on_hide == 'function') { calendar2_on_hide(this.e_form); } } // no action if not visible if (!this.b_visible) return; // hide elements if (this.e_iframe) this.e_iframe.style.visibility = 'hidden'; if (this.e_shade) this.e_shade.style.visibility = 'hidden'; this.e_div.style.visibility = 'hidden'; // change icon and status this.e_icon = f_getElement(this.s_iconId); this.e_icon.src = this.a_tpl.imgpath + 'cal.gif'; this.e_icon.title = 'Open Calendar'; this.b_visible = false; } function f_tcalToggle () { return this.b_visible ? this.f_hide() : this.f_show(); } function f_tcalUpdate (d_date) { var d_today = this.a_cfg.today ? this.f_parseDate(this.a_cfg.today) : f_tcalResetTime(new Date()); var d_selected = this.e_input_day.value == '' && this.a_cfg.today ? this.f_parseDate(this.a_cfg.today) : new Date (this.e_input_year.value, this.e_input_month.value - 1, this.e_input_day.value); // figure out date to display if (!d_date) // selected by default d_date = d_selected; else if (typeof(d_date) == 'number') // get from number d_date = f_tcalResetTime(new Date(d_date)); else if (typeof(d_date) == 'string') // parse from string this.f_parseDate(d_date); if (!d_date) return false; // first date to display var d_firstday = new Date(d_date); d_firstday.setDate(1); d_firstday.setDate(1 - (7 + d_firstday.getDay() - this.a_tpl.weekstart) % 7); var a_class, s_html = '' + (this.a_tpl.yearscroll ? '' : '') + '' + (this.a_tpl.yearscroll ? '' : '') + '
' + this.a_tpl.months[d_date.getMonth()] + ' ' + d_date.getFullYear() + '
'; // print weekdays titles for (var i = 0; i < 7; i++) s_html += ''; s_html += '' ; // print calendar table var n_date, n_month, d_current = new Date(d_firstday); while (d_current.getMonth() == d_date.getMonth() || d_current.getMonth() == d_firstday.getMonth()) { // print row heder s_html +=''; for (var n_wday = 0; n_wday < 7; n_wday++) { a_class = []; n_date = d_current.getDate(); n_month = d_current.getMonth(); // other month if (d_current.getMonth() != d_date.getMonth()) a_class[a_class.length] = 'othermonth'; // weekend if (d_current.getDay() == 0 || d_current.getDay() == 6) a_class[a_class.length] = 'weekend'; // today if (d_current.valueOf() == d_today.valueOf()) a_class[a_class.length] = 'today'; // selected if (d_current.valueOf() == d_selected.valueOf()) a_class[a_class.length] = 'selected'; s_html += '' d_current.setDate(++n_date); while (d_current.getDate() != n_date && d_current.getMonth() == n_month) { d_current.setHours(d_current.getHours + 1); d_current = f_tcalResetTime(d_current); } } // print row footer s_html +=''; } s_html +='
' + this.a_tpl.weekdays[(this.a_tpl.weekstart + i) % 7] + '
' : '>') + n_date + '
'; // update HTML, positions and sizes this.e_div.innerHTML = s_html; var n_width = this.e_div.offsetWidth; var n_height = this.e_div.offsetHeight; var n_top = f_getPosition (this.e_icon, 'Top') + this.e_icon.offsetHeight; var n_left = f_getPosition (this.e_icon, 'Left') - n_width + this.e_icon.offsetWidth; if (n_left < 0) n_left = 0; this.e_div.style.left = n_left + 'px'; this.e_div.style.top = n_top + 'px'; this.e_shade.style.width = (n_width + 8) + 'px'; this.e_shade.style.left = (n_left - 1) + 'px'; this.e_shade.style.top = (n_top - 1) + 'px'; this.e_shade.innerHTML = b_ieFix ? '
' : '
'; if (this.e_iframe) { this.e_iframe.style.left = n_left + 'px'; this.e_iframe.style.top = n_top + 'px'; this.e_iframe.style.width = (n_width + 6) + 'px'; this.e_iframe.style.height = (n_height + 6) +'px'; } return true; } function f_getPosition (e_elemRef, s_coord) { var n_pos = 0, n_offset, e_elem = e_elemRef; while (e_elem) { n_offset = e_elem["offset" + s_coord]; n_pos += n_offset; e_elem = e_elem.offsetParent; } // margin correction in some browsers if (b_ieMac) n_pos += parseInt(document.body[s_coord.toLowerCase() + 'Margin']); else if (b_safari) n_pos -= n_offset; e_elem = e_elemRef; while (e_elem != document.body) { n_offset = e_elem["scroll" + s_coord]; if (n_offset && e_elem.style.overflow == 'scroll') n_pos -= n_offset; e_elem = e_elem.parentNode; } return n_pos; } function f_tcalRelDate (d_date, d_diff, s_units) { var s_units = (s_units == 'y' ? 'FullYear' : 'Month'); var d_result = new Date(d_date); d_result['set' + s_units](d_date['get' + s_units]() + d_diff); if (d_result.getDate() != d_date.getDate()) d_result.setDate(0); return ' onclick="A_TCALS[\'' + this.s_id + '\'].f_update(' + d_result.valueOf() + ')"'; } function f_tcalHideAll () { if (window.A_TCALSIDX) { for (var i = 0; i < window.A_TCALSIDX.length; i++) window.A_TCALSIDX[i].f_hide(); } } function f_tcalResetTime (d_date) { d_date.setHours(0); d_date.setMinutes(0); d_date.setSeconds(0); d_date.setMilliseconds(0); return d_date; } f_getElement = document.all ? function (s_id) { return document.all[s_id] } : function (s_id) { return document.getElementById(s_id) }; if (document.addEventListener) window.addEventListener('scroll', f_tcalHideAll, false); if (window.attachEvent) window.attachEvent('onscroll', f_tcalHideAll); // global variables var s_userAgent = navigator.userAgent.toLowerCase(), re_webkit = /WebKit\/(\d+)/i; var b_mac = s_userAgent.indexOf('mac') != -1, b_ie5 = s_userAgent.indexOf('msie 5') != -1, b_ie6 = s_userAgent.indexOf('msie 6') != -1 && s_userAgent.indexOf('opera') == -1; var b_ieFix = b_ie5 || b_ie6, b_ieMac = b_mac && b_ie5, b_safari = b_mac && re_webkit.exec(s_userAgent) && Number(RegExp.$1) < 500;