1 /* JavaScript for SOGoCalendar */
5 var listFilter = 'view_today';
7 var listOfSelection = null;
8 var selectedCalendarCell;
10 var hideCompletedTasks = 0;
13 var currentView = "dayview";
15 var cachedDateSelectors = new Array();
17 var contactSelectorAction = 'calendars-contacts';
19 var eventsToDelete = new Array();
20 var ownersOfEventsToDelete = new Array();
22 function newEvent(sender, type) {
23 var day = sender.getAttribute("day");
28 if (sender.parentNode.getAttribute("id") != "toolbar"
29 && currentView == "multicolumndayview" && type == "event")
30 user = sender.parentNode.parentNode.getAttribute("user");
32 var hour = sender.getAttribute("hour");
33 var urlstr = UserFolderURL + "../" + user + "/Calendar/new" + type;
34 var params = new Array();
36 params.push("day=" + day);
38 params.push("hm=" + hour);
39 if (params.length > 0)
40 urlstr += "?" + params.join("&");
42 window.open(urlstr, "", "width=490,height=600,resizable=0");
44 return false; /* stop following the link */
47 function _editEventId(id, owner) {
50 urlBase = UserFolderURL + "../" + owner + "/";
51 urlBase += "Calendar/"
53 var urlstr = urlBase + id + "/edit";
55 var win = window.open(urlstr, "SOGo_edit_" + id,
56 "width=490,height=600,resizable=0");
60 function editEvent() {
61 if (listOfSelection) {
62 var nodes = listOfSelection.getSelectedRows();
64 for (var i = 0; i < nodes.length; i++)
65 _editEventId(nodes[i].getAttribute("id"),
66 nodes[i].getAttribute("owner"));
67 } else if (selectedCalendarCell) {
68 _editEventId(selectedCalendarCell.getAttribute("aptCName"),
69 selectedCalendarCell.getAttribute("owner"));
72 return false; /* stop following the link */
75 function _batchDeleteEvents() {
76 var events = eventsToDelete.shift();
77 var owner = ownersOfEventsToDelete.shift();
78 var urlstr = (UserFolderURL + "../" + owner + "/Calendar/batchDelete?ids="
80 document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr,
85 function deleteEvent() {
86 if (listOfSelection) {
87 var nodes = listOfSelection.getSelectedRows();
89 if (nodes.length > 0) {
91 if (listOfSelection == $("tasksList"))
92 label = labels["taskDeleteConfirmation"].decodeEntities();
94 label = labels["appointmentDeleteConfirmation"].decodeEntities();
97 if (document.deleteEventAjaxRequest) {
98 document.deleteEventAjaxRequest.aborted = true;
99 document.deleteEventAjaxRequest.abort();
101 var sortedNodes = new Array();
102 var owners = new Array();
104 for (var i = 0; i < nodes.length; i++) {
105 var owner = nodes[i].getAttribute("owner");
106 if (!sortedNodes[owner]) {
107 sortedNodes[owner] = new Array();
110 sortedNodes[owner].push(nodes[i].getAttribute("id"));
112 for (var i = 0; i < owners.length; i++) {
113 ownersOfEventsToDelete.push(owners[i]);
114 eventsToDelete.push(sortedNodes[owners[i]]);
116 _batchDeleteEvents();
120 else if (selectedCalendarCell) {
121 var label = labels["appointmentDeleteConfirmation"].decodeEntities();
122 if (confirm(label)) {
123 if (document.deleteEventAjaxRequest) {
124 document.deleteEventAjaxRequest.aborted = true;
125 document.deleteEventAjaxRequest.abort();
127 eventsToDelete.push([selectedCalendarCell.getAttribute("aptCName")]);
128 ownersOfEventsToDelete.push(selectedCalendarCell.getAttribute("owner"));
129 _batchDeleteEvents();
133 window.alert("no selection");
138 function modifyEvent(sender, modification) {
139 var currentLocation = '' + window.location;
140 var arr = currentLocation.split("/");
141 arr[arr.length-1] = modification;
143 document.modifyEventAjaxRequest = triggerAjaxRequest(arr.join("/"),
150 function closeInvitationWindow() {
151 var closeDiv = document.createElement("div");
152 closeDiv.addClassName("javascriptPopupBackground");
153 var closePseudoWin = document.createElement("div");
154 closePseudoWin.addClassName("javascriptMessagePseudoWindow");
155 closePseudoWin.style.top = "0px;";
156 closePseudoWin.style.left = "0px;";
157 closePseudoWin.style.right = "0px;";
158 closePseudoWin.appendChild(document.createTextNode(labels["closeThisWindowMessage"].decodeEntities()));
159 document.body.appendChild(closeDiv);
160 document.body.appendChild(closePseudoWin);
163 function modifyEventCallback(http) {
164 if (http.readyState == 4) {
165 if (http.status == 200) {
166 log("closing window...?");
167 if (queryParameters["mail-invitation"] == "yes")
168 closeInvitationWindow();
170 window.opener.setTimeout("refreshAppointmentsAndDisplay();", 100);
171 window.setTimeout("window.close();", 100);
175 log("showing alert...");
176 window.alert(labels["eventPartStatModificationError"]);
178 document.modifyEventAjaxRequest = null;
182 function deleteEventCallback(http) {
183 if (http.readyState == 4
184 && http.status == 200) {
185 var nodes = http.callbackData;
186 for (var i = 0; i < nodes.length; i++) {
187 var node = $(nodes[i]);
189 node.parentNode.removeChild(node);
191 if (eventsToDelete.length)
192 _batchDeleteEvents();
194 document.deleteEventAjaxRequest = null;
195 refreshAppointments();
197 changeCalendarDisplay();
201 log ("ajax fuckage");
204 function editDoubleClickedEvent(node) {
205 _editEventId(node.getAttribute("id"),
206 node.getAttribute("owner"));
211 function onSelectAll() {
212 var list = $("appointmentsList");
213 list.selectRowsMatchingClass("appointmentRow");
218 function displayAppointment(event) {
219 _editEventId(this.getAttribute("aptCName"),
220 this.getAttribute("owner"));
222 event.preventDefault();
223 event.stopPropagation();
224 event.cancelBubble = true;
225 event.returnValue = false;
228 function onDaySelect(node) {
229 var day = node.getAttribute("day");
230 var needRefresh = (listFilter == 'view_selectedday'
231 && day != currentDay);
233 var td = node.getParentWithTagName("td");
234 var table = td.getParentWithTagName("table");
236 // log ("table.selected: " + table.selected);
238 if (document.selectedDate)
239 document.selectedDate.deselect();
242 document.selectedDate = td;
244 changeCalendarDisplay( { "day": day } );
246 refreshAppointments();
251 function onDateSelectorGotoMonth(node) {
252 var day = node.getAttribute("date");
254 changeDateSelectorDisplay(day, true);
259 function onCalendarGotoDay(node) {
260 var day = node.getAttribute("date");
262 changeDateSelectorDisplay(day);
263 changeCalendarDisplay( { "day": day } );
268 function gotoToday() {
269 changeDateSelectorDisplay('');
270 changeCalendarDisplay();
275 function setDateSelectorContent(content) {
276 var div = $("dateSelectorView");
278 div.innerHTML = content;
279 if (currentDay.length > 0)
280 restoreCurrentDaySelection(div);
283 function dateSelectorCallback(http) {
284 if (http.readyState == 4
285 && http.status == 200) {
286 document.dateSelectorAjaxRequest = null;
287 var content = http.responseText;
288 setDateSelectorContent(content);
289 cachedDateSelectors[http.callbackData] = content;
292 log ("ajax fuckage");
295 function appointmentsListCallback(http) {
296 var div = $("appointmentsListView");
298 if (http.readyState == 4
299 && http.status == 200) {
300 document.appointmentsListAjaxRequest = null;
301 div.innerHTML = http.responseText;
302 var params = parseQueryParameters(http.callbackData);
303 sortKey = params["sort"];
304 sortOrder = params["desc"];
305 var list = $("appointmentsList");
306 list.addEventListener("selectionchange",
307 onAppointmentsSelectionChange, true);
308 configureSortableTableHeaders();
311 log ("ajax fuckage");
314 function tasksListCallback(http) {
315 var div = $("tasksListView");
317 if (http.readyState == 4
318 && http.status == 200) {
319 document.tasksListAjaxRequest = null;
320 var list = $("tasksList");
321 var scroll = list.scrollTop;
322 div.innerHTML = http.responseText;
323 list = $("tasksList");
324 list.addEventListener("selectionchange",
325 onTasksSelectionChange, true);
326 list.scrollTop = scroll;
327 if (http.callbackData) {
328 var selectedNodesId = http.callbackData;
329 for (var i = 0; i < selectedNodesId.length; i++)
330 $(selectedNodesId[i]).select();
334 log ("ajax fuckage");
337 function restoreCurrentDaySelection(div) {
338 var elements = div.getElementsByTagName("a");
341 while (!day && i < elements.length)
343 day = elements[i].getAttribute("day");
348 && day.substr(0, 6) == currentDay.substr(0, 6)) {
349 for (i = 0; i < elements.length; i++) {
350 day = elements[i].getAttribute("day");
351 if (day && day == currentDay) {
352 var td = elements[i].getParentWithTagName("td");
353 if (document.selectedDate)
354 document.selectedDate.deselect();
356 document.selectedDate = td;
362 function changeDateSelectorDisplay(day, keepCurrentDay) {
363 var url = ApplicationBaseURL + "dateselector";
365 url += "?day=" + day;
367 if (day != currentDay) {
372 var month = day.substr(0, 6);
373 if (cachedDateSelectors[month]) {
374 // log ("restoring cached selector for month: " + month);
375 setDateSelectorContent(cachedDateSelectors[month]);
378 // log ("loading selector for month: " + month);
379 if (document.dateSelectorAjaxRequest) {
380 document.dateSelectorAjaxRequest.aborted = true;
381 document.dateSelectorAjaxRequest.abort();
383 document.dateSelectorAjaxRequest
384 = triggerAjaxRequest(url,
385 dateSelectorCallback,
391 function changeCalendarDisplay(time, newView) {
392 var url = ApplicationBaseURL + ((newView) ? newView : currentView);
394 selectedCalendarCell = null;
406 url += "?day=" + day;
409 // log ("switching to view: " + newView);
410 // log ("changeCalendarDisplay: " + url);
412 if (document.dayDisplayAjaxRequest) {
413 // log ("aborting day ajaxrq");
414 document.dayDisplayAjaxRequest.aborted = true;
415 document.dayDisplayAjaxRequest.abort();
417 document.dayDisplayAjaxRequest = triggerAjaxRequest(url,
418 calendarDisplayCallback,
426 function _ensureView(view) {
427 if (currentView != view)
428 changeCalendarDisplay(null, view);
433 function onDayOverview() {
434 return _ensureView("dayview");
437 function onMulticolumnDayOverview() {
438 return _ensureView("multicolumndayview");
441 function onWeekOverview() {
442 return _ensureView("weekview");
445 function onMonthOverview() {
446 return _ensureView("monthview");
449 function scrollDayView(hour) {
452 if (hour.length == 3)
453 rowNumber = parseInt(hour.substr(0, 1));
455 if (hour.substr(0, 1) == "0")
456 rowNumber = parseInt(hour.substr(1, 1));
458 rowNumber = parseInt(hour.substr(0, 2));
463 var daysView = $("daysView");
464 var hours = daysView.childNodesWithTag("div")[0].childNodesWithTag("div");
465 if (hours.length > 0)
466 daysView.parentNode.scrollTop = hours[rowNumber + 1].offsetTop;
469 function onClickableCellsDblClick(event) {
470 newEvent(this, 'event');
472 event.cancelBubble = true;
473 event.returnValue = false;
476 function calendarDisplayCallback(http) {
477 var div = $("calendarView");
479 // log ("calendardisplaycallback: " + div);
480 if (http.readyState == 4
481 && http.status == 200) {
482 document.dayDisplayAjaxRequest = null;
483 div.innerHTML = http.responseText;
484 if (http.callbackData["view"])
485 currentView = http.callbackData["view"];
486 if (http.callbackData["day"])
487 currentDay = http.callbackData["day"];
489 if (http.callbackData["hour"])
490 hour = http.callbackData["hour"];
492 if (currentView == "monthview")
493 contentView = $("calendarContent");
497 contentView = $("daysView");
499 var appointments = document.getElementsByClassName("appointment", contentView);
500 for (var i = 0; i < appointments.length; i++) {
501 appointments[i].addEventListener("mousedown", listRowMouseDownHandler, true);
502 appointments[i].addEventListener("click", onCalendarSelectAppointment, false);
503 appointments[i].addEventListener("dblclick", displayAppointment, true);
505 var days = document.getElementsByClassName("day", contentView);
506 if (currentView == "monthview")
507 for (var i = 0; i < days.length; i++) {
508 days[i].addEventListener("click", onCalendarSelectDay, true);
509 days[i].addEventListener("dblclick", onClickableCellsDblClick, false);
512 for (var i = 0; i < days.length; i++) {
513 days[i].addEventListener("click", onCalendarSelectDay, false);
514 var clickableCells = document.getElementsByClassName("clickableHourCell",
516 for (var j = 0; j < clickableCells.length; j++)
517 clickableCells[j].addEventListener("dblclick",
518 onClickableCellsDblClick, false);
523 log ("ajax fuckage");
526 function assignCalendar(name) {
527 if (typeof(skycalendar) != "undefined") {
530 node.calendar = new skycalendar(node);
531 node.calendar.setCalendarPage(ResourcesURL + "/skycalendar.html");
532 var dateFormat = node.getAttribute("dateFormat");
534 node.calendar.setDateFormat(dateFormat);
538 function popupCalendar(node) {
539 var nodeId = node.getAttribute("inputId");
540 var input = $(nodeId);
541 input.calendar.popup();
546 function onAppointmentContextMenu(event, element) {
547 var topNode = $("appointmentsList");
550 var menu = $("appointmentsListMenu");
552 menu.addEventListener("hideMenu", onAppointmentContextMenuHide, false);
553 onMenuClick(event, "appointmentsListMenu");
555 var topNode = $("appointmentsList");
556 var selectedNodes = topNode.getSelectedRows();
557 topNode.menuSelectedRows = selectedNodes;
558 for (var i = 0; i < selectedNodes.length; i++)
559 selectedNodes[i].deselect();
561 topNode.menuSelectedEntry = element;
565 function onAppointmentContextMenuHide(event) {
566 var topNode = $("appointmentsList");
568 if (topNode.menuSelectedEntry) {
569 topNode.menuSelectedEntry.deselect();
570 topNode.menuSelectedEntry = null;
572 if (topNode.menuSelectedRows) {
573 var nodeIds = topNode.menuSelectedRows;
574 for (var i = 0; i < nodeIds.length; i++) {
575 var node = $(nodeIds[i]);
578 topNode.menuSelectedRows = null;
582 function onAppointmentsSelectionChange() {
583 listOfSelection = this;
584 this.removeClassName("_unfocused");
585 $("tasksList").addClassName("_unfocused");
588 function onTasksSelectionChange() {
589 listOfSelection = this;
590 this.removeClassName("_unfocused");
591 $("appointmentsList").addClassName("_unfocused");
594 function _loadAppointmentHref(href) {
595 if (document.appointmentsListAjaxRequest) {
596 document.appointmentsListAjaxRequest.aborted = true;
597 document.appointmentsListAjaxRequest.abort();
599 var url = ApplicationBaseURL + href;
600 document.appointmentsListAjaxRequest
601 = triggerAjaxRequest(url, appointmentsListCallback, href);
606 function _loadTasksHref(href) {
607 if (document.tasksListAjaxRequest) {
608 document.tasksListAjaxRequest.aborted = true;
609 document.tasksListAjaxRequest.abort();
611 url = ApplicationBaseURL + href;
613 var selectedIds = $("tasksList").getSelectedNodesId();
614 document.tasksListAjaxRequest
615 = triggerAjaxRequest(url, tasksListCallback, selectedIds);
620 function onHeaderClick(event) {
621 // log("onHeaderClick: " + this.link);
622 _loadAppointmentHref(this.link);
624 event.preventDefault();
627 function refreshAppointments() {
628 return _loadAppointmentHref("aptlist?desc=" + sortOrder
630 + "&day=" + currentDay
631 + "&filterpopup=" + listFilter);
634 function refreshTasks() {
635 return _loadTasksHref("taskslist?hide-completed=" + hideCompletedTasks);
638 function refreshAppointmentsAndDisplay() {
639 refreshAppointments();
640 changeCalendarDisplay();
643 function onListFilterChange() {
644 var node = $("filterpopup");
646 listFilter = node.value;
647 // log ("listFilter = " + listFilter);
649 return refreshAppointments();
652 function onAppointmentClick(event) {
653 var node = event.target.getParentWithTagName("tr");
654 var day = node.getAttribute("day");
655 var hour = node.getAttribute("hour");
657 changeCalendarDisplay( { "day": day, "hour": hour} );
658 changeDateSelectorDisplay(day);
660 return onRowClick(event);
663 function selectMonthInMenu(menu, month) {
664 var entries = menu.childNodes[1].childNodesWithTag("LI");
665 for (i = 0; i < entries.length; i++) {
666 var entry = entries[i];
667 var entryMonth = entry.getAttribute("month");
668 if (entryMonth == month)
669 entry.addClassName("currentMonth");
671 entry.removeClassName("currentMonth");
675 function selectYearInMenu(menu, month) {
676 var entries = menu.childNodes[1].childNodes;
677 for (i = 0; i < entries.length; i++) {
678 var entry = entries[i];
679 if (entry instanceof HTMLLIElement) {
680 var entryMonth = entry.innerHTML;
681 if (entryMonth == month)
682 entry.addClassName("currentMonth");
684 entry.removeClassName("currentMonth");
689 function popupMonthMenu(event, menuId) {
690 var node = event.target;
692 if (event.button == 0) {
693 event.cancelBubble = true;
694 event.returnValue = false;
696 if (document.currentPopupMenu)
697 hideMenu(event, document.currentPopupMenu);
699 var popup = $(menuId);
700 var id = node.getAttribute("id");
701 if (id == "monthLabel")
702 selectMonthInMenu(popup, node.getAttribute("month"));
704 selectYearInMenu(popup, node.innerHTML);
706 var diff = (popup.offsetWidth - node.offsetWidth) /2;
708 popup.style.top = (node.offsetTop + 95) + "px";
709 popup.style.left = (node.offsetLeft - diff) + "px";
710 popup.style.visibility = "visible";
712 bodyOnClick = "" + document.body.getAttribute("onclick");
713 document.body.setAttribute("onclick", "onBodyClick('" + menuId + "');");
714 document.currentPopupMenu = popup;
718 function onMonthMenuItemClick(node) {
719 var month = '' + node.getAttribute("month");
720 var year = '' + $("yearLabel").innerHTML;
722 changeDateSelectorDisplay(year+month+"01", true);
727 function onYearMenuItemClick(node) {
728 var month = '' + $("monthLabel").getAttribute("month");;
729 var year = '' + node.innerHTML;
731 changeDateSelectorDisplay(year+month+"01", true);
736 function onSearchFormSubmit() {
737 log ("search not implemented");
742 function onCalendarSelectAppointment() {
743 var list = $("appointmentsList");
746 var aptCName = this.getAttribute("aptCName");
747 if (selectedCalendarCell)
748 selectedCalendarCell.deselect();
750 selectedCalendarCell = this;
751 var row = $(aptCName);
753 var div = row.parentNode.parentNode.parentNode;
754 div.scrollTop = row.offsetTop - (div.offsetHeight / 2);
759 function onCalendarSelectDay(event) {
761 if (currentView == "multicolumndayview")
762 day = this.parentNode.getAttribute("day");
764 day = this.getAttribute("day");
765 var needRefresh = (listFilter == 'view_selectedday'
766 && day != currentDay);
768 if (currentView == 'weekview')
769 changeWeekCalendarDisplayOfSelectedDay(this);
770 else if (currentView == 'monthview')
771 changeMonthCalendarDisplayOfSelectedDay(this);
772 changeDateSelectorDisplay(day);
774 if (listOfSelection) {
775 listOfSelection.addClassName("_unfocused");
776 listOfSelection = null;
780 refreshAppointments();
783 function changeWeekCalendarDisplayOfSelectedDay(node) {
784 var days = document.getElementsByClassName("day", node.parentNode);
786 for (var i = 0; i < days.length; i++)
788 days[i].removeClassName("selectedDay");
790 node.addClassName("selectedDay");
793 function findMonthCalendarSelectedCell(daysContainer) {
797 while (!found && i < daysContainer.childNodes.length) {
798 var currentNode = daysContainer.childNodes[i];
799 if (currentNode instanceof HTMLDivElement
800 && currentNode.hasClassName("selectedDay")) {
801 daysContainer.selectedCell = currentNode;
809 function changeMonthCalendarDisplayOfSelectedDay(node) {
810 var daysContainer = node.parentNode;
811 if (!daysContainer.selectedCell)
812 findMonthCalendarSelectedCell(daysContainer);
814 if (daysContainer.selectedCell)
815 daysContainer.selectedCell.removeClassName("selectedDay");
816 daysContainer.selectedCell = node;
817 node.addClassName("selectedDay");
820 function onHideCompletedTasks(node) {
821 hideCompletedTasks = (node.checked ? 1 : 0);
823 return refreshTasks();
826 function updateTaskStatus(node) {
827 var taskId = node.parentNode.getAttribute("id");
828 var taskOwner = node.parentNode.getAttribute("owner");
829 var newStatus = (node.checked ? 1 : 0);
830 // log ("update task status: " + taskId);
832 var http = createHTTPClient();
834 url = (UserFolderURL + "../" + taskOwner + "/Calendar/"
835 + taskId + "/changeStatus?status=" + newStatus);
838 // log ("url: " + url);
839 // TODO: add parameter to signal that we are only interested in OK
841 http.open("GET", url, false /* not async */);
843 if (http.status == 200)
846 log ("no http client?");
851 function updateCalendarStatus(event) {
852 var list = new Array();
854 var nodes = $("calendarList").childNodesWithTag("li");
855 for (var i = 0; i < nodes.length; i++) {
856 var input = nodes[i].childNodesWithTag("input")[0];
858 var folderId = nodes[i].getAttribute("id");
859 var elems = folderId.split(":");
860 if (elems.length > 1)
863 list.push(UserLogin);
868 list.push(UserLogin);
869 nodes[0].childNodesWithTag("input")[0].checked = true;
871 // ApplicationBaseURL = (UserFolderURL + "Groups/_custom_"
872 // + list.join(",") + "/Calendar/");
875 var folderID = this.parentNode.getAttribute("id");
876 var urlstr = URLForFolderID(folderID);
878 urlstr += "/activateFolder";
880 urlstr += "/deactivateFolder";
881 triggerAjaxRequest(urlstr, calendarStatusCallback, folderID);
884 updateCalendarsList();
885 refreshAppointments();
887 changeCalendarDisplay();
893 function calendarStatusCallback(http) {
894 if (http.readyState == 4) {
895 if (http.status == 204) {
896 refreshAppointments();
898 changeCalendarDisplay();
901 var folder = $(http.callbackData);
902 var input = folder.childNodesWithTag("input")[0];
903 input.checked = (!input.checked);
908 function calendarEntryCallback(http) {
911 if (http.readyState == 4) {
912 if (http.status == 200)
913 disabled = (http.responseText == "0");
914 var entry = $(http.callbackData);
915 var input = entry.childNodesWithTag("input")[0];
916 input.disabled = disabled;
918 input.checked = false;
919 entry.addClassName("denied");
922 entry.removeClassName("denied");
926 function updateCalendarsList(method) {
927 var list = $("calendarList").childNodesWithTag("li");
928 for (var i = 0; i < list.length; i++) {
929 var folderID = list[i].getAttribute("id");
930 var url = URLForFolderID(folderID) + "/canAccessContent";
931 triggerAjaxRequest(url, calendarEntryCallback, folderID);
935 function addContact(tag, fullContactName, contactId, contactName, contactEmail) {
936 var uids = $("uixselector-calendarsList-uidList");
937 // log("addContact");
940 var re = new RegExp("(^|,)" + contactId + "($|,)");
942 if (!re.test(uids.value))
944 if (uids.value.length > 0)
945 uids.value += ',' + contactId;
947 uids.value = contactId;
948 var names = $("calendarList");
949 var listElems = names.childNodesWithTag("li");
950 var colorDef = indexColor(listElems.length);
951 names.appendChild(userCalendarEntry(contactId, colorDef));
959 function validateBrowseURL(input) {
960 var button = $("browseURLBtn");
962 if (input.value.length) {
964 enableAnchor(button);
965 } else if (!button.disabled)
966 disableAnchor(button);
969 function browseURL(anchor, event) {
970 if (event.button == 0) {
971 var input = $("url");
972 var url = input.value;
974 window.open(url, '_blank');
980 function initializeMenus() {
981 var menus = new Array("monthListMenu", "yearListMenu",
982 "appointmentsListMenu", "calendarsMenu", "searchMenu");
983 initMenusNamed(menus);
985 $("calendarSelector").attachMenu("calendarsMenu");
987 var accessRightsMenuEntry = $("accessRightsMenuEntry");
988 accessRightsMenuEntry.addEventListener("mouseup",
989 onAccessRightsMenuEntryMouseUp,
993 function onAccessRightsMenuEntryMouseUp(event) {
994 var folders = $("calendarList");
995 var selected = folders.getSelectedNodes()[0];
996 var folderID = selected.getAttribute("id");
997 var urlstr = URLForFolderID(folderID) + "/acls";
999 openAclWindow(urlstr);
1002 function configureDragHandles() {
1003 var handle = $("verticalDragHandle");
1005 handle.addInterface(SOGoDragHandlesInterface);
1006 handle.leftBlock=$("leftPanel");
1007 handle.rightBlock=$("rightPanel");
1010 handle = $("rightDragHandle");
1012 handle.addInterface(SOGoDragHandlesInterface);
1013 handle.upperBlock=$("appointmentsListView");
1014 handle.lowerBlock=$("calendarView");
1018 function initCalendarSelector() {
1019 var selector = $("calendarSelector");
1020 updateCalendarStatus();
1021 selector.changeNotification = updateCalendarsList;
1023 var list = $("calendarList").childNodesWithTag("li");
1024 for (var i = 0; i < list.length; i++) {
1025 var input = list[i].childNodesWithTag("input")[0];
1026 input.addEventListener("change", updateCalendarStatus, false);
1027 list[i].addEventListener("mousedown", listRowMouseDownHandler, false);
1028 list[i].addEventListener("click", onRowClick, false);
1029 // list[i].addEventListener("contextmenu", onContactFoldersContextMenu, false);
1032 var links = $("calendarSelectorButtons").childNodesWithTag("a");
1033 links[0].addEventListener("click", onCalendarAdd, false);
1034 links[1].addEventListener("click", onCalendarRemove, false);
1037 function onCalendarAdd(event) {
1038 openUserFolderSelector(onFolderSubscribeCB, "calendar");
1040 event.preventDefault();
1043 function appendCalendar(folderName, folder) {
1044 var calendarList = $("calendarList");
1045 var lis = calendarList.childNodesWithTag("li");
1046 var color = indexColor(lis.length);
1047 log ("color: " + color);
1048 var li = document.createElement("li");
1049 li.setAttribute("id", folder);
1050 li.addEventListener("mousedown", listRowMouseDownHandler, false);
1051 li.addEventListener("click", onRowClick, false);
1052 var checkBox = document.createElement("input");
1053 checkBox.addClassName("checkBox");
1054 checkBox.type = "checkbox";
1055 checkBox.addEventListener("change", updateCalendarStatus, false);
1056 li.appendChild(checkBox);
1057 var colorBox = document.createElement("div");
1058 colorBox.appendChild(document.createTextNode("OO"));
1059 colorBox.addClassName("colorBox");
1061 colorBox.style.color = color + ";";
1062 colorBox.style.backgroundColor = color + ";";
1064 li.appendChild(colorBox);
1065 li.appendChild(document.createTextNode(folderName));
1067 calendarList.appendChild(li);
1069 var contactId = folder.split(":")[0];
1070 var styles = document.getElementsByTagName("style");
1071 styles[0].innerHTML += ('.ownerIs' + contactId + ' {'
1074 + ' background-color: '
1076 + ' !important; }');
1079 function onFolderSubscribeCB(folderData) {
1080 var folder = $(folderData["folder"]);
1082 appendCalendar(folderData["folderName"], folderData["folder"]);
1085 function onFolderUnsubscribeCB(folderId) {
1086 var node = $(folderId);
1087 node.parentNode.removeChild(node);
1090 function onCalendarRemove(event) {
1091 var nodes = $("calendarList").getSelectedNodes();
1092 if (nodes.length > 0) {
1093 nodes[0].deselect();
1094 var folderId = nodes[0].getAttribute("id");
1095 var folderIdElements = folderId.split(":");
1096 if (folderIdElements.length > 1) {
1097 unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId);
1101 event.preventDefault();
1104 function configureSearchField() {
1105 var searchValue = $("searchValue");
1107 searchValue.addEventListener("mousedown", onSearchMouseDown, false);
1108 searchValue.addEventListener("click", popupSearchMenu, false);
1109 searchValue.addEventListener("blur", onSearchBlur, false);
1110 searchValue.addEventListener("focus", onSearchFocus, false);
1111 searchValue.addEventListener("keydown", onSearchKeyDown, false);
1114 function initCalendars() {
1115 if (!document.body.hasClassName("popup")) {
1116 initCalendarSelector();
1117 configureSearchField();
1121 window.addEventListener("load", initCalendars, false);