diff -r 058bb3dc685f -r 0b59724cb3f2 web/data/cubicweb.calendar.js --- a/web/data/cubicweb.calendar.js Mon Jan 04 18:40:30 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,361 +0,0 @@ -/** - * This file contains Calendar utilities - * :organization: Logilab - * :copyright: 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. - * :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr - */ - -// IMPORTANT NOTE: the variables DAYNAMES AND MONTHNAMES will be added -// by cubicweb automatically -// dynamically computed (and cached) -var _CAL_HEADER = null; - -TODAY = new Date(); - -/** - * .. class:: Calendar - * - * Calendar (graphical) widget - * - * public methods are : - * - * __init__ : - * :attr:`containerId`: the DOM node's ID where the calendar will be displayed - * :attr:`inputId`: which input needs to be updated when a date is selected - * :attr:`year`, :attr:`month`: year and month to be displayed - * :attr:`cssclass`: CSS class of the calendar widget (default is 'commandCal') - * - * show() / hide(): - * show or hide the calendar widget - * - * toggle(): - * show (resp. hide) the calendar if it's hidden (resp. displayed) - * - * displayNextMonth(): (resp. displayPreviousMonth()) - * update the calendar to display next (resp. previous) month - */ -Calendar = function(containerId, inputId, year, month, cssclass) { - this.containerId = containerId; - this.inputId = inputId; - this.year = year; - this.month = month - 1; // Javascript's counter starts at 0 for january - this.cssclass = cssclass || "popupCalendar"; - this.visible = false; - this.domtable = null; - - this.cellprops = { - 'onclick': function() { - dateSelected(this, containerId); - }, - 'onmouseover': function() { - this.style.fontWeight = 'bold'; - }, - 'onmouseout': function() { - this.style.fontWeight = 'normal'; - } - }; - - this.todayprops = jQuery.extend({}, - this.cellprops, { - 'class': 'today' - }); - - this._rowdisplay = function(row) { - var _td = function(elt) { - return TD(this.cellprops, elt); - }; - return TR(null, $.map(row, _td)); - }; - - this._makecell = function(cellinfo) { - return TD(cellinfo[0], cellinfo[1]); - }; - - /** - * .. function:: Calendar._uppercaseFirst(s) - * - * utility function (the only use for now is inside the calendar) - */ - this._uppercaseFirst = function(s) { - return s.charAt(0).toUpperCase(); - }; - - /** - * .. function:: Calendar._domForRows(rows) - * - * accepts the cells data and builds the corresponding TR nodes - * - * * `rows`, a list of list of couples (daynum, cssprops) - */ - this._domForRows = function(rows) { - var lines = []; - for (i = 0; i < rows.length; i++) { - lines.push(TR(null, $.map(rows[i], this._makecell))); - } - return lines; - }; - - /** - * .. function:: Calendar._headdisplay(row) - * - * builds the calendar headers - */ - this._headdisplay = function(row) { - if (_CAL_HEADER) { - return _CAL_HEADER; - } - var self = this; - var _th = function(day) { - return TH(null, self._uppercaseFirst(day)); - }; - return TR(null, $.map(DAYNAMES, _th)); - }; - - this._getrows = function() { - var rows = []; - var firstday = new Date(this.year, this.month, 1); - var stopdate = firstday.nextMonth(); - var curdate = firstday.sub(firstday.getRealDay()); - while (curdate.getTime() < stopdate) { - var row = []; - for (var i = 0; i < 7; i++) { - if (curdate.getMonth() == this.month) { - props = curdate.equals(TODAY) ? this.todayprops: this.cellprops; - row.push([props, curdate.getDate()]); - } else { - row.push([this.cellprops, ""]); - } - curdate.iadd(1); - } - rows.push(row); - } - return rows; - }; - - this._makecal = function() { - var rows = this._getrows(); - var monthname = MONTHNAMES[this.month] + " " + this.year; - var prevlink = "javascript: togglePreviousMonth('" + this.containerId + "');"; - var nextlink = "javascript: toggleNextMonth('" + this.containerId + "');"; - this.domtable = TABLE({ - 'class': this.cssclass - }, - THEAD(null, TR(null, TH(null, A({ - 'href': prevlink - }, - "<<")), - // IE 6/7 requires colSpan instead of colspan - TH({ - 'colSpan': 5, - 'colspan': 5, - 'style': "text-align: center;" - }, - monthname), TH(null, A({ - 'href': nextlink - }, - ">>")))), TBODY(null, this._headdisplay(), this._domForRows(rows))); - return this.domtable; - }; - - this._updateDiv = function() { - if (!this.domtable) { - this._makecal(); - } - cw.jqNode(this.containerId).empty().append(this.domtable); - // replaceChildNodes($(this.containerId), this.domtable); - }; - - this.displayNextMonth = function() { - this.domtable = null; - if (this.month == 11) { - this.year++; - } - this.month = (this.month + 1) % 12; - this._updateDiv(); - }; - - this.displayPreviousMonth = function() { - this.domtable = null; - if (this.month == 0) { - this.year--; - } - this.month = (this.month + 11) % 12; - this._updateDiv(); - }; - - this.show = function() { - if (!this.visible) { - var container = cw.jqNode(this.containerId); - if (!this.domtable) { - this._makecal(); - } - container.empty().append(this.domtable); - toggleVisibility(container); - this.visible = true; - } - }; - - this.hide = function(event) { - var self; - if (event) { - self = event.data.self; - } else { - self = this; - } - if (self.visible) { - toggleVisibility(self.containerId); - self.visible = false; - } - }; - - this.toggle = function() { - if (this.visible) { - this.hide(); - } - else { - this.show(); - } - }; - - // call hide() when the user explicitly sets the focus on the matching input - cw.jqNode(inputId).bind('focus', { - 'self': this - }, - this.hide); // connect(inputId, 'onfocus', this, 'hide'); -}; - -/** - * .. data:: Calendar.REGISTRY - * - * keep track of each calendar created - */ -Calendar.REGISTRY = {}; - -/** - * .. function:: toggleCalendar(containerId, inputId, year, month) - * - * popup / hide calendar associated to `containerId` - */ -function toggleCalendar(containerId, inputId, year, month) { - var cal = Calendar.REGISTRY[containerId]; - if (!cal) { - cal = new Calendar(containerId, inputId, year, month); - Calendar.REGISTRY[containerId] = cal; - } - /* hide other calendars */ - for (containerId in Calendar.REGISTRY) { - var othercal = Calendar.REGISTRY[containerId]; - if (othercal !== cal) { - othercal.hide(); - } - } - cal.toggle(); -} - -/** - * .. function:: toggleNextMonth(containerId) - * - * ask for next month to calendar displayed in `containerId` - */ -function toggleNextMonth(containerId) { - var cal = Calendar.REGISTRY[containerId]; - cal.displayNextMonth(); -} - -/** - * .. function:: togglePreviousMonth(containerId) - * - * ask for previous month to calendar displayed in `containerId` - */ -function togglePreviousMonth(containerId) { - var cal = Calendar.REGISTRY[containerId]; - cal.displayPreviousMonth(); -} - -/** - * .. function:: dateSelected(cell, containerId) - * - * callback called when the user clicked on a cell in the popup calendar - */ -function dateSelected(cell, containerId) { - var cal = Calendar.REGISTRY[containerId]; - var input = cw.getNode(cal.inputId); - // XXX: the use of innerHTML might cause problems, but it seems to be - // the only way understood by both IE and Mozilla. Otherwise, - // IE accepts innerText and mozilla accepts textContent - var selectedDate = new Date(cal.year, cal.month, cell.innerHTML, 12); - input.value = remoteExec("format_date", cw.utils.toISOTimestamp(selectedDate)); - cal.hide(); -} - -function whichElement(e) { - var targ; - if (!e) { - e = window.event; - } - if (e.target) { - targ = e.target; - } - else if (e.srcElement) { - targ = e.srcElement; - } - if (targ.nodeType == 3) // defeat Safari bug - { - targ = targ.parentNode; - } - return targ; -} - -function getPosition(element) { - var left; - var top; - var offset; - // TODO: deal scrollbar positions also! - left = element.offsetLeft; - top = element.offsetTop; - - if (element.offsetParent != null) { - offset = getPosition(element.offsetParent); - left = left + offset[0]; - top = top + offset[1]; - - } - return [left, top]; -} - -function getMouseInBlock(event) { - var elt = event.target; - var x = event.clientX; - var y = event.clientY; - var w = elt.clientWidth; - var h = elt.clientHeight; - var offset = getPosition(elt); - - x = 1.0 * (x - offset[0]) / w; - y = 1.0 * (y - offset[1]) / h; - return [x, y]; -} -function getHourFromMouse(event, hmin, hmax) { - var pos = getMouseInBlock(event); - var y = pos[1]; - return Math.floor((hmax - hmin) * y + hmin); -} - -function addCalendarItem(event, hmin, hmax, year, month, day, duration, baseurl) { - var hour = getHourFromMouse(event, hmin, hmax); - - if (0 <= hour && hour < 24) { - baseurl += "&start=" + year + "%2F" + month + "%2F" + day + "%20" + hour + ":00"; - baseurl += "&stop=" + year + "%2F" + month + "%2F" + day + "%20" + (hour + duration) + ":00"; - - stopPropagation(event); - window.location.assign(baseurl); - return false; - } - return true; -} - -function stopPropagation(event) { - event.cancelBubble = true; - if (event.stopPropagation) event.stopPropagation(); -}