2007-03-29 20:05:23 +02:00
|
|
|
/* JavaScript for SOGoCalendar */
|
|
|
|
|
2006-08-31 01:13:18 +02:00
|
|
|
var listFilter = 'view_today';
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2006-10-12 23:05:32 +02:00
|
|
|
var listOfSelection = null;
|
2007-01-30 14:50:52 +01:00
|
|
|
var selectedCalendarCell;
|
2006-10-12 23:05:32 +02:00
|
|
|
|
2007-04-03 16:24:09 +02:00
|
|
|
var showCompletedTasks = 0;
|
2006-10-11 20:12:02 +02:00
|
|
|
|
2006-08-19 00:40:04 +02:00
|
|
|
var currentDay = '';
|
2007-06-29 23:53:56 +02:00
|
|
|
var currentView = "weekview";
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2006-09-07 17:50:03 +02:00
|
|
|
var cachedDateSelectors = new Array();
|
|
|
|
|
2006-10-14 01:37:27 +02:00
|
|
|
var contactSelectorAction = 'calendars-contacts';
|
|
|
|
|
2006-10-18 23:53:47 +02:00
|
|
|
var eventsToDelete = new Array();
|
2007-09-15 00:01:02 +02:00
|
|
|
var calendarsOfEventsToDelete = new Array();
|
2006-10-18 23:53:47 +02:00
|
|
|
|
2007-04-28 00:06:58 +02:00
|
|
|
var usersRightsWindowHeight = 250;
|
|
|
|
var usersRightsWindowWidth = 502;
|
|
|
|
|
2006-10-11 20:12:02 +02:00
|
|
|
function newEvent(sender, type) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var day = $(sender).readAttribute("day");
|
|
|
|
if (!day)
|
|
|
|
day = currentDay;
|
|
|
|
var hour = sender.readAttribute("hour");
|
|
|
|
var folder = getSelectedFolder();
|
|
|
|
var folderID = folder.readAttribute("id");
|
|
|
|
var roles = folder.readAttribute("roles");
|
|
|
|
if (roles) {
|
|
|
|
roles = roles.split(",")
|
|
|
|
if ($(roles).indexOf("PublicModifier") < 0)
|
|
|
|
folderID = "/personal";
|
|
|
|
}
|
|
|
|
var urlstr = ApplicationBaseURL + folderID + "/new" + type;
|
|
|
|
var params = new Array();
|
|
|
|
if (day)
|
|
|
|
params.push("day=" + day);
|
|
|
|
if (hour)
|
|
|
|
params.push("hm=" + hour);
|
|
|
|
if (params.length > 0)
|
|
|
|
urlstr += "?" + params.join("&");
|
|
|
|
window.open(urlstr, "", "width=490,height=470,resizable=0");
|
2007-05-22 16:38:54 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
return false; /* stop following the link */
|
2007-05-22 16:38:54 +02:00
|
|
|
}
|
2006-08-15 22:52:23 +02:00
|
|
|
|
2007-09-15 00:01:02 +02:00
|
|
|
function getSelectedFolder() {
|
|
|
|
var folder;
|
2007-11-12 22:20:18 +01:00
|
|
|
var list = $("calendarList");
|
|
|
|
var nodes = list.getSelectedRows();
|
2007-09-15 00:01:02 +02:00
|
|
|
if (nodes.length > 0)
|
2007-11-12 22:20:18 +01:00
|
|
|
folder = nodes[0];
|
2007-09-15 00:01:02 +02:00
|
|
|
else
|
2007-11-12 22:20:18 +01:00
|
|
|
folder = list.down("li");
|
2007-09-15 00:01:02 +02:00
|
|
|
|
|
|
|
return folder;
|
|
|
|
}
|
|
|
|
|
2007-05-22 16:38:54 +02:00
|
|
|
function onMenuNewEventClick(event) {
|
2008-01-24 22:36:51 +01:00
|
|
|
newEvent(this, "event");
|
2007-05-22 16:38:54 +02:00
|
|
|
}
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2007-05-22 16:38:54 +02:00
|
|
|
function onMenuNewTaskClick(event) {
|
2008-01-24 22:36:51 +01:00
|
|
|
newEvent(this, "task");
|
2006-08-22 00:36:33 +02:00
|
|
|
}
|
|
|
|
|
2007-09-15 00:01:02 +02:00
|
|
|
function _editEventId(id, calendar) {
|
|
|
|
var urlstr = ApplicationBaseURL + "/" + calendar + "/" + id + "/edit";
|
2007-06-06 23:09:39 +02:00
|
|
|
var targetname = "SOGo_edit_" + id;
|
|
|
|
var win = window.open(urlstr, "_blank",
|
2007-04-06 23:30:13 +02:00
|
|
|
"width=490,height=470,resizable=0");
|
2007-12-05 18:07:40 +01:00
|
|
|
if (win)
|
|
|
|
win.focus();
|
2006-08-22 00:36:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function editEvent() {
|
2006-10-12 23:05:32 +02:00
|
|
|
if (listOfSelection) {
|
2006-10-17 00:35:22 +02:00
|
|
|
var nodes = listOfSelection.getSelectedRows();
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2007-12-03 15:13:10 +01:00
|
|
|
if (nodes.length == 0) {
|
|
|
|
window.alert(labels["Please select an event or a task."]);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2006-10-12 23:05:32 +02:00
|
|
|
for (var i = 0; i < nodes.length; i++)
|
2006-10-27 17:03:48 +02:00
|
|
|
_editEventId(nodes[i].getAttribute("id"),
|
2007-09-15 00:01:02 +02:00
|
|
|
nodes[i].calendar);
|
2007-01-30 14:50:52 +01:00
|
|
|
} else if (selectedCalendarCell) {
|
2007-12-03 15:13:10 +01:00
|
|
|
_editEventId(selectedCalendarCell[0].cname,
|
|
|
|
selectedCalendarCell[0].calendar);
|
|
|
|
} else {
|
|
|
|
window.alert(labels["Please select an event or a task."]);
|
2006-10-12 23:05:32 +02:00
|
|
|
}
|
2006-08-25 22:49:34 +02:00
|
|
|
|
|
|
|
return false; /* stop following the link */
|
|
|
|
}
|
|
|
|
|
2006-10-18 23:53:47 +02:00
|
|
|
function _batchDeleteEvents() {
|
|
|
|
var events = eventsToDelete.shift();
|
2007-09-15 00:01:02 +02:00
|
|
|
var calendar = calendarsOfEventsToDelete.shift();
|
|
|
|
var urlstr = (ApplicationBaseURL + "/" + calendar
|
|
|
|
+ "/batchDelete?ids=" + events.join('/'));
|
2006-10-18 23:53:47 +02:00
|
|
|
document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr,
|
|
|
|
deleteEventCallback,
|
|
|
|
events);
|
2006-10-17 00:35:22 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function deleteEvent() {
|
2006-10-12 23:05:32 +02:00
|
|
|
if (listOfSelection) {
|
2006-10-17 00:35:22 +02:00
|
|
|
var nodes = listOfSelection.getSelectedRows();
|
2006-10-12 23:05:32 +02:00
|
|
|
|
|
|
|
if (nodes.length > 0) {
|
2006-11-06 18:44:07 +01:00
|
|
|
var label = "";
|
|
|
|
if (listOfSelection == $("tasksList"))
|
2007-09-15 00:01:02 +02:00
|
|
|
label = labels["taskDeleteConfirmation"];
|
2006-11-06 18:44:07 +01:00
|
|
|
else
|
2007-09-15 00:01:02 +02:00
|
|
|
label = labels["eventDeleteConfirmation"];
|
2006-11-06 18:44:07 +01:00
|
|
|
|
|
|
|
if (confirm(label)) {
|
2006-10-18 23:53:47 +02:00
|
|
|
if (document.deleteEventAjaxRequest) {
|
|
|
|
document.deleteEventAjaxRequest.aborted = true;
|
|
|
|
document.deleteEventAjaxRequest.abort();
|
|
|
|
}
|
2006-10-17 00:35:22 +02:00
|
|
|
var sortedNodes = new Array();
|
2007-09-15 00:01:02 +02:00
|
|
|
var calendars = new Array();
|
2006-10-17 00:35:22 +02:00
|
|
|
|
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
2007-09-15 00:01:02 +02:00
|
|
|
var calendar = nodes[i].calendar;
|
|
|
|
if (!sortedNodes[calendar]) {
|
|
|
|
sortedNodes[calendar] = new Array();
|
|
|
|
calendars.push(calendar);
|
2006-10-18 23:53:47 +02:00
|
|
|
}
|
2007-09-15 00:01:02 +02:00
|
|
|
sortedNodes[calendar].push(nodes[i].cname);
|
2006-10-17 00:35:22 +02:00
|
|
|
}
|
2007-09-15 00:01:02 +02:00
|
|
|
for (var i = 0; i < calendars.length; i++) {
|
|
|
|
calendarsOfEventsToDelete.push(calendars[i]);
|
|
|
|
eventsToDelete.push(sortedNodes[calendars[i]]);
|
2006-10-18 23:53:47 +02:00
|
|
|
}
|
|
|
|
_batchDeleteEvents();
|
2006-10-12 23:05:32 +02:00
|
|
|
}
|
2007-12-03 15:13:10 +01:00
|
|
|
} else {
|
|
|
|
window.alert(labels["Please select an event or a task."]);
|
2006-08-25 22:49:34 +02:00
|
|
|
}
|
2006-08-22 00:36:33 +02:00
|
|
|
}
|
2007-01-30 14:50:52 +01:00
|
|
|
else if (selectedCalendarCell) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var label = labels["eventDeleteConfirmation"];
|
|
|
|
if (confirm(label)) {
|
|
|
|
if (document.deleteEventAjaxRequest) {
|
|
|
|
document.deleteEventAjaxRequest.aborted = true;
|
|
|
|
document.deleteEventAjaxRequest.abort();
|
|
|
|
}
|
|
|
|
eventsToDelete.push([selectedCalendarCell[0].cname]);
|
|
|
|
calendarsOfEventsToDelete.push(selectedCalendarCell[0].calendar);
|
|
|
|
_batchDeleteEvents();
|
|
|
|
}
|
2007-01-30 14:50:52 +01:00
|
|
|
}
|
2006-11-13 23:31:41 +01:00
|
|
|
else
|
2007-12-03 15:13:10 +01:00
|
|
|
window.alert(labels["Please select an event or a task."]);
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2006-08-25 22:49:34 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2006-11-07 19:14:29 +01:00
|
|
|
function modifyEvent(sender, modification) {
|
|
|
|
var currentLocation = '' + window.location;
|
|
|
|
var arr = currentLocation.split("/");
|
|
|
|
arr[arr.length-1] = modification;
|
2006-11-15 01:10:53 +01:00
|
|
|
|
|
|
|
document.modifyEventAjaxRequest = triggerAjaxRequest(arr.join("/"),
|
|
|
|
modifyEventCallback,
|
|
|
|
modification);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2007-01-04 23:30:48 +01:00
|
|
|
function closeInvitationWindow() {
|
|
|
|
var closeDiv = document.createElement("div");
|
2007-10-04 19:26:21 +02:00
|
|
|
document.body.appendChild(closeDiv);
|
2007-01-04 23:30:48 +01:00
|
|
|
closeDiv.addClassName("javascriptPopupBackground");
|
2007-10-04 19:26:21 +02:00
|
|
|
|
2007-01-04 23:30:48 +01:00
|
|
|
var closePseudoWin = document.createElement("div");
|
2007-10-04 19:26:21 +02:00
|
|
|
document.body.appendChild(closePseudoWin);
|
2007-06-05 22:29:59 +02:00
|
|
|
closePseudoWin.addClassName("javascriptMessagePseudoTopWindow");
|
2007-01-04 23:30:48 +01:00
|
|
|
closePseudoWin.style.top = "0px;";
|
|
|
|
closePseudoWin.style.left = "0px;";
|
|
|
|
closePseudoWin.style.right = "0px;";
|
2007-09-15 00:01:02 +02:00
|
|
|
closePseudoWin.appendChild(document.createTextNode(labels["closeThisWindowMessage"]));
|
2007-10-04 19:26:21 +02:00
|
|
|
|
|
|
|
var calLink = document.createElement("a");
|
|
|
|
closePseudoWin.appendChild(calLink);
|
|
|
|
calLink.href = ApplicationBaseURL;
|
|
|
|
calLink.appendChild(document.createTextNode(labels["Calendar"].toLowerCase()));
|
2007-01-04 23:30:48 +01:00
|
|
|
}
|
|
|
|
|
2006-11-15 01:10:53 +01:00
|
|
|
function modifyEventCallback(http) {
|
2007-08-24 00:10:01 +02:00
|
|
|
if (http.readyState == 4) {
|
|
|
|
if (http.status == 200) {
|
|
|
|
var mailInvitation = queryParameters["mail-invitation"];
|
|
|
|
if (mailInvitation && mailInvitation.toLowerCase() == "yes")
|
|
|
|
closeInvitationWindow();
|
2007-01-30 15:02:27 +01:00
|
|
|
else {
|
2007-08-24 00:10:01 +02:00
|
|
|
window.opener.setTimeout("refreshEventsAndDisplay();", 100);
|
|
|
|
window.setTimeout("window.close();", 100);
|
2007-01-30 15:02:27 +01:00
|
|
|
}
|
2007-08-24 00:10:01 +02:00
|
|
|
}
|
|
|
|
else {
|
2008-01-24 22:36:51 +01:00
|
|
|
// log("showing alert...");
|
2007-08-24 00:10:01 +02:00
|
|
|
window.alert(labels["eventPartStatModificationError"]);
|
|
|
|
}
|
|
|
|
document.modifyEventAjaxRequest = null;
|
|
|
|
}
|
2006-11-07 19:14:29 +01:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function deleteEventCallback(http) {
|
2007-09-15 01:14:51 +02:00
|
|
|
if (http.readyState == 4) {
|
|
|
|
if (isHttpStatus204(http.status)) {
|
2008-01-16 15:57:41 +01:00
|
|
|
var isTask = false;
|
2007-09-15 01:14:51 +02:00
|
|
|
var nodes = http.callbackData;
|
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
|
|
var node = $(nodes[i]);
|
2008-01-16 15:57:41 +01:00
|
|
|
if (node) {
|
|
|
|
isTask = isTask || (node.parentNode.id == 'tasksList');
|
2007-09-15 01:14:51 +02:00
|
|
|
node.parentNode.removeChild(node);
|
2008-01-16 15:57:41 +01:00
|
|
|
}
|
2007-09-15 01:14:51 +02:00
|
|
|
}
|
|
|
|
if (eventsToDelete.length)
|
|
|
|
_batchDeleteEvents();
|
|
|
|
else {
|
|
|
|
document.deleteEventAjaxRequest = null;
|
2008-01-16 15:57:41 +01:00
|
|
|
if (isTask)
|
|
|
|
refreshTasks();
|
|
|
|
else {
|
|
|
|
refreshEvents();
|
|
|
|
changeCalendarDisplay();
|
|
|
|
}
|
2007-09-15 01:14:51 +02:00
|
|
|
}
|
2006-10-18 23:53:47 +02:00
|
|
|
}
|
2007-09-15 01:14:51 +02:00
|
|
|
else
|
|
|
|
log ("deleteEventCallback Ajax error");
|
2006-08-25 22:49:34 +02:00
|
|
|
}
|
2006-08-14 22:32:30 +02:00
|
|
|
}
|
|
|
|
|
2007-06-11 23:23:48 +02:00
|
|
|
function editDoubleClickedEvent(event) {
|
2007-09-15 00:01:02 +02:00
|
|
|
_editEventId(this.cname, this.calendar);
|
2007-06-11 23:23:48 +02:00
|
|
|
|
2007-06-12 15:40:40 +02:00
|
|
|
preventDefault(event);
|
2007-06-11 23:23:48 +02:00
|
|
|
event.cancelBubble = true;
|
2006-08-22 00:36:33 +02:00
|
|
|
}
|
|
|
|
|
2006-08-25 22:49:34 +02:00
|
|
|
function onSelectAll() {
|
2007-06-08 01:23:07 +02:00
|
|
|
var list = $("eventsList");
|
|
|
|
list.selectRowsMatchingClass("eventRow");
|
2006-08-25 22:49:34 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function onDaySelect(node) {
|
2007-06-12 17:43:51 +02:00
|
|
|
var day = node.getAttribute('day');
|
2006-11-15 22:54:47 +01:00
|
|
|
var needRefresh = (listFilter == 'view_selectedday'
|
|
|
|
&& day != currentDay);
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2007-06-08 23:31:25 +02:00
|
|
|
var td = $(node).getParentWithTagName("td");
|
2007-06-12 17:43:51 +02:00
|
|
|
var table = $(td).getParentWithTagName("table");
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
// log ("table.selected: " + table.selected);
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
if (document.selectedDate)
|
2006-12-20 23:55:54 +01:00
|
|
|
document.selectedDate.deselect();
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2008-02-05 21:00:52 +01:00
|
|
|
td.selectElement();
|
2006-08-19 00:40:04 +02:00
|
|
|
document.selectedDate = td;
|
|
|
|
|
2006-10-11 20:12:02 +02:00
|
|
|
changeCalendarDisplay( { "day": day } );
|
2008-01-08 22:00:10 +01:00
|
|
|
currentDay = day;
|
2006-11-15 22:54:47 +01:00
|
|
|
if (needRefresh)
|
2007-06-08 01:23:07 +02:00
|
|
|
refreshEvents();
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2007-07-05 21:19:17 +02:00
|
|
|
function onDateSelectorGotoMonth(event) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var day = this.getAttribute("date");
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
changeDateSelectorDisplay(day, true);
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
Event.stop(event);
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function onCalendarGotoDay(node) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var day = node.getAttribute("date");
|
|
|
|
var needRefresh = (listFilter == 'view_selectedday'
|
2008-01-16 16:18:41 +01:00
|
|
|
&& day != currentDay);
|
2008-02-08 22:46:05 +01:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
changeDateSelectorDisplay(day);
|
|
|
|
changeCalendarDisplay( { "day": day } );
|
|
|
|
if (needRefresh)
|
|
|
|
refreshEvents();
|
2008-02-08 22:46:05 +01:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
return false;
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function gotoToday() {
|
2006-09-07 00:27:46 +02:00
|
|
|
changeDateSelectorDisplay('');
|
2006-08-24 20:48:33 +02:00
|
|
|
changeCalendarDisplay();
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function setDateSelectorContent(content) {
|
2006-08-24 20:48:33 +02:00
|
|
|
var div = $("dateSelectorView");
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2006-09-07 17:50:03 +02:00
|
|
|
div.innerHTML = content;
|
|
|
|
if (currentDay.length > 0)
|
|
|
|
restoreCurrentDaySelection(div);
|
2007-07-05 21:19:17 +02:00
|
|
|
|
|
|
|
initDateSelectorEvents();
|
2006-09-07 17:50:03 +02:00
|
|
|
}
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function dateSelectorCallback(http) {
|
2006-08-19 00:40:04 +02:00
|
|
|
if (http.readyState == 4
|
|
|
|
&& http.status == 200) {
|
2008-01-24 22:36:51 +01:00
|
|
|
document.dateSelectorAjaxRequest = null;
|
|
|
|
var content = http.responseText;
|
|
|
|
setDateSelectorContent(content);
|
|
|
|
cachedDateSelectors[http.callbackData] = content;
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
else
|
2007-06-06 23:09:39 +02:00
|
|
|
log ("dateSelectorCallback Ajax error");
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function eventsListCallback(http) {
|
2006-08-19 00:40:04 +02:00
|
|
|
if (http.readyState == 4
|
|
|
|
&& http.status == 200) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var div = $("eventsListView");
|
2007-06-08 01:23:07 +02:00
|
|
|
document.eventsListAjaxRequest = null;
|
2007-09-24 23:26:23 +02:00
|
|
|
var table = $("eventsList");
|
2007-11-05 15:37:26 +01:00
|
|
|
lastClickedRow = -1; // from generic.js
|
2007-06-08 01:23:07 +02:00
|
|
|
|
2007-11-02 20:02:24 +01:00
|
|
|
if (http.responseText.length > 0) {
|
|
|
|
var data = http.responseText.evalJSON(true);
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
var row = document.createElement("tr");
|
|
|
|
table.tBodies[0].appendChild(row);
|
|
|
|
$(row).addClassName("eventRow");
|
|
|
|
row.setAttribute("id", escape(data[i][0]));
|
|
|
|
row.cname = escape(data[i][0]);
|
|
|
|
row.calendar = data[i][1];
|
|
|
|
|
|
|
|
var startDate = new Date();
|
|
|
|
startDate.setTime(data[i][4] * 1000);
|
|
|
|
row.day = startDate.getDayString();
|
|
|
|
row.hour = startDate.getHourString();
|
2008-04-15 22:12:51 +02:00
|
|
|
row.observe("mousedown", onRowClick);
|
|
|
|
row.observe("selectstart", listRowMouseDownHandler);
|
2008-04-15 22:47:18 +02:00
|
|
|
row.observe("dblclick", editDoubleClickedEvent);
|
|
|
|
row.observe("contextmenu", onEventContextMenu);
|
2007-06-08 01:23:07 +02:00
|
|
|
|
2008-05-06 00:47:38 +02:00
|
|
|
var td = $(document.createElement("td"));
|
2007-11-02 20:02:24 +01:00
|
|
|
row.appendChild(td);
|
2008-04-15 22:12:51 +02:00
|
|
|
td.observe("mousedown", listRowMouseDownHandler, true);
|
2007-11-02 20:02:24 +01:00
|
|
|
td.appendChild(document.createTextNode(data[i][3]));
|
|
|
|
|
2008-05-06 00:47:38 +02:00
|
|
|
td = $(document.createElement("td"));
|
2007-11-02 20:02:24 +01:00
|
|
|
row.appendChild(td);
|
2008-04-15 22:12:51 +02:00
|
|
|
td.observe("mousedown", listRowMouseDownHandler, true);
|
2007-12-13 23:36:26 +01:00
|
|
|
td.appendChild(document.createTextNode(data[i][10]));
|
2007-11-02 20:02:24 +01:00
|
|
|
|
2008-05-06 00:47:38 +02:00
|
|
|
td = $(document.createElement("td"));
|
2007-11-02 20:02:24 +01:00
|
|
|
row.appendChild(td);
|
2008-04-15 22:12:51 +02:00
|
|
|
td.observe("mousedown", listRowMouseDownHandler, true);
|
2007-12-13 23:36:26 +01:00
|
|
|
td.appendChild(document.createTextNode(data[i][11]));
|
2007-11-02 20:02:24 +01:00
|
|
|
|
2008-05-06 00:47:38 +02:00
|
|
|
td = $(document.createElement("td"));
|
2007-11-02 20:02:24 +01:00
|
|
|
row.appendChild(td);
|
2008-04-15 22:12:51 +02:00
|
|
|
td.observe("mousedown", listRowMouseDownHandler, true);
|
2007-11-02 20:02:24 +01:00
|
|
|
td.appendChild(document.createTextNode(data[i][6]));
|
|
|
|
}
|
2007-12-06 18:29:32 +01:00
|
|
|
|
|
|
|
if (sorting["attribute"] && sorting["attribute"].length > 0) {
|
|
|
|
var sortHeader = $(sorting["attribute"] + "Header");
|
|
|
|
|
|
|
|
if (sortHeader) {
|
2008-03-25 20:59:13 +01:00
|
|
|
var sortImages = $(table.tHead).select(".sortImage");
|
2007-12-06 18:29:32 +01:00
|
|
|
$(sortImages).each(function(item) {
|
|
|
|
item.remove();
|
|
|
|
});
|
|
|
|
|
|
|
|
var sortImage = createElement("img", "messageSortImage", "sortImage");
|
|
|
|
sortHeader.insertBefore(sortImage, sortHeader.firstChild);
|
|
|
|
if (sorting["ascending"])
|
|
|
|
sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
|
|
|
|
else
|
|
|
|
sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
|
|
|
|
}
|
|
|
|
}
|
2007-06-08 01:23:07 +02:00
|
|
|
}
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
else
|
2007-06-08 01:23:07 +02:00
|
|
|
log ("eventsListCallback Ajax error");
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function tasksListCallback(http) {
|
2006-10-11 20:12:02 +02:00
|
|
|
var div = $("tasksListView");
|
|
|
|
|
|
|
|
if (http.readyState == 4
|
|
|
|
&& http.status == 200) {
|
|
|
|
document.tasksListAjaxRequest = null;
|
2006-11-13 23:31:41 +01:00
|
|
|
var list = $("tasksList");
|
2007-11-02 20:02:24 +01:00
|
|
|
|
|
|
|
if (http.responseText.length > 0) {
|
|
|
|
var data = http.responseText.evalJSON(true);
|
|
|
|
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
2008-05-06 00:47:38 +02:00
|
|
|
var listItem = $(document.createElement("li"));
|
2007-11-02 20:02:24 +01:00
|
|
|
list.appendChild(listItem);
|
2008-04-24 17:07:58 +02:00
|
|
|
listItem.observe("mousedown", listRowMouseDownHandler);
|
|
|
|
listItem.observe("click", onRowClick);
|
2008-04-24 22:38:14 +02:00
|
|
|
listItem.observe("dblclick", editDoubleClickedEvent);
|
2007-11-02 20:02:24 +01:00
|
|
|
listItem.setAttribute("id", data[i][0]);
|
2008-05-06 00:47:38 +02:00
|
|
|
listItem.addClassName(data[i][5]);
|
|
|
|
listItem.addClassName(data[i][6]);
|
2007-11-02 20:02:24 +01:00
|
|
|
listItem.calendar = data[i][1];
|
2008-05-06 00:47:38 +02:00
|
|
|
listItem.addClassName("calendarFolder" + data[i][1]);
|
2007-11-02 20:02:24 +01:00
|
|
|
listItem.cname = escape(data[i][0]);
|
2008-05-06 00:47:38 +02:00
|
|
|
var input = $(document.createElement("input"));
|
2007-11-02 20:02:24 +01:00
|
|
|
input.setAttribute("type", "checkbox");
|
|
|
|
listItem.appendChild(input);
|
2008-04-24 22:38:14 +02:00
|
|
|
input.observe("click", updateTaskStatus, true);
|
2007-11-02 20:02:24 +01:00
|
|
|
input.setAttribute("value", "1");
|
|
|
|
if (data[i][2] == 1)
|
|
|
|
input.setAttribute("checked", "checked");
|
|
|
|
$(input).addClassName("checkBox");
|
2008-04-15 21:48:48 +02:00
|
|
|
|
2007-11-02 20:02:24 +01:00
|
|
|
listItem.appendChild(document.createTextNode(data[i][3]));
|
|
|
|
}
|
2007-06-06 23:09:39 +02:00
|
|
|
|
2007-11-02 20:02:24 +01:00
|
|
|
list.scrollTop = list.previousScroll;
|
2007-06-06 23:09:39 +02:00
|
|
|
|
2007-11-02 20:02:24 +01:00
|
|
|
if (http.callbackData) {
|
|
|
|
var selectedNodesId = http.callbackData;
|
|
|
|
for (var i = 0; i < selectedNodesId.length; i++) {
|
|
|
|
// log(selectedNodesId[i] + " (" + i + ") is selected");
|
2008-02-05 21:00:52 +01:00
|
|
|
$(selectedNodesId[i]).selectElement();
|
2007-11-02 20:02:24 +01:00
|
|
|
}
|
2007-06-06 23:09:39 +02:00
|
|
|
}
|
2007-11-02 20:02:24 +01:00
|
|
|
else
|
|
|
|
log ("tasksListCallback: no data");
|
2006-10-11 20:12:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2007-06-06 23:09:39 +02:00
|
|
|
log ("tasksListCallback Ajax error");
|
2006-10-11 20:12:02 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function restoreCurrentDaySelection(div) {
|
2007-07-31 23:14:14 +02:00
|
|
|
var elements = $(div).getElementsByTagName("a");
|
2006-08-19 00:40:04 +02:00
|
|
|
var day = null;
|
2006-11-03 00:17:55 +01:00
|
|
|
var i = 9;
|
2006-08-19 00:40:04 +02:00
|
|
|
while (!day && i < elements.length)
|
|
|
|
{
|
2007-06-11 23:23:48 +02:00
|
|
|
day = elements[i].day;
|
2006-08-19 00:40:04 +02:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (day
|
2006-11-06 18:44:07 +01:00
|
|
|
&& day.substr(0, 6) == currentDay.substr(0, 6)) {
|
2008-01-24 22:36:51 +01:00
|
|
|
for (i = 0; i < elements.length; i++) {
|
|
|
|
day = elements[i].day;
|
|
|
|
if (day && day == currentDay) {
|
|
|
|
var td = $(elements[i]).getParentWithTagName("td");
|
|
|
|
if (document.selectedDate)
|
|
|
|
document.selectedDate.deselect();
|
2008-02-05 21:00:52 +01:00
|
|
|
$(td).selectElement();
|
2008-01-24 22:36:51 +01:00
|
|
|
document.selectedDate = td;
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
}
|
2008-01-24 22:36:51 +01:00
|
|
|
}
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function changeDateSelectorDisplay(day, keepCurrentDay) {
|
2007-11-16 20:38:49 +01:00
|
|
|
var url = ApplicationBaseURL + "dateselector";
|
2006-08-19 00:40:04 +02:00
|
|
|
if (day)
|
|
|
|
url += "?day=" + day;
|
|
|
|
|
2006-09-07 00:27:46 +02:00
|
|
|
if (day != currentDay) {
|
|
|
|
if (!keepCurrentDay)
|
|
|
|
currentDay = day;
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2006-09-07 17:50:03 +02:00
|
|
|
var month = day.substr(0, 6);
|
|
|
|
if (cachedDateSelectors[month]) {
|
2008-01-24 22:36:51 +01:00
|
|
|
// log ("restoring cached selector for month: " + month);
|
2006-09-07 17:50:03 +02:00
|
|
|
setDateSelectorContent(cachedDateSelectors[month]);
|
|
|
|
}
|
|
|
|
else {
|
2008-01-24 22:36:51 +01:00
|
|
|
// log ("loading selector for month: " + month);
|
2006-09-07 17:50:03 +02:00
|
|
|
if (document.dateSelectorAjaxRequest) {
|
|
|
|
document.dateSelectorAjaxRequest.aborted = true;
|
|
|
|
document.dateSelectorAjaxRequest.abort();
|
|
|
|
}
|
|
|
|
document.dateSelectorAjaxRequest
|
|
|
|
= triggerAjaxRequest(url,
|
|
|
|
dateSelectorCallback,
|
|
|
|
month);
|
2006-09-07 00:27:46 +02:00
|
|
|
}
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-07 18:37:58 +01:00
|
|
|
function changeCalendarDisplay(data, newView) {
|
2008-02-08 22:46:05 +01:00
|
|
|
newView = ((newView) ? newView : currentView);
|
|
|
|
var url = ApplicationBaseURL + newView;
|
2006-10-12 18:46:24 +02:00
|
|
|
var day = null;
|
2007-11-07 18:37:58 +01:00
|
|
|
var scrollEvent = null;
|
2007-11-19 18:09:14 +01:00
|
|
|
|
2007-11-07 18:37:58 +01:00
|
|
|
if (data) {
|
|
|
|
day = data['day'];
|
|
|
|
scrollEvent = data['scrollEvent'];
|
2006-10-12 18:46:24 +02:00
|
|
|
}
|
2006-10-11 20:12:02 +02:00
|
|
|
|
2006-08-24 20:48:33 +02:00
|
|
|
if (!day)
|
2006-09-07 00:27:46 +02:00
|
|
|
day = currentDay;
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2007-11-16 20:38:49 +01:00
|
|
|
if (day) {
|
2008-02-08 22:46:05 +01:00
|
|
|
if (data && newView != "monthview") {
|
2007-11-19 18:09:14 +01:00
|
|
|
var divs = $$('div.day[day='+day+']');
|
|
|
|
if (divs.length) {
|
|
|
|
// Don't reload the view if the event is present in current view
|
2008-02-08 22:46:05 +01:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
// Deselect previous day
|
|
|
|
var selectedDivs = $$('div.day.selectedDay');
|
|
|
|
selectedDivs.each(function(div) {
|
|
|
|
div.removeClassName('selectedDay');
|
|
|
|
});
|
2008-02-08 22:46:05 +01:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
// Select new day
|
|
|
|
divs.each(function(div) {
|
|
|
|
div.addClassName('selectedDay');
|
|
|
|
});
|
|
|
|
|
|
|
|
// Deselect day in date selector
|
|
|
|
if (document.selectedDate)
|
|
|
|
document.selectedDate.deselect();
|
|
|
|
|
|
|
|
// Select day in date selector
|
|
|
|
var selectedLink = $$('table#dateSelectorTable a[day='+day+']');
|
|
|
|
if (selectedLink.length > 0) {
|
|
|
|
selectedCell = selectedLink[0].up(1);
|
2008-02-05 21:00:52 +01:00
|
|
|
selectedCell.selectElement();
|
2007-11-19 18:09:14 +01:00
|
|
|
document.selectedDate = selectedCell;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scroll to event
|
|
|
|
scrollDayView(scrollEvent);
|
2007-11-16 20:38:49 +01:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
return false;
|
2007-11-16 20:38:49 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
url += "?day=" + day;
|
|
|
|
}
|
2008-01-24 22:36:51 +01:00
|
|
|
// if (newView)
|
|
|
|
// log ("switching to view: " + newView);
|
|
|
|
// log ("changeCalendarDisplay: " + url);
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
selectedCalendarCell = null;
|
|
|
|
|
2006-08-19 00:40:04 +02:00
|
|
|
if (document.dayDisplayAjaxRequest) {
|
2008-01-24 22:36:51 +01:00
|
|
|
// log ("aborting day ajaxrq");
|
2006-08-19 00:40:04 +02:00
|
|
|
document.dayDisplayAjaxRequest.aborted = true;
|
|
|
|
document.dayDisplayAjaxRequest.abort();
|
|
|
|
}
|
2007-06-11 23:23:48 +02:00
|
|
|
document.dayDisplayAjaxRequest
|
2008-01-24 22:36:51 +01:00
|
|
|
= triggerAjaxRequest(url, calendarDisplayCallback,
|
|
|
|
{ "view": newView,
|
|
|
|
"day": day,
|
|
|
|
"scrollEvent": scrollEvent });
|
2006-08-24 20:48:33 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function _ensureView(view) {
|
|
|
|
if (currentView != view)
|
|
|
|
changeCalendarDisplay(null, view);
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function onDayOverview() {
|
2006-08-24 20:48:33 +02:00
|
|
|
return _ensureView("dayview");
|
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function onMulticolumnDayOverview() {
|
2007-02-13 23:01:02 +01:00
|
|
|
return _ensureView("multicolumndayview");
|
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function onWeekOverview() {
|
2006-08-24 20:48:33 +02:00
|
|
|
return _ensureView("weekview");
|
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function onMonthOverview() {
|
2006-08-24 20:48:33 +02:00
|
|
|
return _ensureView("monthview");
|
|
|
|
}
|
|
|
|
|
2007-11-07 18:37:58 +01:00
|
|
|
function scrollDayView(scrollEvent) {
|
2007-11-19 18:09:14 +01:00
|
|
|
var divs;
|
2007-11-16 20:38:49 +01:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
// Select event in calendar view
|
|
|
|
if (scrollEvent) {
|
|
|
|
divs = $$("div#calendarContent div." + eventClass(scrollEvent));
|
|
|
|
selectCalendarEvent(divs[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Don't scroll if in month view
|
2007-11-16 20:38:49 +01:00
|
|
|
if (currentView == "monthview")
|
|
|
|
return;
|
|
|
|
|
2007-11-07 18:37:58 +01:00
|
|
|
var offset = 0;
|
2006-11-15 01:10:53 +01:00
|
|
|
var daysView = $("daysView");
|
2007-06-11 23:23:48 +02:00
|
|
|
var hours =
|
2007-11-07 18:37:58 +01:00
|
|
|
$(daysView.childNodesWithTag("div")[0]).childNodesWithTag("div");
|
|
|
|
|
2007-11-16 20:38:49 +01:00
|
|
|
if (scrollEvent) {
|
2007-11-19 18:09:14 +01:00
|
|
|
divs = $$("div#calendarContent div." + eventClass(scrollEvent));
|
2007-11-16 20:38:49 +01:00
|
|
|
var classes = $w(divs[0].className);
|
|
|
|
for (var i = 0; i < classes.length; i++) {
|
2007-11-07 18:37:58 +01:00
|
|
|
if (classes[i].startsWith("starts")) {
|
2007-11-08 05:12:26 +01:00
|
|
|
var starts = Math.floor(parseInt(classes[i].substr(6)) / 4);
|
2007-11-07 18:37:58 +01:00
|
|
|
offset = hours[starts].offsetTop;
|
|
|
|
}
|
2007-11-16 20:38:49 +01:00
|
|
|
}
|
2007-11-07 18:37:58 +01:00
|
|
|
}
|
2007-11-08 17:08:36 +01:00
|
|
|
else
|
2007-11-19 18:17:30 +01:00
|
|
|
// Scroll to 8 AM
|
2007-11-07 18:37:58 +01:00
|
|
|
offset = hours[8].offsetTop;
|
|
|
|
|
|
|
|
daysView.scrollTop = offset - 5;
|
2006-10-04 00:59:07 +02:00
|
|
|
}
|
|
|
|
|
2006-11-15 01:53:59 +01:00
|
|
|
function onClickableCellsDblClick(event) {
|
|
|
|
newEvent(this, 'event');
|
2006-11-15 18:59:47 +01:00
|
|
|
|
|
|
|
event.cancelBubble = true;
|
|
|
|
event.returnValue = false;
|
2006-11-15 01:53:59 +01:00
|
|
|
}
|
|
|
|
|
2007-11-16 20:38:49 +01:00
|
|
|
function refreshCalendarEvents(scrollEvent) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var todayDate = new Date();
|
|
|
|
var sd;
|
|
|
|
var ed;
|
|
|
|
if (currentView == "dayview") {
|
|
|
|
if (currentDay)
|
|
|
|
sd = currentDay;
|
|
|
|
else
|
|
|
|
sd = todayDate.getDayString();
|
|
|
|
ed = sd;
|
|
|
|
}
|
|
|
|
else if (currentView == "weekview") {
|
|
|
|
var startDate;
|
|
|
|
if (currentDay)
|
|
|
|
startDate = currentDay.asDate();
|
|
|
|
else
|
|
|
|
startDate = todayDate;
|
|
|
|
startDate = startDate.beginOfWeek();
|
|
|
|
sd = startDate.getDayString();
|
|
|
|
var endDate = new Date();
|
|
|
|
endDate.setTime(startDate.getTime());
|
|
|
|
endDate.addDays(6);
|
|
|
|
ed = endDate.getDayString();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var monthDate;
|
|
|
|
if (currentDay)
|
|
|
|
monthDate = currentDay.asDate();
|
|
|
|
else
|
|
|
|
monthDate = todayDate;
|
|
|
|
monthDate.setDate(1);
|
|
|
|
sd = monthDate.beginOfWeek().getDayString();
|
|
|
|
|
|
|
|
var lastMonthDate = new Date();
|
|
|
|
lastMonthDate.setTime(monthDate.getTime());
|
|
|
|
lastMonthDate.setMonth(monthDate.getMonth() + 1);
|
|
|
|
lastMonthDate.addDays(-1);
|
|
|
|
ed = lastMonthDate.endOfWeek().getDayString();
|
|
|
|
}
|
|
|
|
if (document.refreshCalendarEventsAjaxRequest) {
|
|
|
|
document.refreshCalendarEventsAjaxRequest.aborted = true;
|
|
|
|
document.refreshCalendarEventsAjaxRequest.abort();
|
|
|
|
}
|
|
|
|
var url = ApplicationBaseURL + "eventslist?sd=" + sd + "&ed=" + ed;
|
|
|
|
document.refreshCalendarEventsAjaxRequest
|
|
|
|
= triggerAjaxRequest(url, refreshCalendarEventsCallback,
|
|
|
|
{"startDate": sd, "endDate": ed,
|
|
|
|
"scrollEvent": scrollEvent});
|
2007-06-11 23:23:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function refreshCalendarEventsCallback(http) {
|
2008-04-15 22:12:51 +02:00
|
|
|
if (http.readyState == 4
|
|
|
|
&& http.status == 200) {
|
|
|
|
if (http.responseText.length > 0) {
|
|
|
|
var data = http.responseText.evalJSON(true);
|
|
|
|
// log("refresh calendar events: " + data.length);
|
|
|
|
var dateTuples = new Array();
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
var dates = drawCalendarEvent(data[i],
|
|
|
|
http.callbackData["startDate"],
|
|
|
|
http.callbackData["endDate"]);
|
|
|
|
dates.each(function(tuple) {
|
|
|
|
if (tuple[3] == 0) tuple[3] = 96;
|
|
|
|
dateTuples.push(tuple);
|
|
|
|
});
|
|
|
|
}
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var c = {
|
|
|
|
div: 0,
|
|
|
|
day: 1,
|
|
|
|
start: 2,
|
|
|
|
end: 3,
|
|
|
|
siblingsCount: 4,
|
|
|
|
siblingsPosition: 5,
|
|
|
|
siblingsMaxCount: 6
|
|
|
|
};
|
|
|
|
for (var i = 0; i < dateTuples.length; i++) {
|
|
|
|
if (dateTuples[i].length < 6) {
|
|
|
|
dateTuples[i][c.siblingsCount] = 1;
|
|
|
|
dateTuples[i][c.siblingsPosition] = 0;
|
|
|
|
}
|
|
|
|
for (var j = 0; j < dateTuples.length; j++) {
|
|
|
|
if (j == i) continue;
|
|
|
|
if (dateTuples[i][c.day] == dateTuples[j][c.day]) {
|
|
|
|
// Same day
|
|
|
|
if (dateTuples[j][c.start] > dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.start] < dateTuples[i][c.end] ||
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
dateTuples[j][c.start] == dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.end] < dateTuples[i][c.end] ||
|
|
|
|
|
|
|
|
dateTuples[j][c.start] == dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.end] == dateTuples[i][c.end] &&
|
|
|
|
i < j) {
|
|
|
|
// Same period
|
|
|
|
if (dateTuples[j].length < 6) {
|
|
|
|
dateTuples[j][c.siblingsCount] = 2;
|
|
|
|
dateTuples[j][c.siblingsPosition] = dateTuples[i][c.siblingsPosition] + 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
dateTuples[j][c.siblingsCount]++;
|
|
|
|
dateTuples[j][c.siblingsPosition]++;
|
|
|
|
}
|
|
|
|
dateTuples[i][c.siblingsCount]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
// Second loop; adjust total number of siblings for each event
|
|
|
|
for (var i = 0; i < dateTuples.length; i++) {
|
|
|
|
//log (i + " " + dateTuples[i].inspect());
|
|
|
|
var maxCount = 0;
|
|
|
|
for (var j = 0; j < dateTuples.length; j++) {
|
|
|
|
if (j == i) continue;
|
|
|
|
if (dateTuples[i][c.day] == dateTuples[j][c.day]) {
|
|
|
|
// Same day
|
|
|
|
if (dateTuples[j][c.start] > dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.start] < dateTuples[i][c.end] ||
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
dateTuples[j][c.start] == dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.end] < dateTuples[i][c.end] ||
|
|
|
|
|
|
|
|
dateTuples[j][c.start] == dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.end] == dateTuples[i][c.end] &&
|
|
|
|
i < j) {
|
|
|
|
// Same period
|
|
|
|
if (dateTuples[j][c.siblingsCount] > maxCount)
|
|
|
|
maxCount = dateTuples[j][c.siblingsCount];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (maxCount > 0) {
|
|
|
|
dateTuples[i][c.siblingsCount] = maxCount;
|
|
|
|
dateTuples[i][c.siblingsMaxCount] = maxCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Third loop; adjust position and total number of siblings for each event
|
|
|
|
for (var i = 0; i < dateTuples.length; i++) {
|
|
|
|
//log (i + " " + dateTuples[i].inspect());
|
|
|
|
for (var j = 0; j < dateTuples.length; j++) {
|
|
|
|
if (j == i) continue;
|
|
|
|
if (dateTuples[i][c.day] == dateTuples[j][c.day]) {
|
|
|
|
// Same day
|
|
|
|
if (dateTuples[j][c.start] > dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.start] < dateTuples[i][c.end] ||
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
dateTuples[j][c.start] == dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.end] < dateTuples[i][c.end] ||
|
|
|
|
|
|
|
|
dateTuples[j][c.start] == dateTuples[i][c.start] &&
|
|
|
|
dateTuples[j][c.end] == dateTuples[i][c.end] &&
|
|
|
|
i < j) {
|
|
|
|
// Overlapping period
|
|
|
|
if (dateTuples[j][c.siblingsPosition] == dateTuples[i][c.siblingsPosition]) {
|
|
|
|
// Same position
|
|
|
|
dateTuples[j][c.siblingsPosition]--; // not very clever
|
|
|
|
}
|
|
|
|
if (dateTuples[j].length < 7 ||
|
|
|
|
dateTuples[j][c.siblingsMaxCount] < dateTuples[i][c.siblingsMaxCount])
|
|
|
|
dateTuples[j][c.siblingsMaxCount] = dateTuples[i][c.siblingsMaxCount];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (dateTuples[i].length < 7)
|
|
|
|
dateTuples[i][c.siblingsMaxCount] = dateTuples[i][c.siblingsCount];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Final loop; draw the events
|
|
|
|
//log ("[div, day, start index, end index, siblings count, siblings position, siblings max count]");
|
|
|
|
for (var i = 0; i < dateTuples.length; i++) {
|
|
|
|
//log (i + " " + dateTuples[i].inspect());
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var base = dateTuples[i][c.siblingsCount] * dateTuples[i][c.siblingsMaxCount];
|
|
|
|
var length = 1;
|
|
|
|
var maxLength = 1 * dateTuples[i][c.siblingsMaxCount];
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
for (var j = dateTuples[i][c.siblingsCount];
|
|
|
|
j < maxLength;
|
|
|
|
j += dateTuples[i][c.siblingsCount]) { }
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
if (j > maxLength) {
|
|
|
|
j -= dateTuples[i][c.siblingsCount];
|
|
|
|
}
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var width = 100 * j / base;
|
|
|
|
var left = width * dateTuples[i][c.siblingsPosition];
|
|
|
|
dateTuples[i][0].setStyle({ width: width + "%",
|
|
|
|
left: left + "%" });
|
2008-03-25 20:59:13 +01:00
|
|
|
}
|
2008-04-15 22:12:51 +02:00
|
|
|
}
|
|
|
|
scrollDayView(http.callbackData["scrollEvent"]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
log("AJAX error when refreshing calendar events");
|
2007-06-11 23:23:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function drawCalendarEvent(eventData, sd, ed) {
|
2008-04-15 22:12:51 +02:00
|
|
|
var dateTuples = new Array();
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var viewStartDate = sd.asDate();
|
|
|
|
var viewEndDate = ed.asDate();
|
2007-06-11 23:23:48 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var startDate = new Date();
|
|
|
|
startDate.setTime(eventData[4] * 1000);
|
|
|
|
var endDate = new Date();
|
|
|
|
endDate.setTime(eventData[5] * 1000);
|
2007-09-15 01:37:19 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
//log ("s: " + startDate + "; e: " + endDate);
|
2007-06-11 23:23:48 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var days = startDate.daysUpTo(endDate);
|
2007-06-11 23:23:48 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var title;
|
|
|
|
if (currentView == "monthview"
|
|
|
|
&& (eventData[7] == 0))
|
|
|
|
title = startDate.getDisplayHoursString() + " " + eventData[3];
|
|
|
|
else
|
|
|
|
title = eventData[3];
|
2007-06-13 04:47:23 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
// log("title: " + title);
|
|
|
|
// log("viewS: " + viewStartDate);
|
|
|
|
var startHour = null;
|
|
|
|
var endHour = null;
|
2007-11-19 18:09:14 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var siblings = new Array();
|
|
|
|
for (var i = 0; i < days.length; i++)
|
|
|
|
if (days[i].earlierDate(viewStartDate) == viewStartDate
|
|
|
|
&& days[i].laterDate(viewEndDate) == viewEndDate) {
|
|
|
|
var starts;
|
|
|
|
|
|
|
|
// log("day: " + days[i]);
|
|
|
|
if (i == 0) {
|
|
|
|
var quarters = (startDate.getUTCHours() * 4
|
|
|
|
+ Math.floor(startDate.getUTCMinutes() / 15));
|
|
|
|
starts = quarters;
|
|
|
|
startHour = startDate.getDisplayHoursString();
|
|
|
|
endHour = endDate.getDisplayHoursString();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
starts = 0;
|
2007-06-11 23:23:48 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
var ends;
|
|
|
|
var lasts;
|
|
|
|
if (i == days.length - 1) {
|
|
|
|
var quarters = (endDate.getUTCHours() * 4
|
|
|
|
+ Math.ceil(endDate.getUTCMinutes() / 15));
|
|
|
|
ends = quarters;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ends = 96;
|
|
|
|
lasts = ends - starts;
|
|
|
|
if (!lasts)
|
|
|
|
lasts = 1;
|
|
|
|
|
|
|
|
var eventDiv = newEventDIV(eventData[0], eventData[1], starts, lasts,
|
|
|
|
null, null, title);
|
|
|
|
siblings.push(eventDiv);
|
|
|
|
eventDiv.siblings = siblings;
|
|
|
|
if (eventData[9].length > 0)
|
|
|
|
eventDiv.addClassName(eventData[9]); // event owner status
|
|
|
|
//eventDiv.setStyle({ width: '50%' });
|
|
|
|
if (currentView != "monthview" &&
|
|
|
|
eventData[7] == 0) // not "all day"
|
|
|
|
dateTuples.push(new Array(eventDiv, days[i].getDayString(), starts, ends));
|
|
|
|
var dayString = days[i].getDayString();
|
|
|
|
// log("day: " + dayString);
|
|
|
|
var parentDiv = null;
|
|
|
|
if (currentView == "monthview") {
|
|
|
|
var dayDivs = $("monthDaysView").childNodesWithTag("div");
|
|
|
|
var j = 0;
|
|
|
|
while (!parentDiv && j < dayDivs.length) {
|
|
|
|
if (dayDivs[j].getAttribute("day") == dayString)
|
|
|
|
parentDiv = dayDivs[j];
|
|
|
|
else
|
|
|
|
j++;
|
|
|
|
}
|
2007-06-11 23:23:48 +02:00
|
|
|
}
|
2008-04-15 22:12:51 +02:00
|
|
|
else {
|
|
|
|
if (eventData[7] == 0) {
|
|
|
|
var daysView = $("daysView");
|
|
|
|
var eventsDiv = $(daysView).childNodesWithTag("div")[1];
|
|
|
|
var dayDivs = $(eventsDiv).childNodesWithTag("div");
|
|
|
|
var j = 0;
|
|
|
|
while (!parentDiv && j < dayDivs.length) {
|
|
|
|
if (dayDivs[j].getAttribute("day") == dayString)
|
|
|
|
parentDiv = dayDivs[j].childNodesWithTag("div")[0];
|
|
|
|
else
|
|
|
|
j++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var header = $("calendarHeader");
|
|
|
|
var daysDiv = $(header).childNodesWithTag("div")[1];
|
|
|
|
var dayDivs = $(daysDiv).childNodesWithTag("div");
|
|
|
|
var j = 0;
|
|
|
|
while (!parentDiv && j < dayDivs.length) {
|
|
|
|
if (dayDivs[j].getAttribute("day") == dayString)
|
|
|
|
parentDiv = dayDivs[j];
|
|
|
|
else
|
|
|
|
j++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (parentDiv)
|
|
|
|
parentDiv.appendChild(eventDiv);
|
|
|
|
}
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
return dateTuples;
|
2007-11-16 20:38:49 +01:00
|
|
|
}
|
2007-11-07 18:37:58 +01:00
|
|
|
|
2007-11-16 20:38:49 +01:00
|
|
|
function eventClass(cname) {
|
|
|
|
return escape(cname.replace(".", "-"));
|
2007-06-11 23:23:48 +02:00
|
|
|
}
|
|
|
|
|
2007-11-16 20:38:49 +01:00
|
|
|
|
2007-09-15 00:01:02 +02:00
|
|
|
function newEventDIV(cname, calendar, starts, lasts,
|
2007-06-12 20:55:31 +02:00
|
|
|
startHour, endHour, title) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var eventDiv = document.createElement("div");
|
|
|
|
eventDiv.cname = escape(cname);
|
|
|
|
eventDiv.calendar = calendar;
|
|
|
|
$(eventDiv).addClassName("event");
|
|
|
|
$(eventDiv).addClassName(eventClass(cname));
|
|
|
|
$(eventDiv).addClassName("starts" + starts);
|
|
|
|
$(eventDiv).addClassName("lasts" + lasts);
|
|
|
|
for (var i = 1; i < 5; i++) {
|
|
|
|
var shadowDiv = document.createElement("div");
|
|
|
|
eventDiv.appendChild(shadowDiv);
|
|
|
|
$(shadowDiv).addClassName("shadow");
|
|
|
|
$(shadowDiv).addClassName("shadow" + i);
|
|
|
|
}
|
|
|
|
var innerDiv = document.createElement("div");
|
|
|
|
eventDiv.appendChild(innerDiv);
|
|
|
|
$(innerDiv).addClassName("eventInside");
|
|
|
|
$(innerDiv).addClassName("calendarFolder" + calendar);
|
|
|
|
|
|
|
|
var gradientDiv = document.createElement("div");
|
|
|
|
innerDiv.appendChild(gradientDiv);
|
|
|
|
$(gradientDiv).addClassName("gradient");
|
|
|
|
var gradientImg = document.createElement("img");
|
|
|
|
gradientDiv.appendChild(gradientImg);
|
|
|
|
gradientImg.src = ResourcesURL + "/event-gradient.png";
|
|
|
|
|
|
|
|
var textDiv = document.createElement("div");
|
|
|
|
innerDiv.appendChild(textDiv);
|
|
|
|
$(textDiv).addClassName("text");
|
|
|
|
if (startHour) {
|
|
|
|
var headerSpan = document.createElement("span");
|
|
|
|
textDiv.appendChild(headerSpan);
|
|
|
|
$(headerSpan).addClassName("eventHeader");
|
|
|
|
headerSpan.appendChild(document.createTextNode(startHour + " - "
|
|
|
|
+ endHour));
|
|
|
|
textDiv.appendChild(document.createElement("br"));
|
|
|
|
}
|
|
|
|
textDiv.appendChild(document.createTextNode(title));
|
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
eventDiv.observe("mousedown", listRowMouseDownHandler);
|
2008-04-15 22:47:18 +02:00
|
|
|
eventDiv.observe("click", onCalendarSelectEvent);
|
|
|
|
eventDiv.observe("dblclick", editDoubleClickedEvent);
|
2008-01-24 22:36:51 +01:00
|
|
|
|
|
|
|
return eventDiv;
|
2007-06-11 23:23:48 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function calendarDisplayCallback(http) {
|
2006-08-24 20:48:33 +02:00
|
|
|
var div = $("calendarView");
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
if (http.readyState == 4
|
|
|
|
&& http.status == 200) {
|
2007-01-05 17:10:48 +01:00
|
|
|
document.dayDisplayAjaxRequest = null;
|
2007-09-24 23:26:23 +02:00
|
|
|
div.update(http.responseText);
|
2006-08-24 20:48:33 +02:00
|
|
|
if (http.callbackData["view"])
|
|
|
|
currentView = http.callbackData["view"];
|
|
|
|
if (http.callbackData["day"])
|
2006-09-07 00:27:46 +02:00
|
|
|
currentDay = http.callbackData["day"];
|
2007-06-13 21:28:59 +02:00
|
|
|
|
2006-11-15 22:54:47 +01:00
|
|
|
var contentView;
|
|
|
|
if (currentView == "monthview")
|
|
|
|
contentView = $("calendarContent");
|
2007-11-16 20:38:49 +01:00
|
|
|
else
|
2006-11-15 22:54:47 +01:00
|
|
|
contentView = $("daysView");
|
2007-11-16 20:38:49 +01:00
|
|
|
|
|
|
|
refreshCalendarEvents(http.callbackData.scrollEvent);
|
|
|
|
|
2006-11-15 22:54:47 +01:00
|
|
|
var days = document.getElementsByClassName("day", contentView);
|
|
|
|
if (currentView == "monthview")
|
|
|
|
for (var i = 0; i < days.length; i++) {
|
2008-04-15 22:47:18 +02:00
|
|
|
days[i].observe("click", onCalendarSelectDay);
|
|
|
|
days[i].observe("dblclick", onClickableCellsDblClick);
|
2006-11-15 18:59:47 +01:00
|
|
|
}
|
2007-06-11 23:23:48 +02:00
|
|
|
else {
|
2008-01-24 22:36:51 +01:00
|
|
|
var headerDivs = $("calendarHeader").childNodesWithTag("div");
|
2008-04-15 22:47:18 +02:00
|
|
|
var headerDaysLabels
|
|
|
|
= document.getElementsByClassName("day", headerDivs[0]);
|
2008-01-24 22:36:51 +01:00
|
|
|
var headerDays = document.getElementsByClassName("day", headerDivs[1]);
|
|
|
|
for (var i = 0; i < days.length; i++) {
|
|
|
|
headerDays[i].hour = "allday";
|
2008-04-15 22:12:51 +02:00
|
|
|
headerDaysLabels[i].observe("mousedown", listRowMouseDownHandler);
|
2008-04-15 22:47:18 +02:00
|
|
|
headerDays[i].observe("click", onCalendarSelectDay);
|
|
|
|
headerDays[i].observe("dblclick", onClickableCellsDblClick);
|
|
|
|
days[i].observe("click", onCalendarSelectDay);
|
|
|
|
var clickableCells
|
|
|
|
= document.getElementsByClassName("clickableHourCell", days[i]);
|
2008-01-24 22:36:51 +01:00
|
|
|
for (var j = 0; j < clickableCells.length; j++)
|
2008-04-15 22:47:18 +02:00
|
|
|
clickableCells[j].observe("dblclick", onClickableCellsDblClick);
|
2008-01-24 22:36:51 +01:00
|
|
|
}
|
2007-06-11 23:23:48 +02:00
|
|
|
}
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
else
|
2008-04-15 22:47:18 +02:00
|
|
|
log ("calendarDisplayCallback Ajax error ("
|
|
|
|
+ http.readyState + "/" + http.status + ")");
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-03-18 16:00:34 +01:00
|
|
|
function assignCalendar(name) {
|
2007-10-19 16:36:33 +02:00
|
|
|
if (typeof(skycalendar) != "undefined") {
|
|
|
|
var node = $(name);
|
2008-03-27 22:05:47 +01:00
|
|
|
|
2007-10-19 16:36:33 +02:00
|
|
|
node.calendar = new skycalendar(node);
|
|
|
|
node.calendar.setCalendarPage(ResourcesURL + "/skycalendar.html");
|
|
|
|
var dateFormat = node.getAttribute("dateFormat");
|
|
|
|
if (dateFormat)
|
|
|
|
node.calendar.setDateFormat(dateFormat);
|
|
|
|
}
|
2006-08-31 01:13:18 +02:00
|
|
|
}
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2007-03-18 16:00:34 +01:00
|
|
|
function popupCalendar(node) {
|
2008-04-15 22:12:51 +02:00
|
|
|
var nodeId = $(node).readAttribute("inputId");
|
|
|
|
var input = $(nodeId);
|
|
|
|
input.calendar.popup();
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
return false;
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function onEventContextMenu(event) {
|
|
|
|
var topNode = $("eventsList");
|
|
|
|
var menu = $("eventsListMenu");
|
2006-08-19 00:40:04 +02:00
|
|
|
|
2008-04-15 22:47:18 +02:00
|
|
|
menu.observe("hideMenu", onEventContextMenuHide);
|
2007-06-08 01:23:07 +02:00
|
|
|
popupMenu(event, "eventsListMenu", this);
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function onEventContextMenuHide(event) {
|
|
|
|
var topNode = $("eventsList");
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
if (topNode.menuSelectedEntry) {
|
2006-12-20 23:55:54 +01:00
|
|
|
topNode.menuSelectedEntry.deselect();
|
2006-08-19 00:40:04 +02:00
|
|
|
topNode.menuSelectedEntry = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function onEventsSelectionChange() {
|
2006-11-13 23:31:41 +01:00
|
|
|
listOfSelection = this;
|
|
|
|
this.removeClassName("_unfocused");
|
2006-10-12 23:05:32 +02:00
|
|
|
$("tasksList").addClassName("_unfocused");
|
2007-12-05 18:07:40 +01:00
|
|
|
|
|
|
|
var rows = this.tBodies[0].getSelectedNodes();
|
|
|
|
if (rows.length == 1) {
|
|
|
|
var row = rows[0];
|
|
|
|
changeCalendarDisplay( { "day": row.day,
|
|
|
|
"scrollEvent": row.getAttribute("id") } );
|
|
|
|
changeDateSelectorDisplay(row.day);
|
|
|
|
}
|
2006-10-12 23:05:32 +02:00
|
|
|
}
|
|
|
|
|
2006-11-09 23:55:04 +01:00
|
|
|
function onTasksSelectionChange() {
|
2006-11-13 23:31:41 +01:00
|
|
|
listOfSelection = this;
|
|
|
|
this.removeClassName("_unfocused");
|
2007-06-08 01:23:07 +02:00
|
|
|
$("eventsList").addClassName("_unfocused");
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function _loadEventHref(href) {
|
|
|
|
if (document.eventsListAjaxRequest) {
|
|
|
|
document.eventsListAjaxRequest.aborted = true;
|
|
|
|
document.eventsListAjaxRequest.abort();
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
2007-09-15 00:01:02 +02:00
|
|
|
var url = ApplicationBaseURL + "/" + href;
|
2007-06-08 01:23:07 +02:00
|
|
|
document.eventsListAjaxRequest
|
|
|
|
= triggerAjaxRequest(url, eventsListCallback, href);
|
|
|
|
|
|
|
|
var table = $("eventsList").tBodies[0];
|
2007-10-02 17:29:16 +02:00
|
|
|
while (table.rows.length > 0)
|
2008-01-24 22:36:51 +01:00
|
|
|
table.removeChild(table.rows[0]);
|
2006-08-19 00:40:04 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2006-10-11 20:12:02 +02:00
|
|
|
function _loadTasksHref(href) {
|
|
|
|
if (document.tasksListAjaxRequest) {
|
|
|
|
document.tasksListAjaxRequest.aborted = true;
|
|
|
|
document.tasksListAjaxRequest.abort();
|
|
|
|
}
|
2007-11-19 20:17:44 +01:00
|
|
|
url = ApplicationBaseURL + href;
|
2006-10-11 20:12:02 +02:00
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
var tasksList = $("tasksList");
|
|
|
|
var selectedIds;
|
|
|
|
if (tasksList)
|
2008-01-24 22:36:51 +01:00
|
|
|
selectedIds = tasksList.getSelectedNodesId();
|
2007-06-08 01:23:07 +02:00
|
|
|
else
|
2008-01-24 22:36:51 +01:00
|
|
|
selectedIds = null;
|
2006-10-11 20:12:02 +02:00
|
|
|
document.tasksListAjaxRequest
|
|
|
|
= triggerAjaxRequest(url, tasksListCallback, selectedIds);
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
tasksList.previousScroll = tasksList.scrollTop;
|
|
|
|
while (tasksList.childNodes.length)
|
2008-01-24 22:36:51 +01:00
|
|
|
tasksList.removeChild(tasksList.childNodes[0]);
|
2007-06-08 01:23:07 +02:00
|
|
|
|
2007-06-06 23:09:39 +02:00
|
|
|
return true;
|
2006-10-11 20:12:02 +02:00
|
|
|
}
|
|
|
|
|
2006-11-09 23:55:04 +01:00
|
|
|
function onHeaderClick(event) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var headerId = this.getAttribute("id");
|
2007-12-06 18:29:32 +01:00
|
|
|
var newSortAttribute;
|
|
|
|
if (headerId == "titleHeader")
|
|
|
|
newSortAttribute = "title";
|
|
|
|
else if (headerId == "startHeader")
|
|
|
|
newSortAttribute = "start";
|
|
|
|
else if (headerId == "endHeader")
|
|
|
|
newSortAttribute = "end";
|
|
|
|
else if (headerId == "locationHeader")
|
|
|
|
newSortAttribute = "location";
|
|
|
|
else
|
|
|
|
newSortAttribute = "start";
|
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
if (sorting["attribute"] == newSortAttribute)
|
2007-12-06 18:29:32 +01:00
|
|
|
sorting["ascending"] = !sorting["ascending"];
|
|
|
|
else {
|
|
|
|
sorting["attribute"] = newSortAttribute;
|
|
|
|
sorting["ascending"] = true;
|
|
|
|
}
|
2008-01-24 22:36:51 +01:00
|
|
|
refreshEvents();
|
2006-11-09 23:55:04 +01:00
|
|
|
|
2007-12-06 18:29:32 +01:00
|
|
|
Event.stop(event);
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
|
|
|
|
2007-11-21 18:23:51 +01:00
|
|
|
function refreshCurrentFolder() {
|
|
|
|
refreshEvents();
|
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function refreshEvents() {
|
2007-11-21 18:23:51 +01:00
|
|
|
var titleSearch;
|
|
|
|
var value = search["value"];
|
|
|
|
if (value && value.length)
|
|
|
|
titleSearch = "&search=" + value;
|
|
|
|
else
|
|
|
|
titleSearch = "";
|
2007-12-06 18:29:32 +01:00
|
|
|
|
|
|
|
return _loadEventHref("eventslist?asc=" + sorting["ascending"]
|
|
|
|
+ "&sort=" + sorting["attribute"]
|
2007-11-21 18:23:51 +01:00
|
|
|
+ "&day=" + currentDay
|
|
|
|
+ titleSearch
|
|
|
|
+ "&filterpopup=" + listFilter);
|
2006-08-19 00:40:04 +02:00
|
|
|
}
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2006-10-11 20:12:02 +02:00
|
|
|
function refreshTasks() {
|
2007-04-03 16:24:09 +02:00
|
|
|
return _loadTasksHref("taskslist?show-completed=" + showCompletedTasks);
|
2006-10-11 20:12:02 +02:00
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function refreshEventsAndDisplay() {
|
|
|
|
refreshEvents();
|
2006-10-18 23:53:47 +02:00
|
|
|
changeCalendarDisplay();
|
|
|
|
}
|
|
|
|
|
2006-08-22 00:36:33 +02:00
|
|
|
function onListFilterChange() {
|
2006-08-24 20:48:33 +02:00
|
|
|
var node = $("filterpopup");
|
2006-08-22 00:36:33 +02:00
|
|
|
|
|
|
|
listFilter = node.value;
|
2008-01-24 22:36:51 +01:00
|
|
|
// log ("listFilter = " + listFilter);
|
2006-08-22 00:36:33 +02:00
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
return refreshEvents();
|
2006-08-22 00:36:33 +02:00
|
|
|
}
|
2006-08-22 21:18:30 +02:00
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function selectMonthInMenu(menu, month) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var entries = menu.childNodes[1].childNodesWithTag("LI");
|
|
|
|
for (i = 0; i < entries.length; i++) {
|
|
|
|
var entry = entries[i];
|
|
|
|
var entryMonth = entry.getAttribute("month");
|
|
|
|
if (entryMonth == month)
|
|
|
|
entry.addClassName("currentMonth");
|
|
|
|
else
|
|
|
|
entry.removeClassName("currentMonth");
|
|
|
|
}
|
2006-08-22 21:18:30 +02:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function selectYearInMenu(menu, month) {
|
2006-08-22 21:18:30 +02:00
|
|
|
var entries = menu.childNodes[1].childNodes;
|
|
|
|
for (i = 0; i < entries.length; i++) {
|
|
|
|
var entry = entries[i];
|
2007-10-18 19:19:05 +02:00
|
|
|
if (entry.tagName == "LI") {
|
2006-08-22 21:18:30 +02:00
|
|
|
var entryMonth = entry.innerHTML;
|
|
|
|
if (entryMonth == month)
|
|
|
|
entry.addClassName("currentMonth");
|
|
|
|
else
|
|
|
|
entry.removeClassName("currentMonth");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-07-05 21:13:59 +02:00
|
|
|
function popupMonthMenu(event) {
|
2006-08-22 21:18:30 +02:00
|
|
|
if (event.button == 0) {
|
2007-07-05 21:13:59 +02:00
|
|
|
var id = this.getAttribute("id");
|
|
|
|
if (id == "monthLabel")
|
2008-01-24 22:36:51 +01:00
|
|
|
menuId = "monthListMenu";
|
2007-07-05 21:13:59 +02:00
|
|
|
else
|
2008-01-24 22:36:51 +01:00
|
|
|
menuId = "yearListMenu";
|
2006-08-22 21:18:30 +02:00
|
|
|
|
2006-08-24 20:48:33 +02:00
|
|
|
var popup = $(menuId);
|
2006-08-22 21:18:30 +02:00
|
|
|
if (id == "monthLabel")
|
2007-07-05 21:13:59 +02:00
|
|
|
selectMonthInMenu(popup, this.getAttribute("month"));
|
2006-08-22 21:18:30 +02:00
|
|
|
else
|
2007-07-05 21:13:59 +02:00
|
|
|
selectYearInMenu(popup, this.innerHTML);
|
2006-08-22 21:18:30 +02:00
|
|
|
|
2007-07-05 21:13:59 +02:00
|
|
|
popupToolbarMenu(this, menuId);
|
|
|
|
Event.stop(event);
|
2006-08-22 21:18:30 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-22 16:38:54 +02:00
|
|
|
function onMonthMenuItemClick(event) {
|
|
|
|
var month = '' + this.getAttribute("month");
|
2006-08-24 20:48:33 +02:00
|
|
|
var year = '' + $("yearLabel").innerHTML;
|
2006-08-22 21:18:30 +02:00
|
|
|
|
2007-05-22 16:38:54 +02:00
|
|
|
changeDateSelectorDisplay(year + month + "01", true);
|
2006-08-22 21:18:30 +02:00
|
|
|
}
|
|
|
|
|
2007-05-22 16:38:54 +02:00
|
|
|
function onYearMenuItemClick(event) {
|
2006-08-24 20:48:33 +02:00
|
|
|
var month = '' + $("monthLabel").getAttribute("month");;
|
2007-05-22 16:38:54 +02:00
|
|
|
var year = '' + this.innerHTML;
|
2006-08-22 21:18:30 +02:00
|
|
|
|
2007-05-22 16:38:54 +02:00
|
|
|
changeDateSelectorDisplay(year + month + "01", true);
|
2006-08-22 21:18:30 +02:00
|
|
|
}
|
2006-08-31 01:13:18 +02:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
function selectCalendarEvent(div) {
|
|
|
|
// Select event in calendar view
|
2007-01-30 14:50:52 +01:00
|
|
|
if (selectedCalendarCell)
|
2008-01-24 22:36:51 +01:00
|
|
|
for (var i = 0; i < selectedCalendarCell.length; i++)
|
|
|
|
selectedCalendarCell[i].deselect();
|
2007-06-12 23:19:18 +02:00
|
|
|
|
2007-11-19 18:09:14 +01:00
|
|
|
for (var i = 0; i < div.siblings.length; i++)
|
2008-02-05 21:00:52 +01:00
|
|
|
div.siblings[i].selectElement();
|
2007-11-19 18:09:14 +01:00
|
|
|
|
|
|
|
selectedCalendarCell = div.siblings;
|
|
|
|
}
|
|
|
|
|
|
|
|
function onCalendarSelectEvent() {
|
|
|
|
var list = $("eventsList");
|
|
|
|
|
|
|
|
selectCalendarEvent(this);
|
|
|
|
|
|
|
|
// Select event in events list
|
|
|
|
$(list.tBodies[0]).deselectAll();
|
2007-06-11 23:23:48 +02:00
|
|
|
var row = $(this.cname);
|
2006-11-03 00:17:55 +01:00
|
|
|
if (row) {
|
|
|
|
var div = row.parentNode.parentNode.parentNode;
|
|
|
|
div.scrollTop = row.offsetTop - (div.offsetHeight / 2);
|
2008-02-05 21:00:52 +01:00
|
|
|
row.selectElement();
|
2006-11-03 00:17:55 +01:00
|
|
|
}
|
2006-09-07 00:27:46 +02:00
|
|
|
}
|
|
|
|
|
2006-12-19 20:17:35 +01:00
|
|
|
function onCalendarSelectDay(event) {
|
2007-02-13 23:01:02 +01:00
|
|
|
var day;
|
|
|
|
if (currentView == "multicolumndayview")
|
2008-01-24 22:36:51 +01:00
|
|
|
day = this.getAttribute("day");
|
2007-02-13 23:01:02 +01:00
|
|
|
else
|
2008-01-24 22:36:51 +01:00
|
|
|
day = this.getAttribute("day");
|
2006-11-15 22:54:47 +01:00
|
|
|
var needRefresh = (listFilter == 'view_selectedday'
|
|
|
|
&& day != currentDay);
|
2006-09-07 00:27:46 +02:00
|
|
|
|
2006-11-03 00:17:55 +01:00
|
|
|
if (currentView == 'weekview')
|
2006-11-15 01:10:53 +01:00
|
|
|
changeWeekCalendarDisplayOfSelectedDay(this);
|
2006-11-03 00:17:55 +01:00
|
|
|
else if (currentView == 'monthview')
|
2006-11-15 01:10:53 +01:00
|
|
|
changeMonthCalendarDisplayOfSelectedDay(this);
|
2006-09-07 00:27:46 +02:00
|
|
|
changeDateSelectorDisplay(day);
|
|
|
|
|
2007-01-30 19:18:30 +01:00
|
|
|
if (listOfSelection) {
|
|
|
|
listOfSelection.addClassName("_unfocused");
|
|
|
|
listOfSelection = null;
|
|
|
|
}
|
|
|
|
|
2006-11-15 22:54:47 +01:00
|
|
|
if (needRefresh)
|
2007-06-08 01:23:07 +02:00
|
|
|
refreshEvents();
|
2006-09-07 00:27:46 +02:00
|
|
|
}
|
2006-10-11 20:12:02 +02:00
|
|
|
|
2006-12-19 20:17:35 +01:00
|
|
|
function changeWeekCalendarDisplayOfSelectedDay(node) {
|
2006-11-15 01:10:53 +01:00
|
|
|
var days = document.getElementsByClassName("day", node.parentNode);
|
2007-06-11 23:23:48 +02:00
|
|
|
var headerDiv = $("calendarHeader").childNodesWithTag("div")[1];
|
|
|
|
var headerDays = document.getElementsByClassName("day", headerDiv);
|
2006-10-31 23:59:57 +01:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
// log ("days: " + days.length + "; headerDays: " + headerDays.length);
|
2006-11-15 01:10:53 +01:00
|
|
|
for (var i = 0; i < days.length; i++)
|
2008-01-24 22:36:51 +01:00
|
|
|
if (days[i] != node) {
|
|
|
|
// log("unselect day : " + i);
|
|
|
|
headerDays[i].removeClassName("selectedDay");
|
|
|
|
days[i].removeClassName("selectedDay");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// log("selected day : " + i);
|
|
|
|
headerDays[i].addClassName("selectedDay");
|
|
|
|
days[i].addClassName("selectedDay");
|
|
|
|
}
|
2006-10-31 23:59:57 +01:00
|
|
|
}
|
|
|
|
|
2007-03-13 00:06:48 +01:00
|
|
|
function findMonthCalendarSelectedCell(daysContainer) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var found = false;
|
|
|
|
var i = 0;
|
|
|
|
|
|
|
|
while (!found && i < daysContainer.childNodes.length) {
|
|
|
|
var currentNode = daysContainer.childNodes[i];
|
|
|
|
if (currentNode.tagName == 'DIV'
|
|
|
|
&& currentNode.hasClassName("selectedDay")) {
|
|
|
|
daysContainer.selectedCell = currentNode;
|
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
i++;
|
|
|
|
}
|
2006-11-03 00:17:55 +01:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function changeMonthCalendarDisplayOfSelectedDay(node) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var daysContainer = node.parentNode;
|
|
|
|
if (!daysContainer.selectedCell)
|
|
|
|
findMonthCalendarSelectedCell(daysContainer);
|
2007-03-13 00:06:48 +01:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
if (daysContainer.selectedCell)
|
|
|
|
daysContainer.selectedCell.removeClassName("selectedDay");
|
|
|
|
daysContainer.selectedCell = node;
|
|
|
|
node.addClassName("selectedDay");
|
2006-11-03 00:17:55 +01:00
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function onShowCompletedTasks(event) {
|
2008-01-24 22:36:51 +01:00
|
|
|
showCompletedTasks = (this.checked ? 1 : 0);
|
2006-10-11 20:12:02 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
return refreshTasks();
|
2006-10-11 20:12:02 +02:00
|
|
|
}
|
|
|
|
|
2007-06-06 23:09:39 +02:00
|
|
|
function updateTaskStatus(event) {
|
|
|
|
var taskId = this.parentNode.getAttribute("id");
|
|
|
|
var newStatus = (this.checked ? 1 : 0);
|
2006-10-11 20:12:02 +02:00
|
|
|
var http = createHTTPClient();
|
2007-10-02 17:29:16 +02:00
|
|
|
|
|
|
|
if (isSafari() && !isSafari3()) {
|
2007-08-07 20:14:39 +02:00
|
|
|
newStatus = (newStatus ? 0 : 1);
|
2007-10-02 17:29:16 +02:00
|
|
|
}
|
2007-06-06 23:09:39 +02:00
|
|
|
|
2007-11-19 20:17:44 +01:00
|
|
|
url = (ApplicationBaseURL + this.parentNode.calendar
|
2007-09-15 00:01:02 +02:00
|
|
|
+ "/" + taskId + "/changeStatus?status=" + newStatus);
|
2006-10-11 20:12:02 +02:00
|
|
|
|
|
|
|
if (http) {
|
|
|
|
// TODO: add parameter to signal that we are only interested in OK
|
2007-06-06 23:09:39 +02:00
|
|
|
http.open("POST", url, false /* not async */);
|
2006-10-11 20:12:02 +02:00
|
|
|
http.url = url;
|
|
|
|
http.send("");
|
2008-01-22 17:43:46 +01:00
|
|
|
http.setRequestHeader("Content-Length", 0);
|
2007-11-19 20:17:44 +01:00
|
|
|
if (isHttpStatus204(http.status))
|
2006-10-11 20:12:02 +02:00
|
|
|
refreshTasks();
|
2006-10-17 21:49:47 +02:00
|
|
|
} else
|
|
|
|
log ("no http client?");
|
2006-10-11 20:12:02 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2006-10-14 01:37:27 +02:00
|
|
|
|
2007-03-29 20:05:23 +02:00
|
|
|
function updateCalendarStatus(event) {
|
2006-10-14 01:37:27 +02:00
|
|
|
var list = new Array();
|
2007-10-02 17:29:16 +02:00
|
|
|
var newStatus = (this.checked ? 1 : 0);
|
|
|
|
|
|
|
|
if (isSafari() && !isSafari3()) {
|
|
|
|
newStatus = (newStatus ? 0 : 1);
|
|
|
|
this.checked = newStatus;
|
|
|
|
}
|
2006-10-14 01:37:27 +02:00
|
|
|
|
2007-03-29 20:05:23 +02:00
|
|
|
var nodes = $("calendarList").childNodesWithTag("li");
|
2006-10-14 01:37:27 +02:00
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
2007-05-28 23:30:37 +02:00
|
|
|
var input = $(nodes[i]).childNodesWithTag("input")[0];
|
2007-03-29 20:05:23 +02:00
|
|
|
if (input.checked) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var folderId = nodes[i].getAttribute("id");
|
|
|
|
var elems = folderId.split(":");
|
|
|
|
if (elems.length > 1)
|
|
|
|
list.push(elems[0]);
|
|
|
|
else
|
|
|
|
list.push(UserLogin);
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
2006-10-14 01:37:27 +02:00
|
|
|
}
|
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
// if (!list.length) {
|
|
|
|
// list.push(UserLogin);
|
|
|
|
// nodes[0].childNodesWithTag("input")[0].checked = true;
|
|
|
|
// }
|
2007-09-15 00:01:02 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
// ApplicationBaseURL = (UserFolderURL + "Groups/_custom_"
|
|
|
|
// + list.join(",") + "/Calendar/");
|
2007-03-29 20:05:23 +02:00
|
|
|
|
|
|
|
if (event) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var folderID = this.parentNode.getAttribute("id");
|
|
|
|
var urlstr = URLForFolderID(folderID);
|
|
|
|
if (newStatus)
|
|
|
|
urlstr += "/activateFolder";
|
|
|
|
else
|
|
|
|
urlstr += "/deactivateFolder";
|
|
|
|
//log("updateCalendarStatus: ajax request = " + urlstr + ", folderID = " + folderID);
|
|
|
|
triggerAjaxRequest(urlstr, calendarStatusCallback, folderID);
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
else {
|
2008-01-24 22:36:51 +01:00
|
|
|
updateCalendarsList();
|
|
|
|
refreshEvents();
|
|
|
|
refreshTasks();
|
|
|
|
changeCalendarDisplay();
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
2006-10-14 01:37:27 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2007-03-29 20:05:23 +02:00
|
|
|
function calendarStatusCallback(http) {
|
2007-06-07 21:21:24 +02:00
|
|
|
if (http.readyState == 4) {
|
2007-06-12 16:58:15 +02:00
|
|
|
if (isHttpStatus204(http.status)) {
|
2007-10-02 17:29:16 +02:00
|
|
|
refreshEvents();
|
|
|
|
refreshTasks();
|
|
|
|
changeCalendarDisplay();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var folder = $(http.callbackData);
|
|
|
|
var input = folder.childNodesWithTag("input")[0];
|
|
|
|
input.checked = (!input.checked);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
log("calendarStatusCallback Ajax error");
|
2006-10-14 01:37:27 +02:00
|
|
|
}
|
|
|
|
|
2007-03-29 20:05:23 +02:00
|
|
|
function calendarEntryCallback(http) {
|
2008-01-24 22:36:51 +01:00
|
|
|
if (http.readyState == 4) {
|
|
|
|
var denied = !isHttpStatus204(http.status);
|
|
|
|
var entry = $(http.callbackData);
|
|
|
|
if (denied)
|
|
|
|
entry.addClassName("denied");
|
|
|
|
else
|
|
|
|
entry.removeClassName("denied");
|
|
|
|
}
|
2006-12-20 17:45:52 +01:00
|
|
|
}
|
|
|
|
|
2007-03-19 15:31:49 +01:00
|
|
|
function updateCalendarsList(method) {
|
2007-03-29 20:05:23 +02:00
|
|
|
var list = $("calendarList").childNodesWithTag("li");
|
|
|
|
for (var i = 0; i < list.length; i++) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var folderID = list[i].getAttribute("id");
|
|
|
|
var url = URLForFolderID(folderID) + "/canAccessContent";
|
|
|
|
triggerAjaxRequest(url, calendarEntryCallback, folderID);
|
2006-12-19 18:06:07 +01:00
|
|
|
}
|
2006-10-14 01:37:27 +02:00
|
|
|
}
|
|
|
|
|
2006-10-23 23:37:53 +02:00
|
|
|
function validateBrowseURL(input) {
|
2006-12-14 22:20:13 +01:00
|
|
|
var button = $("browseURLBtn");
|
2006-10-23 23:37:53 +02:00
|
|
|
|
|
|
|
if (input.value.length) {
|
|
|
|
if (!button.enabled)
|
|
|
|
enableAnchor(button);
|
|
|
|
} else if (!button.disabled)
|
|
|
|
disableAnchor(button);
|
|
|
|
}
|
|
|
|
|
2006-12-14 22:20:13 +01:00
|
|
|
function browseURL(anchor, event) {
|
2006-10-23 23:37:53 +02:00
|
|
|
if (event.button == 0) {
|
|
|
|
var input = $("url");
|
|
|
|
var url = input.value;
|
|
|
|
if (url.length)
|
|
|
|
window.open(url, '_blank');
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2006-11-09 23:55:04 +01:00
|
|
|
|
2007-11-19 23:19:17 +01:00
|
|
|
function onCalendarsMenuPrepareVisibility() {
|
|
|
|
var folders = $("calendarList");
|
|
|
|
var selected = folders.getSelectedNodes();
|
|
|
|
|
|
|
|
if (selected.length > 0) {
|
|
|
|
var folderOwner = selected[0].getAttribute("owner");
|
|
|
|
var sharingOption = $(this).down("ul").childElements().last();
|
|
|
|
// Disable the "Sharing" option when calendar is not owned by user
|
2007-11-19 23:40:13 +01:00
|
|
|
if (folderOwner == UserLogin || IsSuperUser)
|
2007-11-19 23:19:17 +01:00
|
|
|
sharingOption.removeClassName("disabled");
|
|
|
|
else
|
|
|
|
sharingOption.addClassName("disabled");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-28 21:19:17 +02:00
|
|
|
function getMenus() {
|
2008-01-24 22:36:51 +01:00
|
|
|
var menus = {};
|
2007-05-28 21:19:17 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
var dateMenu = new Array();
|
|
|
|
for (var i = 0; i < 12; i++)
|
|
|
|
dateMenu.push(onMonthMenuItemClick);
|
|
|
|
menus["monthListMenu"] = dateMenu;
|
2007-05-22 16:38:54 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
dateMenu = new Array();
|
|
|
|
for (var i = 0; i < 11; i++)
|
|
|
|
dateMenu.push(onYearMenuItemClick);
|
|
|
|
menus["yearListMenu"] = dateMenu;
|
2007-05-22 16:38:54 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
menus["eventsListMenu"] = new Array(onMenuNewEventClick, "-",
|
|
|
|
onMenuNewTaskClick,
|
|
|
|
editEvent, deleteEvent, "-",
|
|
|
|
onSelectAll, "-",
|
|
|
|
null, null);
|
2008-04-15 21:48:48 +02:00
|
|
|
menus["calendarsMenu"] = new Array(onCalendarModify,
|
2008-01-24 22:36:51 +01:00
|
|
|
"-",
|
|
|
|
onCalendarNew, onCalendarRemove,
|
|
|
|
"-", null, null, "-",
|
|
|
|
null, "-", onMenuSharing);
|
|
|
|
menus["searchMenu"] = new Array(setSearchCriteria);
|
2007-05-22 16:38:54 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
var calendarsMenu = $("calendarsMenu");
|
|
|
|
if (calendarsMenu)
|
|
|
|
calendarsMenu.prepareVisibility = onCalendarsMenuPrepareVisibility;
|
2007-11-19 23:19:17 +01:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
return menus;
|
2006-12-14 22:20:13 +01:00
|
|
|
}
|
|
|
|
|
2007-05-19 03:12:23 +02:00
|
|
|
function onMenuSharing(event) {
|
2007-11-19 23:19:17 +01:00
|
|
|
if ($(this).hasClassName("disabled"))
|
|
|
|
return;
|
|
|
|
|
2007-03-29 20:05:23 +02:00
|
|
|
var folders = $("calendarList");
|
2006-12-14 22:20:13 +01:00
|
|
|
var selected = folders.getSelectedNodes()[0];
|
2007-11-19 23:19:17 +01:00
|
|
|
/* FIXME: activation of the context menu should preferably select the entry
|
2008-01-24 22:36:51 +01:00
|
|
|
above which the event has occured */
|
2007-05-22 16:38:54 +02:00
|
|
|
if (selected) {
|
2008-01-24 22:36:51 +01:00
|
|
|
var folderID = selected.getAttribute("id");
|
|
|
|
var urlstr = URLForFolderID(folderID) + "/acls";
|
2006-12-14 22:20:13 +01:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
openAclWindow(urlstr);
|
2007-05-22 16:38:54 +02:00
|
|
|
}
|
2006-12-14 22:20:13 +01:00
|
|
|
}
|
|
|
|
|
2006-11-09 23:55:04 +01:00
|
|
|
function configureDragHandles() {
|
|
|
|
var handle = $("verticalDragHandle");
|
|
|
|
if (handle) {
|
|
|
|
handle.addInterface(SOGoDragHandlesInterface);
|
|
|
|
handle.leftBlock=$("leftPanel");
|
|
|
|
handle.rightBlock=$("rightPanel");
|
|
|
|
}
|
|
|
|
|
|
|
|
handle = $("rightDragHandle");
|
|
|
|
if (handle) {
|
|
|
|
handle.addInterface(SOGoDragHandlesInterface);
|
2007-06-08 01:23:07 +02:00
|
|
|
handle.upperBlock=$("eventsListView");
|
2006-11-09 23:55:04 +01:00
|
|
|
handle.lowerBlock=$("calendarView");
|
|
|
|
}
|
|
|
|
}
|
2006-12-14 22:20:13 +01:00
|
|
|
|
2007-03-29 20:05:23 +02:00
|
|
|
function initCalendarSelector() {
|
|
|
|
var selector = $("calendarSelector");
|
2006-12-14 22:20:13 +01:00
|
|
|
updateCalendarStatus();
|
|
|
|
selector.changeNotification = updateCalendarsList;
|
2006-12-19 18:06:07 +01:00
|
|
|
|
2007-10-02 17:29:16 +02:00
|
|
|
var list = $("calendarList");
|
|
|
|
list.multiselect = true;
|
|
|
|
var items = list.childNodesWithTag("li");
|
|
|
|
for (var i = 0; i < items.length; i++) {
|
|
|
|
var input = items[i].childNodesWithTag("input")[0];
|
2008-04-28 20:37:22 +02:00
|
|
|
$(input).observe("click", updateCalendarStatus);
|
2008-04-15 22:12:51 +02:00
|
|
|
items[i].observe("mousedown", listRowMouseDownHandler);
|
|
|
|
items[i].observe("selectstart", listRowMouseDownHandler);
|
|
|
|
items[i].observe("click", onRowClick);
|
2008-04-15 21:48:48 +02:00
|
|
|
items[i].observe("dblclick", onCalendarModify);
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var links = $("calendarSelectorButtons").childNodesWithTag("a");
|
2008-04-15 22:47:18 +02:00
|
|
|
links[0].observe("click", onCalendarNew);
|
|
|
|
links[1].observe("click", onCalendarAdd);
|
|
|
|
links[2].observe("click", onCalendarRemove);
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
|
2008-04-15 21:48:48 +02:00
|
|
|
function onCalendarModify(event) {
|
2007-09-15 04:31:34 +02:00
|
|
|
var folders = $("calendarList");
|
|
|
|
var selected = folders.getSelectedNodes()[0];
|
2008-04-22 01:03:48 +02:00
|
|
|
var calendarID = selected.getAttribute("id");
|
2008-04-22 01:19:32 +02:00
|
|
|
var url = ApplicationBaseURL + calendarID + "/properties";
|
2008-05-06 00:47:38 +02:00
|
|
|
var windowID = (calendarID + "properties").replace("/", "_", "g");
|
|
|
|
var properties = window.open(url, windowID,
|
|
|
|
"width=300,height=100,resizable=0");
|
2008-04-22 01:03:48 +02:00
|
|
|
properties.focus();
|
2007-09-15 04:31:34 +02:00
|
|
|
}
|
|
|
|
|
2008-04-22 01:03:48 +02:00
|
|
|
function updateCalendarProperties(calendarID, calendarName, calendarColor) {
|
|
|
|
var idParts = calendarID.split(":");
|
2008-05-16 22:59:39 +02:00
|
|
|
var folderName = idParts[1].split("/")[1];
|
|
|
|
var nodeID;
|
|
|
|
if (idParts[0] != UserLogin)
|
|
|
|
nodeID = "/" + idParts[0] + "_" + folderName;
|
|
|
|
else
|
|
|
|
nodeID = "/" + folderName;
|
|
|
|
log("nodeID: " + nodeID);
|
2008-04-22 01:03:48 +02:00
|
|
|
var calendarNode = $(nodeID);
|
|
|
|
var childNodes = calendarNode.childNodes;
|
|
|
|
childNodes[childNodes.length-1].nodeValue = calendarName;
|
|
|
|
|
|
|
|
appendStyleElement(nodeID, calendarColor);
|
2007-09-15 04:31:34 +02:00
|
|
|
}
|
|
|
|
|
2007-09-15 00:01:02 +02:00
|
|
|
function onCalendarNew(event) {
|
|
|
|
createFolder(window.prompt(labels["Name of the Calendar"]),
|
|
|
|
appendCalendar);
|
|
|
|
preventDefault(event);
|
|
|
|
}
|
2007-03-29 20:05:23 +02:00
|
|
|
|
2007-09-15 00:01:02 +02:00
|
|
|
function onCalendarAdd(event) {
|
|
|
|
openUserFolderSelector(onFolderSubscribeCB, "calendar");
|
|
|
|
preventDefault(event);
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
|
2008-04-15 21:48:48 +02:00
|
|
|
function setEventsOnCalendar(checkBox, li) {
|
|
|
|
li.observe("mousedown", listRowMouseDownHandler);
|
|
|
|
li.observe("selectstart", listRowMouseDownHandler);
|
|
|
|
li.observe("click", onRowClick);
|
|
|
|
li.observe("dblclick", onCalendarModify);
|
|
|
|
checkBox.observe("click", updateCalendarStatus);
|
|
|
|
}
|
|
|
|
|
2007-10-23 16:39:29 +02:00
|
|
|
function appendCalendar(folderName, folderPath) {
|
|
|
|
var owner;
|
|
|
|
|
|
|
|
if (folderPath) {
|
|
|
|
owner = getSubscribedFolderOwner(folderPath);
|
|
|
|
folderPath = accessToSubscribedFolder(folderPath);
|
|
|
|
}
|
2007-09-15 00:01:02 +02:00
|
|
|
else
|
2007-10-23 16:39:29 +02:00
|
|
|
folderPath = "/" + folderName;
|
|
|
|
|
|
|
|
if (!owner)
|
|
|
|
owner = UserLogin;
|
2007-06-06 23:09:39 +02:00
|
|
|
|
2007-10-23 16:39:29 +02:00
|
|
|
//log ("append name: " + folderName + "; path: " + folderPath + "; owner: " + owner);
|
2007-08-07 20:14:39 +02:00
|
|
|
|
2007-10-23 16:39:29 +02:00
|
|
|
if ($(folderPath))
|
2007-09-15 03:54:23 +02:00
|
|
|
window.alert(clabels["You have already subscribed to that folder!"]);
|
|
|
|
else {
|
|
|
|
var calendarList = $("calendarList");
|
2007-12-06 21:50:20 +01:00
|
|
|
var items = calendarList.childNodesWithTag("li");
|
2007-09-15 03:54:23 +02:00
|
|
|
var li = document.createElement("li");
|
2007-10-23 16:39:29 +02:00
|
|
|
|
|
|
|
// Add the calendar to the proper place
|
2007-12-06 21:50:20 +01:00
|
|
|
var i = getListIndexForFolder(items, owner, folderName);
|
|
|
|
if (i != items.length) // User is subscribed to other calendars of the same owner
|
|
|
|
calendarList.insertBefore(li, items[i]);
|
2007-10-24 17:52:08 +02:00
|
|
|
else
|
|
|
|
calendarList.appendChild(li);
|
|
|
|
|
2007-10-23 16:39:29 +02:00
|
|
|
li.setAttribute("id", folderPath);
|
|
|
|
li.setAttribute("owner", owner);
|
2007-09-15 03:54:23 +02:00
|
|
|
|
|
|
|
var checkBox = document.createElement("input");
|
|
|
|
checkBox.setAttribute("type", "checkbox");
|
|
|
|
li.appendChild(checkBox);
|
|
|
|
li.appendChild(document.createTextNode(" "));
|
2007-10-02 17:29:16 +02:00
|
|
|
$(checkBox).addClassName("checkBox");
|
2008-05-16 22:59:39 +02:00
|
|
|
checkBox.checked = 1;
|
2007-09-15 03:54:23 +02:00
|
|
|
|
|
|
|
var colorBox = document.createElement("div");
|
|
|
|
li.appendChild(colorBox);
|
2007-10-24 19:10:16 +02:00
|
|
|
li.appendChild(document.createTextNode(folderName));
|
2007-09-15 03:54:23 +02:00
|
|
|
colorBox.appendChild(document.createTextNode("OO"));
|
|
|
|
|
|
|
|
$(colorBox).addClassName("colorBox");
|
2007-10-24 17:52:08 +02:00
|
|
|
$(colorBox).addClassName('calendarFolder' + folderPath.substr(1));
|
2007-09-15 03:54:23 +02:00
|
|
|
|
2007-10-02 17:29:16 +02:00
|
|
|
// Register events (doesn't work with Safari)
|
2008-04-15 21:48:48 +02:00
|
|
|
setEventsOnCalendar(checkBox, li);
|
2007-10-02 17:29:16 +02:00
|
|
|
|
2007-10-23 16:39:29 +02:00
|
|
|
var url = URLForFolderID(folderPath) + "/canAccessContent";
|
|
|
|
triggerAjaxRequest(url, calendarEntryCallback, folderPath);
|
2007-09-15 03:54:23 +02:00
|
|
|
|
2007-10-23 16:39:29 +02:00
|
|
|
// Update CSS for events color
|
2008-04-22 19:16:37 +02:00
|
|
|
appendStyleElement(folderPath, "#AAAAAA");
|
2008-04-22 01:03:48 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function appendStyleElement(folderPath, color) {
|
2008-04-22 19:16:37 +02:00
|
|
|
if (document.styleSheets) {
|
|
|
|
var fgColor = getContrastingTextColor(color);
|
2007-11-06 23:34:42 +01:00
|
|
|
var styleElement = document.createElement("style");
|
|
|
|
styleElement.type = "text/css";
|
|
|
|
var selectors = [
|
|
|
|
'.calendarFolder' + folderPath.substr(1),
|
|
|
|
'div.colorBox.calendarFolder' + folderPath.substr(1)
|
|
|
|
];
|
|
|
|
var rules = [
|
2008-04-22 19:16:37 +02:00
|
|
|
' { background-color: ' + color + ' !important;'
|
|
|
|
+ ' color: ' + fgColor + ' !important; }',
|
2007-11-06 23:34:42 +01:00
|
|
|
' { color: ' + color + ' !important; }'
|
|
|
|
];
|
|
|
|
for (var i = 0; i < rules.length; i++)
|
|
|
|
if (styleElement.styleSheet && styleElement.styleSheet.addRule)
|
|
|
|
styleElement.styleSheet.addRule(selectors[i], rules[i]); // IE
|
|
|
|
else
|
|
|
|
styleElement.appendChild(document.createTextNode(selectors[i] + rules[i])); // Mozilla _+ Safari
|
|
|
|
document.getElementsByTagName("head")[0].appendChild(styleElement);
|
2007-09-15 00:01:02 +02:00
|
|
|
}
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function onFolderSubscribeCB(folderData) {
|
2007-10-02 17:29:16 +02:00
|
|
|
var folder = $(folderData["folder"]);
|
2008-01-24 22:36:51 +01:00
|
|
|
if (!folder)
|
|
|
|
appendCalendar(folderData["folderName"], folderData["folder"]);
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function onFolderUnsubscribeCB(folderId) {
|
2007-09-15 00:01:02 +02:00
|
|
|
var node = $(folderId);
|
|
|
|
node.parentNode.removeChild(node);
|
2007-10-23 16:39:29 +02:00
|
|
|
if (removeFolderRequestCount == 0) {
|
|
|
|
refreshEvents();
|
|
|
|
refreshTasks();
|
|
|
|
changeCalendarDisplay();
|
|
|
|
}
|
2007-03-29 20:05:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function onCalendarRemove(event) {
|
2007-10-23 16:39:29 +02:00
|
|
|
if (removeFolderRequestCount == 0) {
|
|
|
|
var nodes = $("calendarList").getSelectedNodes();
|
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
|
|
nodes[i].deselect();
|
2008-05-16 22:33:55 +02:00
|
|
|
var owner = nodes[i].getAttribute("owner");
|
|
|
|
if (owner != UserLogin) {
|
|
|
|
var folderId = nodes[i].getAttribute("id");
|
|
|
|
unsubscribeFromFolder(folderId, owner,
|
|
|
|
onFolderUnsubscribeCB, folderId);
|
2007-10-23 16:39:29 +02:00
|
|
|
}
|
2007-10-24 17:52:08 +02:00
|
|
|
else
|
|
|
|
deletePersonalCalendar(folderIdElements[0]);
|
2007-10-23 16:39:29 +02:00
|
|
|
}
|
2006-12-19 18:06:07 +01:00
|
|
|
}
|
2007-10-23 16:39:29 +02:00
|
|
|
|
2007-05-28 23:30:37 +02:00
|
|
|
preventDefault(event);
|
2006-12-14 22:20:13 +01:00
|
|
|
}
|
|
|
|
|
2007-10-24 17:52:08 +02:00
|
|
|
function deletePersonalCalendar(folderElement) {
|
|
|
|
var folderId = folderElement.substr(1);
|
2007-09-15 00:01:02 +02:00
|
|
|
var label
|
2007-10-24 17:52:08 +02:00
|
|
|
= labels["Are you sure you want to delete the calendar \"%{0}\"?"].formatted($(folderElement).lastChild.nodeValue.strip());
|
2007-09-15 00:01:02 +02:00
|
|
|
if (window.confirm(label)) {
|
2007-10-23 16:39:29 +02:00
|
|
|
removeFolderRequestCount++;
|
2007-09-15 00:01:02 +02:00
|
|
|
var url = ApplicationBaseURL + "/" + folderId + "/deleteFolder";
|
2007-10-23 16:39:29 +02:00
|
|
|
triggerAjaxRequest(url, deletePersonalCalendarCallback, folderId);
|
2007-09-15 00:01:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function deletePersonalCalendarCallback(http) {
|
|
|
|
if (http.readyState == 4) {
|
|
|
|
if (isHttpStatus204(http.status)) {
|
|
|
|
var ul = $("calendarList");
|
|
|
|
var children = ul.childNodesWithTag("li");
|
|
|
|
var i = 0;
|
|
|
|
var done = false;
|
|
|
|
while (!done && i < children.length) {
|
|
|
|
var currentFolderId = children[i].getAttribute("id").substr(1);
|
|
|
|
if (currentFolderId == http.callbackData) {
|
|
|
|
ul.removeChild(children[i]);
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
i++;
|
|
|
|
}
|
2007-10-23 16:39:29 +02:00
|
|
|
removeFolderRequestCount--;
|
|
|
|
if (removeFolderRequestCount == 0) {
|
|
|
|
refreshEvents();
|
|
|
|
refreshTasks();
|
|
|
|
changeCalendarDisplay();
|
|
|
|
}
|
2007-09-15 00:01:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
log ("ajax problem 5: " + http.status);
|
|
|
|
}
|
|
|
|
|
2007-06-08 01:23:07 +02:00
|
|
|
function configureLists() {
|
2008-01-24 22:36:51 +01:00
|
|
|
var list = $("tasksList");
|
|
|
|
list.multiselect = true;
|
2008-04-15 22:47:18 +02:00
|
|
|
list.observe("mousedown", onTasksSelectionChange);
|
2007-06-08 01:23:07 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
var input = $("showHideCompletedTasks");
|
2008-04-15 22:47:18 +02:00
|
|
|
input.observe("click", onShowCompletedTasks);
|
2007-06-08 01:23:07 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
list = $("eventsList");
|
|
|
|
list.multiselect = true;
|
|
|
|
configureSortableTableHeaders(list);
|
|
|
|
TableKit.Resizable.init(list, {'trueResize' : true, 'keepWidth' : true});
|
2008-04-15 22:47:18 +02:00
|
|
|
list.observe("mousedown", onEventsSelectionChange);
|
2007-06-08 01:23:07 +02:00
|
|
|
}
|
|
|
|
|
2007-07-05 21:13:59 +02:00
|
|
|
function initDateSelectorEvents() {
|
2008-01-24 22:36:51 +01:00
|
|
|
var arrow = $("rightArrow");
|
2008-04-15 22:47:18 +02:00
|
|
|
arrow.observe("click", onDateSelectorGotoMonth);
|
2008-01-24 22:36:51 +01:00
|
|
|
arrow = $("leftArrow");
|
2008-04-15 22:47:18 +02:00
|
|
|
arrow.observe("click", onDateSelectorGotoMonth);
|
2007-07-05 21:13:59 +02:00
|
|
|
|
2008-01-24 22:36:51 +01:00
|
|
|
var menuButton = $("monthLabel");
|
2008-04-15 22:47:18 +02:00
|
|
|
menuButton.observe("click", popupMonthMenu);
|
2008-01-24 22:36:51 +01:00
|
|
|
menuButton = $("yearLabel");
|
2008-04-15 22:47:18 +02:00
|
|
|
menuButton.observe("click", popupMonthMenu);
|
2007-07-05 21:13:59 +02:00
|
|
|
}
|
|
|
|
|
2006-12-14 22:20:13 +01:00
|
|
|
function initCalendars() {
|
2008-04-15 22:12:51 +02:00
|
|
|
sorting["attribute"] = "start";
|
|
|
|
sorting["ascending"] = true;
|
2007-12-06 18:29:32 +01:00
|
|
|
|
2008-04-15 22:12:51 +02:00
|
|
|
if (!document.body.hasClassName("popup")) {
|
|
|
|
initDateSelectorEvents();
|
|
|
|
initCalendarSelector();
|
|
|
|
configureSearchField();
|
|
|
|
configureLists();
|
|
|
|
var selector = $("calendarSelector");
|
|
|
|
if (selector)
|
|
|
|
selector.attachMenu("calendarsMenu");
|
|
|
|
}
|
2006-12-14 22:20:13 +01:00
|
|
|
}
|
|
|
|
|
2007-11-15 20:02:23 +01:00
|
|
|
FastInit.addOnLoad(initCalendars);
|