var Calendar = function (id, params, mini, urlType, listSid ) { this.container = $('calendar_' + id); this.params = params; this.mini = mini; this.monthsContainer = mini ? $('month_' + id) : $$(this.container, 'TABLE')[0]; this.curMonth = this.params.months[1]; this.curYear = this.params.years[1]; this.minDate = new Date(this.params.years[0], this.params.months[0] - 1, 1); this.maxDate = new Date(this.params.years[2], this.params.months[2] - 1, 1); this.leftArrow = $('larr_' + id); this.rightArrow = $('rarr_' + id); this.urlType = urlType; if(this.urlType == 'list-sid') { this.listSid = listSid; } if (this.mini) { this.params.currentIndex = 0; Event.add(this.leftArrow, 'click', this.moveMini.bind(this, 0)); Event.add(this.rightArrow, 'click', this.moveMini.bind(this, 1)); } else { Event.add(this.leftArrow, 'click', this.move.bind(this, 0)); Event.add(this.rightArrow, 'click', this.move.bind(this, 1)); } this.AJAX = new Ajax(this.getMonthDaysAjax, { _this : this, eventPlace : this.monthsContainer, container : $$(this.container, 'UL')[mini ? 1 : 0], spinner : $(this.params.ajax_spinner_id) } ); return this; }; Calendar.prototype.move = function (dir){ var columns = $$(this.monthsContainer, 'TD'); var a = []; var tmp, current, nextDate; // collecting array of original values for (var i = 0, l = columns.length; i < l; i++) { var month = columns[i]; a[i] = month.innerHTML; } // set offsetted month into temporary array nextDate = this.getNextDate(dir); if (!nextDate) { return; } dir ? this.params.currentIndex-- : this.params.currentIndex++; if (!dir) { for (i = a.length - 2; i >= 0; i--) { tmp = a[i + 1]; a[i + 1] = a[i]; if (i > 0) { a[i] = tmp; } else { var list_url = document.location.pathname.match(/(\/\w+\/)(?:\d+)?/)[1]; a[i] = '' + this.dateName(nextDate) + ''; } } } else { for (i = 1, l = a.length; i < l; i++) { tmp = a[i - 1]; a[i - 1] = a[i]; if (i < a.length - 1) { a[i] = tmp; } else { list_url = document.location.pathname.match(/(\/\w+\/)(?:\d+)?/)[1]; a[i] = '' + this.dateName(nextDate) + ''; } } } // Rendering resulting array into table for (i = 0, l = a.length; i < l; i++) { month = a[i]; current = columns[i]; current.className = ((this.params.currentIndex >= 0 || this.params.currentIndex <= a.length) && i == this.params.currentIndex) ? 'orng' : ''; current.innerHTML = month; } this.checkNextButtons(dir); }; Calendar.prototype.moveMini = function (dir) { var nextDate = this.getNextDate(dir); if (!nextDate) { return; } dir ? this.params.currentIndex-- : this.params.currentIndex++; this.monthsContainer.innerHTML = this.dateName(nextDate); this.checkNextButtons(dir); nextDate.setMonth(this.nextDate.getMonth() + (dir ? -1 : 1)); var ajaxUrl = nextDate.getFullYear().toString() + (nextDate.getMonth() < 9 ? '0' : '') + (nextDate.getMonth() + 1) + '01'; this.AJAX.run(ajaxUrl); }; Calendar.prototype.checkNextButtons = function (dir) { this.nextDate.setMonth(this.nextDate.getMonth() + (dir ? 1 : -1)); Object.Class.replace(this.leftArrow, 'hidden', '', this.minDate > this.nextDate); Object.Class.replace(this.rightArrow, 'hidden', '', this.maxDate < this.nextDate); }; Calendar.prototype.createURL = function (date) { var m = (date.getMonth() + 1).toString(); return date.getFullYear() + (m.length == 1 ? '0' + m : m) + '01'; }; Calendar.prototype.getNextDate = function (i) { var offset = this.curMonth - this.params.currentIndex + (i ? (this.mini ? 1 : 5) : -1); var nextMonth = (((offset - 1) % 12) + 12) % 12 + 1; var nextYear = this.curYear + Math.floor((offset - 1) / 12); this.nextDate = new Date(nextYear, nextMonth - 1, 1); return (this.minDate > this.nextDate || this.maxDate < this.nextDate) ? false : this.nextDate; }; Calendar.prototype.dateName = function (nextDate) { return this.params.monthNames[nextDate.getMonth() + 1] + ' ' + nextDate.getFullYear(); }; Calendar.prototype.selectMonth = function (newIndex) { var columns = $$(this.monthsContainer, 'TD'); var deltaMonth = this.params.currentIndex - newIndex; var newMonth = ((((this.curMonth - deltaMonth) - 1) % 12) + 12) % 12 + 1; var newYear = this.curYear + Math.floor((this.curMonth - deltaMonth - 1) / 12); this.params.currentIndex = newIndex; this.curMonth = newMonth; this.curYear = newYear; for (var i = 0, l = columns.length; i < l; i++) { var current = columns[i]; current.className = (i == newIndex) ? 'orng' : ''; } }; Calendar.prototype.getMonthDaysAjax = { init: function () { if (!this._this.mini) { Event.add(this.eventPlace, 'click', this.run.bind(this)); } }, run: function (e) { if (this._this.mini) { this.currentURL = e; //this.url = document.location.pathname.match(/(\/\w+\/)(?:\d+)?/)[1] + e + '/calendar.json?mini=1'; if(this._this.urlType == 'list-sid') { this.url = '/' + this._this.listSid + '/' + e + '/calendar.json?mini=1'; } else { this.url = (document.location.pathname.match(/(\/\w+\/)?(?:\d+)?/)[1] || document.location.pathname) + e + '/calendar.json?mini=1'; } this.go(); } else { e = Event.elementEqual(e, 'A'); if (!e || e.parentNode.className) { return false; } var currentTD = e.parentNode; var c = 0; while (currentTD.previousSibling) { currentTD = currentTD.previousSibling; c++; } this._this.selectMonth(c); if(this._this.urlType == 'list-sid') { this.currentURL = e.href.match(/(\d+)/)[0]; this.url = '/' + this._this.listSid + '/' + e.href.match(/(\d+)/)[0] + '/calendar.json'; } else { //this.url = (document.location.pathname.match(/(\/\w+\/)?(?:\d+)?/)[1] || document.location.pathname) + e + '/calendar.json'; this.currentURL = e.href.match(/\/\w+\/(\d+)/)[1]; this.url = e.href + 'calendar.json'; } this.go(); } }, after: function (response) { if (response.url != this.currentURL) { return; } this.spinnerSH(0); this.container.innerHTML = response.html; } };