diff -r ef903fff826d -r 7b9553a9db65 web/data/cubicweb.calendar.js --- a/web/data/cubicweb.calendar.js Thu Jun 03 10:17:44 2010 +0200 +++ b/web/data/cubicweb.calendar.js Thu Jun 03 14:51:42 2010 +0200 @@ -1,7 +1,7 @@ -/* +/** * This file contains Calendar utilities * :organization: Logilab - * :copyright: 2003-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. + * :copyright: 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. * :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr */ @@ -10,14 +10,14 @@ // 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__ : @@ -31,7 +31,7 @@ * * toggle(): * show (resp. hide) the calendar if it's hidden (resp. displayed) - * + * * displayNextMonth(): (resp. displayPreviousMonth()) * update the calendar to display next (resp. previous) month */ @@ -39,177 +39,219 @@ this.containerId = containerId; this.inputId = inputId; this.year = year; - this.month = month-1; // Javascript's counter starts at 0 for january + 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.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.todayprops = jQuery.extend({}, + this.cellprops, { + 'class': 'today' + }); this._rowdisplay = function(row) { - return TR(null, map(partial(TD, this.cellprops), row)); - } + var _td = function(elt) { + return TD(this.cellprops, elt); + }; + return TR(null, map(_td, row)); + }; this._makecell = function(cellinfo) { - return TD(cellinfo[0], cellinfo[1]); - } + return TD(cellinfo[0], cellinfo[1]); + }; - /* utility function (the only use for now is inside the calendar) */ - this._uppercaseFirst = function(s) { return s.charAt(0).toUpperCase(); } - - /* accepts the cells data and builds the corresponding TR nodes - * @param rows a list of list of couples (daynum, cssprops) + /** + * .. function:: Calendar._uppercaseFirst(s) + * + * utility function (the only use for now is inside the calendar) */ - this._domForRows = function(rows) { - var lines = [] - for (i=0; i>")))), - TBODY(null, - this._headdisplay(), - this._domForRows(rows)) - ); - return this.domtable; + 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(); - } - jqNode(this.containerId).empty().append(this.domtable); - // replaceChildNodes($(this.containerId), this.domtable); + 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.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.domtable = null; + if (this.month == 0) { + this.year--; + } + this.month = (this.month + 11) % 12; + this._updateDiv(); } - + this.show = function() { - if (!this.visible) { - container = jqNode(this.containerId); - if (!this.domtable) { - this._makecal(); - } - container.empty().append(this.domtable); - toggleVisibility(container); - this.visible = true; - } + if (!this.visible) { + 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; - } + 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(); - } + if (this.visible) { + this.hide(); + } + else { + this.show(); + } } // call hide() when the user explicitly sets the focus on the matching input - jqNode(inputId).bind('focus', {'self': this}, this.hide); // connect(inputId, 'onfocus', this, 'hide'); + cw.jqNode(inputId).bind('focus', { + 'self': this + }, + this.hide); // connect(inputId, 'onfocus', this, 'hide'); }; // 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; + 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(); - } + 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) { @@ -217,7 +259,9 @@ cal.displayNextMonth(); } -/* +/** + * .. function:: togglePreviousMonth(containerId) + * * ask for previous month to calendar displayed in `containerId` */ function togglePreviousMonth(containerId) { @@ -225,8 +269,9 @@ cal.displayPreviousMonth(); } - -/* +/** + * .. function:: dateSelected(cell, containerId) + * * Callback called when the user clicked on a cell in the popup calendar */ function dateSelected(cell, containerId) { @@ -236,86 +281,82 @@ // 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); - var xxx = remoteExec("format_date", toISOTimestamp(selectedDate)); + var xxx = remoteExec("format_date", cw.utils.toISOTimestamp(selectedDate)); input.value = xxx; cal.hide(); } -function whichElement(e) -{ -var targ; -if (!e) - { - var 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 whichElement(e) { + var targ; + if (!e) { + var 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; + 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]; - + if (element.offsetParent != null) { + offset = getPosition(element.offsetParent); + left = left + offset[0]; + top = top + offset[1]; + } - return [left, top]; + 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); + 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]; + 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); + 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); + 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"; - 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; + stopPropagation(event); + window.location.assign(baseurl); + return false; + } + return true; } function stopPropagation(event) { - event.cancelBubble = true; - if (event.stopPropagation) event.stopPropagation(); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); } - + CubicWeb.provide('calendar.js'); +