3 var listFilter = 'view_today';
5 var listOfSelection = null;
6 var selectedCalendarCell;
8 var hideCompletedTasks = 0;
11 var currentView = "dayview";
13 var cachedDateSelectors = new Array();
15 var contactSelectorAction = 'calendars-contacts';
17 var eventsToDelete = new Array();
18 var ownersOfEventsToDelete = new Array();
20 function newEvent(sender, type) {
21 var day = sender.getAttribute("day");
26 if (currentView == "multicolumndayview" && type == "event")
27 user = sender.parentNode.parentNode.getAttribute("user");
29 var hour = sender.getAttribute("hour");
30 var urlstr = UserFolderURL + "../" + user + "/Calendar/new" + type;
31 var params = new Array();
33 params.push("day=" + day);
35 params.push("hm=" + hour);
36 if (params.length > 0)
37 urlstr += "?" + params.join("&");
39 window.open(urlstr, "", "width=620,height=600,resizable=0");
41 return false; /* stop following the link */
44 function _editEventId(id, owner) {
47 urlBase = UserFolderURL + "../" + owner + "/";
48 urlBase += "Calendar/"
50 var urlstr = urlBase + id + "/edit";
52 var win = window.open(urlstr, "SOGo_edit_" + id,
53 "width=620,height=600,resizable=0,scrollbars=0,toolbar=0," +
54 "location=0,directories=0,status=0,menubar=0,copyhistory=0");
58 function editEvent() {
59 if (listOfSelection) {
60 var nodes = listOfSelection.getSelectedRows();
62 for (var i = 0; i < nodes.length; i++)
63 _editEventId(nodes[i].getAttribute("id"),
64 nodes[i].getAttribute("owner"));
65 } else if (selectedCalendarCell) {
66 _editEventId(selectedCalendarCell.getAttribute("aptCName"),
67 selectedCalendarCell.getAttribute("owner"));
70 return false; /* stop following the link */
73 function _batchDeleteEvents() {
74 var events = eventsToDelete.shift();
75 var owner = ownersOfEventsToDelete.shift();
76 var urlstr = (UserFolderURL + "../" + owner + "/Calendar/batchDelete?ids="
78 document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr,
83 function deleteEvent()
85 if (listOfSelection) {
86 var nodes = listOfSelection.getSelectedRows();
88 if (nodes.length > 0) {
90 if (listOfSelection == $("tasksList"))
91 label = labels["taskDeleteConfirmation"].decodeEntities();
93 label = labels["appointmentDeleteConfirmation"].decodeEntities();
96 if (document.deleteEventAjaxRequest) {
97 document.deleteEventAjaxRequest.aborted = true;
98 document.deleteEventAjaxRequest.abort();
100 var sortedNodes = new Array();
101 var owners = new Array();
103 for (var i = 0; i < nodes.length; i++) {
104 var owner = nodes[i].getAttribute("owner");
105 if (!sortedNodes[owner]) {
106 sortedNodes[owner] = new Array();
109 sortedNodes[owner].push(nodes[i].getAttribute("id"));
111 for (var i = 0; i < owners.length; i++) {
112 ownersOfEventsToDelete.push(owners[i]);
113 eventsToDelete.push(sortedNodes[owners[i]]);
115 _batchDeleteEvents();
119 else if (selectedCalendarCell) {
120 var label = labels["appointmentDeleteConfirmation"].decodeEntities();
121 if (confirm(label)) {
122 if (document.deleteEventAjaxRequest) {
123 document.deleteEventAjaxRequest.aborted = true;
124 document.deleteEventAjaxRequest.abort();
126 eventsToDelete.push([selectedCalendarCell.getAttribute("aptCName")]);
127 ownersOfEventsToDelete.push(selectedCalendarCell.getAttribute("owner"));
128 _batchDeleteEvents();
132 window.alert("no selection");
137 function modifyEvent(sender, modification) {
138 var currentLocation = '' + window.location;
139 var arr = currentLocation.split("/");
140 arr[arr.length-1] = modification;
142 document.modifyEventAjaxRequest = triggerAjaxRequest(arr.join("/"),
149 function closeInvitationWindow() {
150 var closeDiv = document.createElement("div");
151 closeDiv.addClassName("javascriptPopupBackground");
152 var closePseudoWin = document.createElement("div");
153 closePseudoWin.addClassName("javascriptMessagePseudoWindow");
154 closePseudoWin.style.top = "0px;";
155 closePseudoWin.style.left = "0px;";
156 closePseudoWin.style.right = "0px;";
157 closePseudoWin.appendChild(document.createTextNode(labels["closeThisWindowMessage"].decodeEntities()));
158 document.body.appendChild(closeDiv);
159 document.body.appendChild(closePseudoWin);
162 function modifyEventCallback(http) {
163 if (http.readyState == 4) {
164 if (http.status == 200) {
165 log("closing window...?");
166 if (queryParameters["mail-invitation"] == "yes")
167 closeInvitationWindow();
169 window.opener.setTimeout("refreshAppointmentsAndDisplay();", 100);
170 window.setTimeout("window.close();", 100);
174 log("showing alert...");
175 window.alert(labels["eventPartStatModificationError"]);
177 document.modifyEventAjaxRequest = null;
181 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)
206 _editEventId(node.getAttribute("id"),
207 node.getAttribute("owner"));
212 function onSelectAll() {
213 var list = $("appointmentsList");
214 list.selectRowsMatchingClass("appointmentRow");
219 function displayAppointment(event) {
220 _editEventId(this.getAttribute("aptCName"),
221 this.getAttribute("owner"));
223 event.preventDefault();
224 event.stopPropagation();
225 event.cancelBubble = true;
226 event.returnValue = false;
229 function onDaySelect(node)
231 var day = node.getAttribute("day");
232 var needRefresh = (listFilter == 'view_selectedday'
233 && day != currentDay);
235 var td = node.getParentWithTagName("td");
236 var table = td.getParentWithTagName("table");
238 // log ("table.selected: " + table.selected);
240 if (document.selectedDate)
241 document.selectedDate.deselect();
244 document.selectedDate = td;
246 changeCalendarDisplay( { "day": day } );
248 refreshAppointments();
253 function onDateSelectorGotoMonth(node)
255 var day = node.getAttribute("date");
257 changeDateSelectorDisplay(day, true);
262 function onCalendarGotoDay(node)
264 var day = node.getAttribute("date");
266 changeDateSelectorDisplay(day);
267 changeCalendarDisplay( { "day": day } );
274 changeDateSelectorDisplay('');
275 changeCalendarDisplay();
280 function setDateSelectorContent(content)
282 var div = $("dateSelectorView");
284 div.innerHTML = content;
285 if (currentDay.length > 0)
286 restoreCurrentDaySelection(div);
289 function dateSelectorCallback(http)
291 if (http.readyState == 4
292 && http.status == 200) {
293 document.dateSelectorAjaxRequest = null;
294 var content = http.responseText;
295 setDateSelectorContent(content);
296 cachedDateSelectors[http.callbackData] = content;
299 log ("ajax fuckage");
302 function appointmentsListCallback(http)
304 var div = $("appointmentsListView");
306 if (http.readyState == 4
307 && http.status == 200) {
308 document.appointmentsListAjaxRequest = null;
309 div.innerHTML = http.responseText;
310 var params = parseQueryParameters(http.callbackData);
311 sortKey = params["sort"];
312 sortOrder = params["desc"];
313 var list = $("appointmentsList");
314 list.addEventListener("selectionchange",
315 onAppointmentsSelectionChange, true);
316 configureSortableTableHeaders();
319 log ("ajax fuckage");
322 function tasksListCallback(http)
324 var div = $("tasksListView");
326 if (http.readyState == 4
327 && http.status == 200) {
328 document.tasksListAjaxRequest = null;
329 var list = $("tasksList");
330 var scroll = list.scrollTop;
331 div.innerHTML = http.responseText;
332 list = $("tasksList");
333 list.addEventListener("selectionchange",
334 onTasksSelectionChange, true);
335 list.scrollTop = scroll;
336 if (http.callbackData) {
337 var selectedNodesId = http.callbackData;
338 for (var i = 0; i < selectedNodesId.length; i++)
339 $(selectedNodesId[i]).select();
343 log ("ajax fuckage");
346 function restoreCurrentDaySelection(div)
348 var elements = div.getElementsByTagName("a");
351 while (!day && i < elements.length)
353 day = elements[i].getAttribute("day");
358 && day.substr(0, 6) == currentDay.substr(0, 6)) {
359 for (i = 0; i < elements.length; i++) {
360 day = elements[i].getAttribute("day");
361 if (day && day == currentDay) {
362 var td = elements[i].getParentWithTagName("td");
363 if (document.selectedDate)
364 document.selectedDate.deselect();
366 document.selectedDate = td;
372 function changeDateSelectorDisplay(day, keepCurrentDay)
374 var url = ApplicationBaseURL + "dateselector";
376 url += "?day=" + day;
378 if (day != currentDay) {
383 var month = day.substr(0, 6);
384 if (cachedDateSelectors[month]) {
385 // log ("restoring cached selector for month: " + month);
386 setDateSelectorContent(cachedDateSelectors[month]);
389 // log ("loading selector for month: " + month);
390 if (document.dateSelectorAjaxRequest) {
391 document.dateSelectorAjaxRequest.aborted = true;
392 document.dateSelectorAjaxRequest.abort();
394 document.dateSelectorAjaxRequest
395 = triggerAjaxRequest(url,
396 dateSelectorCallback,
402 function changeCalendarDisplay(time, newView)
404 var url = ApplicationBaseURL + ((newView) ? newView : currentView);
406 selectedCalendarCell = null;
418 url += "?day=" + day;
421 // log ("switching to view: " + newView);
422 // log ("changeCalendarDisplay: " + url);
424 if (document.dayDisplayAjaxRequest) {
425 // log ("aborting day ajaxrq");
426 document.dayDisplayAjaxRequest.aborted = true;
427 document.dayDisplayAjaxRequest.abort();
429 document.dayDisplayAjaxRequest = triggerAjaxRequest(url,
430 calendarDisplayCallback,
438 function _ensureView(view) {
439 if (currentView != view)
440 changeCalendarDisplay(null, view);
445 function onDayOverview()
447 return _ensureView("dayview");
450 function onMulticolumnDayOverview()
452 return _ensureView("multicolumndayview");
455 function onWeekOverview()
457 return _ensureView("weekview");
460 function onMonthOverview()
462 return _ensureView("monthview");
465 function scrollDayView(hour)
469 if (hour.length == 3)
470 rowNumber = parseInt(hour.substr(0, 1));
472 if (hour.substr(0, 1) == "0")
473 rowNumber = parseInt(hour.substr(1, 1));
475 rowNumber = parseInt(hour.substr(0, 2));
480 var daysView = $("daysView");
481 var hours = daysView.childNodesWithTag("div")[0].childNodesWithTag("div");
482 if (hours.length > 0)
483 daysView.parentNode.scrollTop = hours[rowNumber + 1].offsetTop;
486 function onClickableCellsDblClick(event) {
487 newEvent(this, 'event');
489 event.cancelBubble = true;
490 event.returnValue = false;
493 function calendarDisplayCallback(http)
495 var div = $("calendarView");
497 // log ("calendardisplaycallback: " + div);
498 if (http.readyState == 4
499 && http.status == 200) {
500 document.dayDisplayAjaxRequest = null;
501 div.innerHTML = http.responseText;
502 if (http.callbackData["view"])
503 currentView = http.callbackData["view"];
504 if (http.callbackData["day"])
505 currentDay = http.callbackData["day"];
507 if (http.callbackData["hour"])
508 hour = http.callbackData["hour"];
510 if (currentView == "monthview")
511 contentView = $("calendarContent");
515 contentView = $("daysView");
517 var appointments = document.getElementsByClassName("appointment", contentView);
518 for (var i = 0; i < appointments.length; i++) {
519 appointments[i].addEventListener("mousedown", listRowMouseDownHandler, true);
520 appointments[i].addEventListener("click", onCalendarSelectAppointment, false);
521 appointments[i].addEventListener("dblclick", displayAppointment, true);
523 var days = document.getElementsByClassName("day", contentView);
524 if (currentView == "monthview")
525 for (var i = 0; i < days.length; i++) {
526 days[i].addEventListener("click", onCalendarSelectDay, true);
527 days[i].addEventListener("dblclick", onClickableCellsDblClick, false);
530 for (var i = 0; i < days.length; i++) {
531 days[i].addEventListener("click", onCalendarSelectDay, false);
532 var clickableCells = document.getElementsByClassName("clickableHourCell",
534 for (var j = 0; j < clickableCells.length; j++)
535 clickableCells[j].addEventListener("dblclick",
536 onClickableCellsDblClick, false);
541 log ("ajax fuckage");
544 function assignCalendar(name)
548 node.calendar = new skycalendar(node);
549 node.calendar.setCalendarPage(ResourcesURL + "/skycalendar.html");
550 var dateFormat = node.getAttribute("dateFormat");
552 node.calendar.setDateFormat(dateFormat);
555 function popupCalendar(node)
557 var nodeId = node.getAttribute("inputId");
558 var input = $(nodeId);
559 input.calendar.popup();
564 function onAppointmentContextMenu(event, element)
566 var topNode = $("appointmentsList");
569 var menu = $("appointmentsListMenu");
571 menu.addEventListener("hideMenu", onAppointmentContextMenuHide, false);
572 onMenuClick(event, "appointmentsListMenu");
574 var topNode = $("appointmentsList");
575 var selectedNodes = topNode.getSelectedRows();
576 topNode.menuSelectedRows = selectedNodes;
577 for (var i = 0; i < selectedNodes.length; i++)
578 selectedNodes[i].deselect();
580 topNode.menuSelectedEntry = element;
584 function onAppointmentContextMenuHide(event)
586 var topNode = $("appointmentsList");
588 if (topNode.menuSelectedEntry) {
589 topNode.menuSelectedEntry.deselect();
590 topNode.menuSelectedEntry = null;
592 if (topNode.menuSelectedRows) {
593 var nodeIds = topNode.menuSelectedRows;
594 for (var i = 0; i < nodeIds.length; i++) {
595 var node = $(nodeIds[i]);
598 topNode.menuSelectedRows = null;
602 function onAppointmentsSelectionChange() {
603 listOfSelection = this;
604 this.removeClassName("_unfocused");
605 $("tasksList").addClassName("_unfocused");
608 function onTasksSelectionChange() {
609 listOfSelection = this;
610 this.removeClassName("_unfocused");
611 $("appointmentsList").addClassName("_unfocused");
614 function _loadAppointmentHref(href) {
615 if (document.appointmentsListAjaxRequest) {
616 document.appointmentsListAjaxRequest.aborted = true;
617 document.appointmentsListAjaxRequest.abort();
619 var url = ApplicationBaseURL + href;
620 document.appointmentsListAjaxRequest
621 = triggerAjaxRequest(url, appointmentsListCallback, href);
626 function _loadTasksHref(href) {
627 if (document.tasksListAjaxRequest) {
628 document.tasksListAjaxRequest.aborted = true;
629 document.tasksListAjaxRequest.abort();
631 url = ApplicationBaseURL + href;
633 var selectedIds = $("tasksList").getSelectedNodesId();
634 document.tasksListAjaxRequest
635 = triggerAjaxRequest(url, tasksListCallback, selectedIds);
640 function onHeaderClick(event) {
641 // log("onHeaderClick: " + this.link);
642 _loadAppointmentHref(this.link);
644 event.preventDefault();
647 function refreshAppointments() {
648 return _loadAppointmentHref("aptlist?desc=" + sortOrder
650 + "&day=" + currentDay
651 + "&filterpopup=" + listFilter);
654 function refreshTasks() {
655 return _loadTasksHref("taskslist?hide-completed=" + hideCompletedTasks);
658 function refreshAppointmentsAndDisplay()
660 refreshAppointments();
661 changeCalendarDisplay();
664 function onListFilterChange() {
665 var node = $("filterpopup");
667 listFilter = node.value;
668 // log ("listFilter = " + listFilter);
670 return refreshAppointments();
673 function onAppointmentClick(event)
675 var node = event.target.getParentWithTagName("tr");
676 var day = node.getAttribute("day");
677 var hour = node.getAttribute("hour");
679 changeCalendarDisplay( { "day": day, "hour": hour} );
680 changeDateSelectorDisplay(day);
682 return onRowClick(event);
685 function selectMonthInMenu(menu, month)
687 var entries = menu.childNodes[1].childNodesWithTag("LI");
688 for (i = 0; i < entries.length; i++) {
689 var entry = entries[i];
690 var entryMonth = entry.getAttribute("month");
691 if (entryMonth == month)
692 entry.addClassName("currentMonth");
694 entry.removeClassName("currentMonth");
698 function selectYearInMenu(menu, month)
700 var entries = menu.childNodes[1].childNodes;
701 for (i = 0; i < entries.length; i++) {
702 var entry = entries[i];
703 if (entry instanceof HTMLLIElement) {
704 var entryMonth = entry.innerHTML;
705 if (entryMonth == month)
706 entry.addClassName("currentMonth");
708 entry.removeClassName("currentMonth");
713 function popupMonthMenu(event, menuId)
715 var node = event.target;
717 if (event.button == 0) {
718 event.cancelBubble = true;
719 event.returnValue = false;
721 if (document.currentPopupMenu)
722 hideMenu(event, document.currentPopupMenu);
724 var popup = $(menuId);
725 var id = node.getAttribute("id");
726 if (id == "monthLabel")
727 selectMonthInMenu(popup, node.getAttribute("month"));
729 selectYearInMenu(popup, node.innerHTML);
731 var diff = (popup.offsetWidth - node.offsetWidth) /2;
733 popup.style.top = (node.offsetTop + 95) + "px";
734 popup.style.left = (node.offsetLeft - diff) + "px";
735 popup.style.visibility = "visible";
737 bodyOnClick = "" + document.body.getAttribute("onclick");
738 document.body.setAttribute("onclick", "onBodyClick('" + menuId + "');");
739 document.currentPopupMenu = popup;
743 function onMonthMenuItemClick(node)
745 var month = '' + node.getAttribute("month");
746 var year = '' + $("yearLabel").innerHTML;
748 changeDateSelectorDisplay(year+month+"01", true);
753 function onYearMenuItemClick(node) {
754 var month = '' + $("monthLabel").getAttribute("month");;
755 var year = '' + node.innerHTML;
757 changeDateSelectorDisplay(year+month+"01", true);
762 function onSearchFormSubmit() {
763 log ("search not implemented");
768 function onCalendarSelectAppointment() {
769 var list = $("appointmentsList");
772 var aptCName = this.getAttribute("aptCName");
773 if (selectedCalendarCell)
774 selectedCalendarCell.deselect();
776 selectedCalendarCell = this;
777 var row = $(aptCName);
779 var div = row.parentNode.parentNode.parentNode;
780 div.scrollTop = row.offsetTop - (div.offsetHeight / 2);
785 function onCalendarSelectDay(event) {
787 if (currentView == "multicolumndayview")
788 day = this.parentNode.getAttribute("day");
790 day = this.getAttribute("day");
791 var needRefresh = (listFilter == 'view_selectedday'
792 && day != currentDay);
794 if (currentView == 'weekview')
795 changeWeekCalendarDisplayOfSelectedDay(this);
796 else if (currentView == 'monthview')
797 changeMonthCalendarDisplayOfSelectedDay(this);
798 changeDateSelectorDisplay(day);
800 if (listOfSelection) {
801 listOfSelection.addClassName("_unfocused");
802 listOfSelection = null;
806 refreshAppointments();
809 function changeWeekCalendarDisplayOfSelectedDay(node) {
810 var days = document.getElementsByClassName("day", node.parentNode);
812 for (var i = 0; i < days.length; i++)
814 days[i].removeClassName("selectedDay");
816 node.addClassName("selectedDay");
819 function findMonthCalendarSelectedCell(table) {
820 var tbody = table.tBodies[0];
821 var rows = tbody.rows;
824 while (i < rows.length && !table.selectedCell) {
825 var cells = rows[i].cells;
827 while (j < cells.length && !table.selectedCell) {
828 if (cells[j].hasClassName("selectedDay"))
829 table.selectedCell = cells[j];
837 function changeMonthCalendarDisplayOfSelectedDay(node)
839 var tr = node.parentNode;
840 var table = tr.parentNode.parentNode;
842 if (!table.selectedCell)
843 findMonthCalendarSelectedCell(table);
845 if (table.selectedCell)
846 table.selectedCell.removeClassName("selectedDay");
847 table.selectedCell = node;
848 node.addClassName("selectedDay");
851 function onHideCompletedTasks(node)
853 hideCompletedTasks = (node.checked ? 1 : 0);
855 return refreshTasks();
858 function updateTaskStatus(node)
860 var taskId = node.parentNode.getAttribute("id");
861 var taskOwner = node.parentNode.getAttribute("owner");
862 var newStatus = (node.checked ? 1 : 0);
863 // log ("update task status: " + taskId);
865 var http = createHTTPClient();
867 url = (UserFolderURL + "../" + taskOwner + "/Calendar/"
868 + taskId + "/changeStatus?status=" + newStatus);
871 // log ("url: " + url);
872 // TODO: add parameter to signal that we are only interested in OK
874 http.open("GET", url, false /* not async */);
876 if (http.status == 200)
879 log ("no http client?");
884 function updateCalendarStatus()
886 var list = new Array();
888 var clist = $("calendarsList");
889 var nodes = clist.childNodesWithTag("ul")[0].childNodesWithTag("li");
890 for (var i = 0; i < nodes.length; i++) {
891 var input = nodes[i].childNodesWithTag("input")[0];
893 list.push(nodes[i].getAttribute("uid"));
897 list.push(nodes[0].getAttribute("uid"));
898 nodes[0].childNodesWithTag("input")[0].checked = true;
900 // ApplicationBaseURL = (UserFolderURL + "Groups/_custom_"
901 // + list.join(",") + "/Calendar/");
903 updateCalendarsList();
904 refreshAppointments();
906 changeCalendarDisplay();
911 function calendarUidsList()
915 var nodes = $("uixselector-calendarsList-display").childNodesWithTag("li");
916 for (var i = 0; i < nodes.length; i++) {
917 var currentNode = nodes[i];
918 var input = currentNode.childNodesWithTag("input")[0];
921 list += currentNode.getAttribute("uid") + ",";
924 return list.substr(0, list.length - 1);
927 // function updateCalendarContacts(contacts)
929 // var list = contacts.split(",");
931 // var clist = $("calendarsList");
932 // var nodes = clist.childNodes[5].childNodes;
933 // for (var i = 0; i < nodes.length; i++) {
934 // var currentNode = nodes[i];
935 // if (currentNode instanceof HTMLLIElement) {
936 // var input = currentNode.childNodes[3];
937 // if (!input.checked)
939 // list += currentNode.getAttribute("uid") + ",";
944 function inhibitMyCalendarEntry()
946 var clist = $("calendarsList");
947 var nodes = clist.childNodes[5].childNodes;
951 while (!done && i < nodes.length) {
952 var currentNode = nodes[i];
953 if (currentNode instanceof HTMLLIElement) {
954 var input = currentNode.childNodes[3];
955 if (currentNode.getAttribute("uid") == UserLogin) {
957 // currentNode.style.color = "#999;";
958 currentNode.style.fontWeight = "bold;";
959 // currentNode.setAttribute("onclick", "");
966 function userCalendarEntry(user, color) {
967 var li = document.createElement("li");
968 li.setAttribute("uid", user);
969 li.addEventListener("mousedown", listRowMouseDownHandler, false);
970 li.addEventListener("click", onRowClick, false);
971 var colorBox = document.createElement("span");
972 colorBox.addClassName("colorBox");
974 log("color: " + color);
975 colorBox.style.backgroundColor = color + ";";
977 li.appendChild(colorBox);
978 var checkBox = document.createElement("input");
979 checkBox.addClassName("checkBox");
980 checkBox.type = "checkbox";
981 checkBox.addEventListener("change", updateCalendarStatus, false);
982 li.appendChild(checkBox);
983 var text = document.createTextNode(" " + user);
984 li.appendChild(text);
989 function ensureSelfIfPresent() {
990 var ul = $("uixselector-calendarsList-display");
991 var list = ul.childNodesWithTag("li");
992 var selfEntry = userCalendarEntry(UserLogin, indexColor(0));
993 selfEntry.style.fontWeight = "bold;";
994 if (list.length < 1) {
995 ul.appendChild(selfEntry);
996 } else if (list[0].getAttribute("uid") != UserLogin) {
997 ul.insertBefore(selfEntry, list[0]);
1001 function updateCalendarsList(method)
1003 ensureSelfIfPresent();
1004 var url = (ApplicationBaseURL + "updateCalendars?ids="
1005 + calendarUidsList());
1006 if (document.calendarsListAjaxRequest) {
1007 document.calendarsListAjaxRequest.aborted = true;
1008 document.calendarsListAjaxRequest.abort();
1010 var http = createHTTPClient();
1013 http.open("GET", url, false);
1016 if (method == "removal")
1017 updateCalendarStatus();
1019 http = createHTTPClient();
1020 http.url = ApplicationBaseURL + "checkRights";
1021 http.open("GET", http.url, false /* not async */);
1023 if (http.status == 200
1024 && http.responseText.length > 0) {
1025 rights = http.responseText.split(",");
1026 var list = $("uixselector-calendarsList-display").childNodesWithTag("li");
1027 for (var i = 0; i < list.length; i++) {
1028 var input = list[i].childNodesWithTag("input")[0];
1029 if (rights[i] == "1") {
1030 list[i].removeClassName("denied");
1031 input.disabled = false;
1034 input.checked = false;
1035 input.disabled = true;
1036 list[i].addClassName("denied");
1043 function addContact(tag, fullContactName, contactId, contactName, contactEmail)
1045 var uids = $("uixselector-calendarsList-uidList");
1046 // log("addContact");
1049 var re = new RegExp("(^|,)" + contactId + "($|,)");
1051 if (!re.test(uids.value))
1053 if (uids.value.length > 0)
1054 uids.value += ',' + contactId;
1056 uids.value = contactId;
1057 var names = $("uixselector-calendarsList-display");
1058 var listElems = names.childNodesWithTag("li");
1059 var colorDef = indexColor(listElems.length);
1060 names.appendChild(userCalendarEntry(contactId, colorDef));
1062 var styles = document.getElementsByTagName("style");
1063 styles[0].innerHTML += ('.ownerIs' + contactId + ' {'
1064 + ' background-color: '
1066 + ' !important; }');
1073 function onChangeCalendar(list) {
1074 var form = document.forms.editform;
1075 var urlElems = form.getAttribute("action").split("/");
1076 urlElems[urlElems.length-4]
1077 = list.childNodesWithTag("option")[list.value].innerHTML;
1078 form.setAttribute("action", urlElems.join("/"));
1081 function validateBrowseURL(input) {
1082 var button = $("browseURLBtn");
1084 if (input.value.length) {
1085 if (!button.enabled)
1086 enableAnchor(button);
1087 } else if (!button.disabled)
1088 disableAnchor(button);
1091 function browseURL(anchor, event) {
1092 if (event.button == 0) {
1093 var input = $("url");
1094 var url = input.value;
1096 window.open(url, '_blank');
1102 function initializeMenus() {
1103 var menus = new Array("monthListMenu", "yearListMenu",
1104 "appointmentsListMenu", "calendarsMenu", "searchMenu");
1105 initMenusNamed(menus);
1107 $("calendarsList").attachMenu("calendarsMenu");
1109 var accessRightsMenuEntry = $("accessRightsMenuEntry");
1110 accessRightsMenuEntry.addEventListener("mouseup",
1111 onAccessRightsMenuEntryMouseUp,
1115 function onAccessRightsMenuEntryMouseUp(event) {
1116 var folders = $("uixselector-calendarsList-display");
1117 var selected = folders.getSelectedNodes()[0];
1118 var uid = selected.getAttribute("uid");
1119 log("application base url: " + ApplicationBaseURL);
1120 if (uid == UserLogin)
1121 url = ApplicationBaseURL + "acls";
1123 url = UserFolderURL + "../" + uid + "/Calendar/acls";
1125 openAclWindow(url, uid);
1128 function configureDragHandles() {
1129 var handle = $("verticalDragHandle");
1131 handle.addInterface(SOGoDragHandlesInterface);
1132 handle.leftBlock=$("leftPanel");
1133 handle.rightBlock=$("rightPanel");
1136 handle = $("rightDragHandle");
1138 handle.addInterface(SOGoDragHandlesInterface);
1139 handle.upperBlock=$("appointmentsListView");
1140 handle.lowerBlock=$("calendarView");
1144 function initCalendarContactsSelector() {
1145 var selector = $("calendarsList");
1146 inhibitMyCalendarEntry();
1147 updateCalendarStatus();
1148 selector.changeNotification = updateCalendarsList;
1150 var list = $("uixselector-calendarsList-display").childNodesWithTag("li");
1151 for (var i = 0; i < list.length; i++) {
1152 var input = list[i].childNodesWithTag("input")[0];
1153 input.addEventListener("change", updateCalendarStatus, false);
1157 function initCalendars() {
1158 if (!document.body.hasClassName("popup"))
1159 initCalendarContactsSelector();
1162 window.addEventListener("load", initCalendars, false);