3 var listFilter = 'view_today';
5 var listOfSelection = null;
7 var hideCompletedTasks = 0;
10 var currentView = "dayview";
12 var cachedDateSelectors = new Array();
14 var contactSelectorAction = 'calendars-contacts';
16 var eventsToDelete = new Array();
17 var ownersOfEventsToDelete = new Array();
19 function newEvent(sender, type) {
20 var day = sender.getAttribute("day");
24 var hour = sender.getAttribute("hour");
25 var urlstr = ApplicationBaseURL + "new" + type;
26 var params = new Array();
28 params.push("day=" + day);
30 params.push("hm=" + hour);
31 if (params.length > 0)
32 urlstr += "?" + params.join("&");
34 window.open(urlstr, "", "width=620,height=600,resizable=0");
36 return false; /* stop following the link */
39 function _editEventId(id, owner) {
42 urlBase = UserFolderURL + "../" + owner + "/";
43 urlBase += "Calendar/"
45 var urlstr = urlBase + id + "/edit";
47 var win = window.open(urlstr, "SOGo_edit_" + id,
48 "width=620,height=600,resizable=0,scrollbars=0,toolbar=0," +
49 "location=0,directories=0,status=0,menubar=0,copyhistory=0");
53 function editEvent() {
54 if (listOfSelection) {
55 var nodes = listOfSelection.getSelectedRows();
57 for (var i = 0; i < nodes.length; i++)
58 _editEventId(nodes[i].getAttribute("id"),
59 nodes[i].getAttribute("owner"));
62 return false; /* stop following the link */
65 function _batchDeleteEvents() {
66 var events = eventsToDelete.shift();
67 var owner = ownersOfEventsToDelete.shift();
68 var urlstr = (UserFolderURL + "../" + owner + "/Calendar/batchDelete?ids="
70 document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr,
75 function deleteEvent()
77 if (listOfSelection) {
78 var nodes = listOfSelection.getSelectedRows();
80 if (nodes.length > 0) {
82 if (listOfSelection == $("tasksList"))
83 label = labels["taskDeleteConfirmation"].decodeEntities();
85 label = labels["appointmentDeleteConfirmation"].decodeEntities();
88 if (document.deleteEventAjaxRequest) {
89 document.deleteEventAjaxRequest.aborted = true;
90 document.deleteEventAjaxRequest.abort();
92 var sortedNodes = new Array();
93 var owners = new Array();
95 for (var i = 0; i < nodes.length; i++) {
96 var owner = nodes[i].getAttribute("owner");
97 if (!sortedNodes[owner]) {
98 sortedNodes[owner] = new Array();
101 sortedNodes[owner].push(nodes[i].getAttribute("id"));
103 for (var i = 0; i < owners.length; i++) {
104 ownersOfEventsToDelete.push(owners[i]);
105 eventsToDelete.push(sortedNodes[owners[i]]);
107 _batchDeleteEvents();
112 window.alert("no selection");
117 function modifyEvent(sender, modification) {
118 var currentLocation = '' + window.location;
119 var arr = currentLocation.split("/");
120 arr[arr.length-1] = modification;
122 document.modifyEventAjaxRequest = triggerAjaxRequest(arr.join("/"),
129 function modifyEventCallback(http) {
130 if (http.readyState == 4) {
131 if (http.status == 200) {
132 log("closing window...?");
136 log("showing alert...");
137 window.alert(labels["eventPartStatModificationError"]);
139 document.modifyEventAjaxRequest = null;
143 function deleteEventCallback(http)
145 if (http.readyState == 4
146 && http.status == 200) {
147 var nodes = $(http.callbackData);
148 for (var i = 0; i < nodes.length; i++) {
149 var node = $(nodes[i]);
150 node.parentNode.removeChild(node);
152 if (eventsToDelete.length)
153 _batchDeleteEvents();
155 document.deleteEventAjaxRequest = null;
156 refreshAppointments();
158 changeCalendarDisplay();
162 log ("ajax fuckage");
165 function editDoubleClickedEvent(node)
167 _editEventId(node.getAttribute("id"),
168 node.getAttribute("owner"));
173 function onSelectAll() {
174 var list = $("appointmentsList");
175 list.selectRowsMatchingClass("appointmentRow");
180 function displayAppointment(event) {
181 _editEventId(this.getAttribute("aptCName"),
182 this.getAttribute("owner"));
184 event.preventDefault();
185 event.stopPropagation();
186 event.cancelBubble = true;
187 event.returnValue = false;
190 function onDaySelect(node)
192 var day = node.getAttribute("day");
193 var needRefresh = (listFilter == 'view_selectedday'
194 && day != currentDay);
196 var td = node.getParentWithTagName("td");
197 var table = td.getParentWithTagName("table");
199 // log ("table.selected: " + table.selected);
201 if (document.selectedDate)
202 document.selectedDate.deselect();
205 document.selectedDate = td;
207 changeCalendarDisplay( { "day": day } );
209 refreshAppointments();
214 function onDateSelectorGotoMonth(node)
216 var day = node.getAttribute("date");
218 changeDateSelectorDisplay(day, true);
223 function onCalendarGotoDay(node)
225 var day = node.getAttribute("date");
227 changeDateSelectorDisplay(day);
228 changeCalendarDisplay( { "day": day } );
235 changeDateSelectorDisplay('');
236 changeCalendarDisplay();
241 function setDateSelectorContent(content)
243 var div = $("dateSelectorView");
245 div.innerHTML = content;
246 if (currentDay.length > 0)
247 restoreCurrentDaySelection(div);
250 function dateSelectorCallback(http)
252 if (http.readyState == 4
253 && http.status == 200) {
254 document.dateSelectorAjaxRequest = null;
255 var content = http.responseText;
256 setDateSelectorContent(content);
257 cachedDateSelectors[http.callbackData] = content;
260 log ("ajax fuckage");
263 function appointmentsListCallback(http)
265 var div = $("appointmentsListView");
267 if (http.readyState == 4
268 && http.status == 200) {
269 document.appointmentsListAjaxRequest = null;
270 div.innerHTML = http.responseText;
271 var params = parseQueryParameters(http.callbackData);
272 sortKey = params["sort"];
273 sortOrder = params["desc"];
274 var list = $("appointmentsList");
275 list.addEventListener("selectionchange",
276 onAppointmentsSelectionChange, true);
277 configureSortableTableHeaders();
280 log ("ajax fuckage");
283 function tasksListCallback(http)
285 var div = $("tasksListView");
287 if (http.readyState == 4
288 && http.status == 200) {
289 document.tasksListAjaxRequest = null;
290 var list = $("tasksList");
291 var scroll = list.scrollTop;
292 div.innerHTML = http.responseText;
293 list = $("tasksList");
294 list.addEventListener("selectionchange",
295 onTasksSelectionChange, true);
296 list.scrollTop = scroll;
297 if (http.callbackData) {
298 var selectedNodesId = http.callbackData;
299 for (var i = 0; i < selectedNodesId.length; i++)
300 $(selectedNodesId[i]).select();
304 log ("ajax fuckage");
307 function restoreCurrentDaySelection(div)
309 var elements = div.getElementsByTagName("a");
312 while (!day && i < elements.length)
314 day = elements[i].getAttribute("day");
319 && day.substr(0, 6) == currentDay.substr(0, 6)) {
320 for (i = 0; i < elements.length; i++) {
321 day = elements[i].getAttribute("day");
322 if (day && day == currentDay) {
323 var td = elements[i].getParentWithTagName("td");
324 if (document.selectedDate)
325 document.selectedDate.deselect();
327 document.selectedDate = td;
333 function changeDateSelectorDisplay(day, keepCurrentDay)
335 var url = ApplicationBaseURL + "dateselector";
337 url += "?day=" + day;
339 if (day != currentDay) {
343 var month = day.substr(0, 6);
344 if (cachedDateSelectors[month]) {
345 // log ("restoring cached selector for month: " + month);
346 setDateSelectorContent(cachedDateSelectors[month]);
349 // log ("loading selector for month: " + month);
350 if (document.dateSelectorAjaxRequest) {
351 document.dateSelectorAjaxRequest.aborted = true;
352 document.dateSelectorAjaxRequest.abort();
354 document.dateSelectorAjaxRequest
355 = triggerAjaxRequest(url,
356 dateSelectorCallback,
362 function changeCalendarDisplay(time, newView)
364 var url = ApplicationBaseURL + ((newView) ? newView : currentView);
376 url += "?day=" + day;
379 // log ("switching to view: " + newView);
380 // log ("changeCalendarDisplay: " + url);
382 if (document.dayDisplayAjaxRequest) {
383 // log ("aborting day ajaxrq");
384 document.dayDisplayAjaxRequest.aborted = true;
385 document.dayDisplayAjaxRequest.abort();
387 document.dayDisplayAjaxRequest = triggerAjaxRequest(url,
388 calendarDisplayCallback,
396 function _ensureView(view) {
397 if (currentView != view)
398 changeCalendarDisplay(null, view);
403 function onDayOverview()
405 return _ensureView("dayview");
408 function onWeekOverview()
410 return _ensureView("weekview");
413 function onMonthOverview()
415 return _ensureView("monthview");
418 function scrollDayView(hour)
423 if (hour.length == 3)
424 rowNumber = parseInt(hour.substr(0, 1));
426 if (hour.substr(0, 1) == "0")
427 rowNumber = parseInt(hour.substr(1, 1));
429 rowNumber = parseInt(hour.substr(0, 2));
434 var daysView = $("daysView");
435 var hours = daysView.childNodesWithTag("div")[0].childNodesWithTag("div");
436 if (hours.length > 0)
437 daysView.parentNode.scrollTop = hours[rowNumber + 1].offsetTop;
442 function onClickableCellsDblClick(event) {
443 newEvent(this, 'event');
445 event.cancelBubble = true;
446 event.returnValue = false;
449 function calendarDisplayCallback(http)
451 var div = $("calendarView");
453 // log ("calendardisplaycallback: " + div);
454 if (http.readyState == 4
455 && http.status == 200) {
456 document.dateSelectorAjaxRequest = null;
457 div.innerHTML = http.responseText;
458 if (http.callbackData["view"])
459 currentView = http.callbackData["view"];
460 if (http.callbackData["day"])
461 currentDay = http.callbackData["day"];
463 if (http.callbackData["hour"])
464 hour = http.callbackData["hour"];
466 if (currentView == "monthview")
467 contentView = $("calendarContent");
471 contentView = $("daysView");
473 var appointments = document.getElementsByClassName("appointment", contentView);
474 for (var i = 0; i < appointments.length; i++) {
475 appointments[i].addEventListener("mousedown", listRowMouseDownHandler, true);
476 appointments[i].addEventListener("click", onCalendarSelectAppointment, false);
477 appointments[i].addEventListener("dblclick", displayAppointment, true);
479 var days = document.getElementsByClassName("day", contentView);
480 if (currentView == "monthview")
481 for (var i = 0; i < days.length; i++) {
482 days[i].addEventListener("click", onCalendarSelectDay, true);
483 days[i].addEventListener("dblclick", onClickableCellsDblClick, false);
486 for (var i = 0; i < days.length; i++) {
487 days[i].addEventListener("click", onCalendarSelectDay, false);
488 var clickableCells = document.getElementsByClassName("clickableHourCell",
490 for (var j = 0; j < clickableCells.length; j++)
491 clickableCells[j].addEventListener("dblclick",
492 onClickableCellsDblClick, false);
497 log ("ajax fuckage");
500 function assignCalendar(name)
504 node.calendar = new skycalendar(node);
505 node.calendar.setCalendarPage(ResourcesURL + "/skycalendar.html");
506 var dateFormat = node.getAttribute("dateFormat");
508 node.calendar.setDateFormat(dateFormat);
511 function popupCalendar(node)
513 var nodeId = node.getAttribute("inputId");
514 var input = $(nodeId);
515 input.calendar.popup();
520 function onAppointmentContextMenu(event, element)
522 var topNode = $("appointmentsList");
525 var menu = $("appointmentsListMenu");
527 menu.addEventListener("hideMenu", onAppointmentContextMenuHide, false);
528 onMenuClick(event, "appointmentsListMenu");
530 var topNode = $("appointmentsList");
531 var selectedNodes = topNode.getSelectedRows();
532 topNode.menuSelectedRows = selectedNodes;
533 for (var i = 0; i < selectedNodes.length; i++)
534 selectedNodes[i].deselect();
536 topNode.menuSelectedEntry = element;
540 function onAppointmentContextMenuHide(event)
542 var topNode = $("appointmentsList");
544 if (topNode.menuSelectedEntry) {
545 topNode.menuSelectedEntry.deselect();
546 topNode.menuSelectedEntry = null;
548 if (topNode.menuSelectedRows) {
549 var nodeIds = topNode.menuSelectedRows;
550 for (var i = 0; i < nodeIds.length; i++) {
551 var node = $(nodeIds[i]);
554 topNode.menuSelectedRows = null;
558 function onAppointmentsSelectionChange() {
559 listOfSelection = this;
560 this.removeClassName("_unfocused");
561 $("tasksList").addClassName("_unfocused");
564 function onTasksSelectionChange() {
565 listOfSelection = this;
566 this.removeClassName("_unfocused");
567 $("appointmentsList").addClassName("_unfocused");
570 function _loadAppointmentHref(href) {
571 if (document.appointmentsListAjaxRequest) {
572 document.appointmentsListAjaxRequest.aborted = true;
573 document.appointmentsListAjaxRequest.abort();
575 var url = ApplicationBaseURL + href;
576 document.appointmentsListAjaxRequest
577 = triggerAjaxRequest(url, appointmentsListCallback, href);
582 function _loadTasksHref(href) {
583 if (document.tasksListAjaxRequest) {
584 document.tasksListAjaxRequest.aborted = true;
585 document.tasksListAjaxRequest.abort();
587 url = ApplicationBaseURL + href;
589 var selectedIds = $("tasksList").getSelectedNodesId();
590 document.tasksListAjaxRequest
591 = triggerAjaxRequest(url, tasksListCallback, selectedIds);
596 function onHeaderClick(event) {
597 // log("onHeaderClick: " + this.link);
598 _loadAppointmentHref(this.link);
600 event.preventDefault();
603 function refreshAppointments() {
604 return _loadAppointmentHref("aptlist?desc=" + sortOrder
606 + "&day=" + currentDay
607 + "&filterpopup=" + listFilter);
610 function refreshTasks() {
611 return _loadTasksHref("taskslist?hide-completed=" + hideCompletedTasks);
614 function refreshAppointmentsAndDisplay()
616 refreshAppointments();
617 changeCalendarDisplay();
620 function onListFilterChange() {
621 var node = $("filterpopup");
623 listFilter = node.value;
624 // log ("listFilter = " + listFilter);
626 return refreshAppointments();
629 function onAppointmentClick(event)
631 var node = event.target.getParentWithTagName("tr");
632 var day = node.getAttribute("day");
633 var hour = node.getAttribute("hour");
635 changeCalendarDisplay( { "day": day, "hour": hour} );
636 changeDateSelectorDisplay(day);
638 return onRowClick(event);
641 function selectMonthInMenu(menu, month)
643 var entries = menu.childNodes[1].childNodesWithTag("LI");
644 for (i = 0; i < entries.length; i++) {
645 var entry = entries[i];
646 var entryMonth = entry.getAttribute("month");
647 if (entryMonth == month)
648 entry.addClassName("currentMonth");
650 entry.removeClassName("currentMonth");
654 function selectYearInMenu(menu, month)
656 var entries = menu.childNodes[1].childNodes;
657 for (i = 0; i < entries.length; i++) {
658 var entry = entries[i];
659 if (entry instanceof HTMLLIElement) {
660 var entryMonth = entry.innerHTML;
661 if (entryMonth == month)
662 entry.addClassName("currentMonth");
664 entry.removeClassName("currentMonth");
669 function popupMonthMenu(event, menuId)
671 var node = event.target;
673 if (event.button == 0) {
674 event.cancelBubble = true;
675 event.returnValue = false;
677 if (document.currentPopupMenu)
678 hideMenu(event, document.currentPopupMenu);
680 var popup = $(menuId);
681 var id = node.getAttribute("id");
682 if (id == "monthLabel")
683 selectMonthInMenu(popup, node.getAttribute("month"));
685 selectYearInMenu(popup, node.innerHTML);
687 var diff = (popup.offsetWidth - node.offsetWidth) /2;
689 popup.style.top = (node.offsetTop + 95) + "px";
690 popup.style.left = (node.offsetLeft - diff) + "px";
691 popup.style.visibility = "visible";
693 bodyOnClick = "" + document.body.getAttribute("onclick");
694 document.body.setAttribute("onclick", "onBodyClick('" + menuId + "');");
695 document.currentPopupMenu = popup;
699 function onMonthMenuItemClick(node)
701 var month = '' + node.getAttribute("month");
702 var year = '' + $("yearLabel").innerHTML;
704 changeDateSelectorDisplay(year+month+"01", true);
709 function onYearMenuItemClick(node) {
710 var month = '' + $("monthLabel").getAttribute("month");;
711 var year = '' + node.innerHTML;
713 changeDateSelectorDisplay(year+month+"01", true);
718 function onSearchFormSubmit() {
719 log ("search not implemented");
724 function onCalendarSelectAppointment() {
725 var list = $("appointmentsList");
728 var aptCName = this.getAttribute("aptCName");
729 var row = $(aptCName);
731 var div = row.parentNode.parentNode.parentNode;
732 div.scrollTop = row.offsetTop - (div.offsetHeight / 2);
737 function onCalendarSelectDay(event) {
738 var day = this.getAttribute("day");
739 var needRefresh = (listFilter == 'view_selectedday'
740 && day != currentDay);
742 if (currentView == 'weekview')
743 changeWeekCalendarDisplayOfSelectedDay(this);
744 else if (currentView == 'monthview')
745 changeMonthCalendarDisplayOfSelectedDay(this);
746 changeDateSelectorDisplay(day);
749 refreshAppointments();
752 function changeWeekCalendarDisplayOfSelectedDay(node) {
753 var days = document.getElementsByClassName("day", node.parentNode);
755 for (var i = 0; i < days.length; i++)
757 days[i].removeClassName("selectedDay");
759 node.addClassName("selectedDay");
762 function findMonthCalendarSelectedCell(table) {
763 var tbody = table.tBodies[0];
764 var rows = tbody.rows;
767 while (i < rows.length && !table.selectedCell) {
768 var cells = rows[i].cells;
770 while (j < cells.length && !table.selectedCell) {
771 if (cells[j].hasClassName("selectedDay"))
772 table.selectedCell = cells[j];
780 function changeMonthCalendarDisplayOfSelectedDay(node)
782 var tr = node.parentNode;
783 var table = tr.parentNode.parentNode;
785 if (!table.selectedCell)
786 findMonthCalendarSelectedCell(table);
788 if (table.selectedCell)
789 table.selectedCell.removeClassName("selectedDay");
790 table.selectedCell = node;
791 node.addClassName("selectedDay");
794 function onHideCompletedTasks(node)
796 hideCompletedTasks = (node.checked ? 1 : 0);
798 return refreshTasks();
801 function updateTaskStatus(node)
803 var taskId = node.parentNode.getAttribute("id");
804 var taskOwner = node.parentNode.getAttribute("owner");
805 var newStatus = (node.checked ? 1 : 0);
806 // log ("update task status: " + taskId);
808 var http = createHTTPClient();
810 url = (UserFolderURL + "../" + taskOwner + "/Calendar/"
811 + taskId + "/changeStatus?status=" + newStatus);
814 // log ("url: " + url);
815 // TODO: add parameter to signal that we are only interested in OK
817 http.open("GET", url, false /* not async */);
819 if (http.status == 200)
822 log ("no http client?");
827 function updateCalendarStatus()
829 var list = new Array();
831 var clist = $("calendarsList");
832 var nodes = clist.childNodesWithTag("ul")[0].childNodesWithTag("li");
833 for (var i = 0; i < nodes.length; i++) {
834 var input = nodes[i].childNodesWithTag("input")[0];
836 list.push(nodes[i].getAttribute("uid"));
840 list.push(nodes[0].getAttribute("uid"));
841 nodes[0].childNodesWithTag("input")[0].checked = true;
843 // ApplicationBaseURL = (UserFolderURL + "Groups/_custom_"
844 // + list.join(",") + "/Calendar/");
846 updateCalendarsList();
847 refreshAppointments();
849 changeCalendarDisplay();
854 function calendarUidsList()
858 var nodes = $("uixselector-calendarsList-display").childNodesWithTag("li");
859 for (var i = 0; i < nodes.length; i++) {
860 var currentNode = nodes[i];
861 var input = currentNode.childNodesWithTag("input")[0];
864 list += currentNode.getAttribute("uid") + ",";
867 return list.substr(0, list.length - 1);
870 // function updateCalendarContacts(contacts)
872 // var list = contacts.split(",");
874 // var clist = $("calendarsList");
875 // var nodes = clist.childNodes[5].childNodes;
876 // for (var i = 0; i < nodes.length; i++) {
877 // var currentNode = nodes[i];
878 // if (currentNode instanceof HTMLLIElement) {
879 // var input = currentNode.childNodes[3];
880 // if (!input.checked)
882 // list += currentNode.getAttribute("uid") + ",";
887 function inhibitMyCalendarEntry()
889 var clist = $("calendarsList");
890 var nodes = clist.childNodes[5].childNodes;
894 while (!done && i < nodes.length) {
895 var currentNode = nodes[i];
896 if (currentNode instanceof HTMLLIElement) {
897 var input = currentNode.childNodes[3];
898 if (currentNode.getAttribute("uid") == UserLogin) {
900 // currentNode.style.color = "#999;";
901 currentNode.style.fontWeight = "bold;";
902 // currentNode.setAttribute("onclick", "");
909 function userCalendarEntry(user, color) {
910 var li = document.createElement("li");
911 li.setAttribute("uid", user);
912 li.addEventListener("mousedown", listRowMouseDownHandler, false);
913 li.addEventListener("click", onRowClick, false);
914 var colorBox = document.createElement("span");
915 colorBox.addClassName("colorBox");
917 log("color: " + color);
918 colorBox.style.backgroundColor = color + ";";
920 li.appendChild(colorBox);
921 var checkBox = document.createElement("input");
922 checkBox.addClassName("checkBox");
923 checkBox.type = "checkbox";
924 checkBox.addEventListener("change", updateCalendarStatus, false);
925 li.appendChild(checkBox);
926 var text = document.createTextNode(" " + user);
927 li.appendChild(text);
932 function ensureSelfIfPresent() {
933 var ul = $("uixselector-calendarsList-display");
934 var list = ul.childNodesWithTag("li");
935 var selfEntry = userCalendarEntry(UserLogin, indexColor(0));
936 selfEntry.style.fontWeight = "bold;";
937 if (list.length < 1) {
938 ul.appendChild(selfEntry);
939 } else if (list[0].getAttribute("uid") != UserLogin) {
940 ul.insertBefore(selfEntry, list[0]);
944 function updateCalendarsList(method)
946 ensureSelfIfPresent();
947 var url = (ApplicationBaseURL + "updateCalendars?ids="
948 + calendarUidsList());
949 if (document.calendarsListAjaxRequest) {
950 document.calendarsListAjaxRequest.aborted = true;
951 document.calendarsListAjaxRequest.abort();
953 var http = createHTTPClient();
956 http.open("GET", url, false);
959 if (method == "removal")
960 updateCalendarStatus();
962 http = createHTTPClient();
963 http.url = ApplicationBaseURL + "checkRights";
964 http.open("GET", http.url, false /* not async */);
966 if (http.status == 200
967 && http.responseText.length > 0) {
968 rights = http.responseText.split(",");
969 var list = $("uixselector-calendarsList-display").childNodesWithTag("li");
970 for (var i = 0; i < list.length; i++) {
971 var input = list[i].childNodesWithTag("input")[0];
972 if (rights[i] == "1") {
973 list[i].removeClassName("denied");
974 input.disabled = false;
977 input.checked = false;
978 input.disabled = true;
979 list[i].addClassName("denied");
986 function addContact(tag, fullContactName, contactId, contactName, contactEmail)
988 var uids = $("uixselector-calendarsList-uidList");
989 // log("addContact");
992 var re = new RegExp("(^|,)" + contactId + "($|,)");
994 if (!re.test(uids.value))
996 if (uids.value.length > 0)
997 uids.value += ',' + contactId;
999 uids.value = contactId;
1000 var names = $("uixselector-calendarsList-display");
1001 var listElems = names.childNodesWithTag("li");
1002 var colorDef = indexColor(listElems.length);
1003 names.appendChild(userCalendarEntry(contactId, colorDef));
1005 var styles = document.getElementsByTagName("style");
1006 styles[0].innerHTML += ('.ownerIs' + contactId + ' {'
1007 + ' background-color: '
1009 + ' !important; }');
1016 function onChangeCalendar(list) {
1017 var form = document.forms.editform;
1018 var urlElems = form.getAttribute("action").split("/");
1019 urlElems[urlElems.length-4]
1020 = list.childNodesWithTag("option")[list.value].innerHTML;
1021 form.setAttribute("action", urlElems.join("/"));
1024 function validateBrowseURL(input) {
1025 var button = $("browseURLBtn");
1027 if (input.value.length) {
1028 if (!button.enabled)
1029 enableAnchor(button);
1030 } else if (!button.disabled)
1031 disableAnchor(button);
1034 function browseURL(anchor, event) {
1035 if (event.button == 0) {
1036 var input = $("url");
1037 var url = input.value;
1039 window.open(url, '_blank');
1045 function initializeMenus() {
1046 var menus = new Array("monthListMenu", "yearListMenu",
1047 "appointmentsListMenu", "calendarsMenu", "searchMenu");
1048 initMenusNamed(menus);
1050 $("calendarsList").attachMenu("calendarsMenu");
1052 var accessRightsMenuEntry = $("accessRightsMenuEntry");
1053 accessRightsMenuEntry.addEventListener("mouseup",
1054 onAccessRightsMenuEntryMouseUp,
1058 function onAccessRightsMenuEntryMouseUp(event) {
1059 var folders = $("uixselector-calendarsList-display");
1060 var selected = folders.getSelectedNodes()[0];
1061 var uid = selected.getAttribute("uid");
1062 log("application base url: " + ApplicationBaseURL);
1063 if (uid == UserLogin)
1064 url = ApplicationBaseURL + "acls";
1066 url = UserFolderURL + "../" + uid + "/Calendar/acls";
1068 openAclWindow(url, uid);
1071 function configureDragHandles() {
1072 var handle = $("verticalDragHandle");
1074 handle.addInterface(SOGoDragHandlesInterface);
1075 handle.leftBlock=$("leftPanel");
1076 handle.rightBlock=$("rightPanel");
1079 handle = $("rightDragHandle");
1081 handle.addInterface(SOGoDragHandlesInterface);
1082 handle.upperBlock=$("appointmentsListView");
1083 handle.lowerBlock=$("calendarView");
1087 function initCalendarContactsSelector() {
1088 var selector = $("calendarsList");
1089 inhibitMyCalendarEntry();
1090 updateCalendarStatus();
1091 selector.changeNotification = updateCalendarsList;
1093 var list = $("uixselector-calendarsList-display").childNodesWithTag("li");
1094 for (var i = 0; i < list.length; i++) {
1095 var input = list[i].childNodesWithTag("input")[0];
1096 input.addEventListener("change", updateCalendarStatus, false);
1100 function initCalendars() {
1101 if (!document.body.hasClassName("popup"))
1102 initCalendarContactsSelector();
1105 window.addEventListener("load", initCalendars, false);