]> err.no Git - scalable-opengroupware.org/blobdiff - UI/WebServerResources/SchedulerUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1261 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / SchedulerUI.js
index 99930c3bcfb3483bf9dce16aeb37e68fcddd5fd0..22e7b72abbf63322f37a22be1a63adefd6fa9ba4 100644 (file)
@@ -317,47 +317,49 @@ function eventsListCallback(http) {
     var params = parseQueryParameters(http.callbackData);
     sortKey = params["sort"];
     sortOrder = params["desc"];
-    lastClickedRow = null; // from generic.js
-
-    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();
-      Event.observe(row, "click",
-                   onEventClick.bindAsEventListener(row));
-      Event.observe(row, "dblclick",
-                   editDoubleClickedEvent.bindAsEventListener(row));
-      Event.observe(row, "contextmenu",
-                   onEventContextMenu.bindAsEventListener(row));
-
-      var td = document.createElement("td");
-      row.appendChild(td);
-      Event.observe(td, "mousedown", listRowMouseDownHandler, true);
-      td.appendChild(document.createTextNode(data[i][3]));
-
-      td = document.createElement("td");
-      row.appendChild(td);
-      Event.observe(td, "mousedown", listRowMouseDownHandler, true);
-      td.appendChild(document.createTextNode(data[i][8]));
-
-      td = document.createElement("td");
-      row.appendChild(td);
-      Event.observe(td, "mousedown", listRowMouseDownHandler, true);
-      td.appendChild(document.createTextNode(data[i][9]));
+    lastClickedRow = -1; // from generic.js
+
+    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();
+       Event.observe(row, "click",
+                     onEventClick.bindAsEventListener(row));
+       Event.observe(row, "dblclick",
+                     editDoubleClickedEvent.bindAsEventListener(row));
+       Event.observe(row, "contextmenu",
+                     onEventContextMenu.bindAsEventListener(row));
       
-      td = document.createElement("td");
-      row.appendChild(td);
-      Event.observe(td, "mousedown", listRowMouseDownHandler, true);
-      td.appendChild(document.createTextNode(data[i][6]));
+       var td = document.createElement("td");
+       row.appendChild(td);
+       Event.observe(td, "mousedown", listRowMouseDownHandler, true);
+       td.appendChild(document.createTextNode(data[i][3]));
+
+       td = document.createElement("td");
+       row.appendChild(td);
+       Event.observe(td, "mousedown", listRowMouseDownHandler, true);
+       td.appendChild(document.createTextNode(data[i][8]));
+
+       td = document.createElement("td");
+       row.appendChild(td);
+       Event.observe(td, "mousedown", listRowMouseDownHandler, true);
+       td.appendChild(document.createTextNode(data[i][9]));
+      
+       td = document.createElement("td");
+       row.appendChild(td);
+       Event.observe(td, "mousedown", listRowMouseDownHandler, true);
+       td.appendChild(document.createTextNode(data[i][6]));
+      }
     }
   }
   else
@@ -371,42 +373,46 @@ function tasksListCallback(http) {
       && http.status == 200) {
     document.tasksListAjaxRequest = null;
     var list = $("tasksList");
-    var data = http.responseText.evalJSON(true);
-
-    for (var i = 0; i < data.length; i++) {
-      //log(i + " = " + data[i][3]);
-      var listItem = document.createElement("li");
-      list.appendChild(listItem);
-      Event.observe(listItem, "mousedown", listRowMouseDownHandler);
-      Event.observe(listItem, "click", onRowClick);
-      Event.observe(listItem, "dblclick", editDoubleClickedEvent.bindAsEventListener(listItem));
-      listItem.setAttribute("id", data[i][0]);
-      $(listItem).addClassName(data[i][5]);
-      listItem.calendar = data[i][1];
-      $(listItem).addClassName("calendarFolder" + data[i][1]);
-      listItem.cname = escape(data[i][0]);
-      var input = document.createElement("input");
-      input.setAttribute("type", "checkbox");
-      listItem.appendChild(input);
-      Event.observe(input, "click", updateTaskStatus.bindAsEventListener(input), true);
-      input.setAttribute("value", "1");
-      if (data[i][2] == 1)
-       input.setAttribute("checked", "checked");
-      $(input).addClassName("checkBox");
-      listItem.appendChild(document.createTextNode(data[i][3]));
-    }
+    if (http.responseText.length > 0) {
+      var data = http.responseText.evalJSON(true);
+
+      for (var i = 0; i < data.length; i++) {
+       //log(i + " = " + data[i][3]);
+       var listItem = document.createElement("li");
+       list.appendChild(listItem);
+       Event.observe(listItem, "mousedown", listRowMouseDownHandler);
+       Event.observe(listItem, "click", onRowClick);
+       Event.observe(listItem, "dblclick",
+                     editDoubleClickedEvent.bindAsEventListener(listItem));
+       listItem.setAttribute("id", data[i][0]);
+       $(listItem).addClassName(data[i][5]);
+       listItem.calendar = data[i][1];
+       $(listItem).addClassName("calendarFolder" + data[i][1]);
+       listItem.cname = escape(data[i][0]);
+       var input = document.createElement("input");
+       input.setAttribute("type", "checkbox");
+       listItem.appendChild(input);
+       Event.observe(input, "click", updateTaskStatus.bindAsEventListener(input), true);
+       input.setAttribute("value", "1");
+       if (data[i][2] == 1)
+         input.setAttribute("checked", "checked");
+       $(input).addClassName("checkBox");
+       listItem.appendChild(document.createTextNode(data[i][3]));
+      }
 
-    list.scrollTop = list.previousScroll;
+      list.scrollTop = list.previousScroll;
 
-    if (http.callbackData) {
-      var selectedNodesId = http.callbackData;
-      for (var i = 0; i < selectedNodesId.length; i++) {
-//     log(selectedNodesId[i] + " (" + i + ") is selected");
-        $(selectedNodesId[i]).select();
+      if (http.callbackData) {
+       var selectedNodesId = http.callbackData;
+       for (var i = 0; i < selectedNodesId.length; i++) {
+         //    log(selectedNodesId[i] + " (" + i + ") is selected");
+         $(selectedNodesId[i]).select();
+       }
       }
+      else
+       log ("tasksListCallback: no data");
     }
-    else
-      log ("tasksListCallback: no data");
   }
   else
     log ("tasksListCallback Ajax error");
@@ -465,16 +471,16 @@ function changeDateSelectorDisplay(day, keepCurrentDay) {
   }
 }
 
-function changeCalendarDisplay(time, newView) {
+function changeCalendarDisplay(data, newView) {
   var url = ApplicationBaseURL + "/" + ((newView) ? newView : currentView);
 
   selectedCalendarCell = null;
 
   var day = null;
-  var hour = null;
-  if (time) {
-    day = time['day'];
-    hour = time['hour'];
+  var scrollEvent = null;
+  if (data) {
+    day = data['day'];
+    scrollEvent = data['scrollEvent'];
   }
 
   if (!day)
@@ -493,7 +499,9 @@ function changeCalendarDisplay(time, newView) {
   }
   document.dayDisplayAjaxRequest
      = triggerAjaxRequest(url, calendarDisplayCallback,
-                         { "view": newView, "day": day, "hour": hour });
+                         { "view": newView,
+                           "day": day,
+                           "scrollEvent": scrollEvent });
 
   return false;
 }
@@ -521,25 +529,24 @@ function onMonthOverview() {
   return _ensureView("monthview");
 }
 
-function scrollDayView(hour) {
-  var rowNumber;
-  if (hour) {
-    if (hour.length == 3)
-      rowNumber = parseInt(hour.substr(0, 1));
-    else {
-      if (hour.substr(0, 1) == "0")
-        rowNumber = parseInt(hour.substr(1, 1));
-      else
-        rowNumber = parseInt(hour.substr(0, 2));
-    }
-  } else
-    rowNumber = 8;
-
+function scrollDayView(scrollEvent) {
+  var offset = 0;
   var daysView = $("daysView");
   var hours =
-     $(daysView.childNodesWithTag("div")[0]).childNodesWithTag("div");
-  if (hours.length > 0)
-    daysView.scrollTop = hours[rowNumber].offsetTop;
+    $(daysView.childNodesWithTag("div")[0]).childNodesWithTag("div");
+
+  if (scrollEvent && scrollEvent.siblings) {
+    var classes = scrollEvent.siblings[0].getAttribute("class").split(" ");
+    for (var i = 0; i < classes.length; i++)
+      if (classes[i].startsWith("starts")) {
+       var starts = Math.floor(parseInt(classes[i].substr(6)) / 4);
+       offset = hours[starts].offsetTop;
+      }
+  }
+  else
+    offset = hours[8].offsetTop;
+
+  daysView.scrollTop = offset - 5;
 }
 
 function onClickableCellsDblClick(event) {
@@ -601,12 +608,15 @@ function refreshCalendarEvents() {
 function refreshCalendarEventsCallback(http) {
   if (http.readyState == 4
       && http.status == 200) {
-     var data = http.responseText.evalJSON(true);
+
+    if (http.responseText.length > 0) {
+      var data = http.responseText.evalJSON(true);
 //      log("refresh calendar events: " + data.length);
-     for (var i = 0; i < data.length; i++)
+      for (var i = 0; i < data.length; i++)
        drawCalendarEvent(data[i],
                          http.callbackData["startDate"],
                          http.callbackData["endDate"]);
+    }
   }
   else
      log("AJAX error when refreshing calendar events");
@@ -617,22 +627,14 @@ function drawCalendarEvent(eventData, sd, ed) {
    var viewEndDate = ed.asDate();
 
    var startDate = new Date();
+   startDate.setTime(eventData[4] * 1000);
    var endDate = new Date();
-   if (eventData[7] == 0) {
-     startDate.setTime(eventData[4] * 1000 + (1000 * UTCOffset));
-     endDate.setTime(eventData[5] * 1000 + (1000 * UTCOffset));
-   }
-   else {
-     startDate.setTime(eventData[4] * 1000);
-     endDate.setTime(eventData[5] * 1000);
-   }
+   endDate.setTime(eventData[5] * 1000);
 
-//    log ("s: " + startDate+ "; e: " + endDate);
+//    log ("s: " + startDate + "; e: " + endDate);
 
    var days = startDate.daysUpTo(endDate);
 
-   var divs = new Array();
-
    var title;
    if (currentView == "monthview"
        && (eventData[7] == 0))
@@ -719,8 +721,12 @@ function drawCalendarEvent(eventData, sd, ed) {
            }
         }
         if (parentDiv)
-           parentDiv.appendChild(eventDiv);
+          parentDiv.appendChild(eventDiv);
       }
+
+   var eventTR = $(eventData[0]);
+   if (eventTR)
+     eventTR.siblings = siblings;
 }
 
 function newEventDIV(cname, calendar, starts, lasts,
@@ -783,22 +789,22 @@ function calendarDisplayCallback(http) {
     if (http.callbackData["day"])
       currentDay = http.callbackData["day"];
 
-    var hour = null;
-    if (http.callbackData["hour"])
-      hour = http.callbackData["hour"];
     var contentView;
     if (currentView == "monthview")
       contentView = $("calendarContent");
     else {
-      scrollDayView(hour);
+      var scrollEvent = http.callbackData.scrollEvent;
+      scrollDayView($(scrollEvent));
       contentView = $("daysView");
     }
     refreshCalendarEvents();
     var days = document.getElementsByClassName("day", contentView);
     if (currentView == "monthview")
       for (var i = 0; i < days.length; i++) {
-        Event.observe(days[i], "click",  onCalendarSelectDay.bindAsEventListener(days[i]));
-        Event.observe(days[i], "dblclick",  onClickableCellsDblClick.bindAsEventListener(days[i]));
+        Event.observe(days[i], "click",
+                     onCalendarSelectDay.bindAsEventListener(days[i]));
+        Event.observe(days[i], "dblclick",
+                     onClickableCellsDblClick.bindAsEventListener(days[i]));
       }
     else {
        var headerDivs = $("calendarHeader").childNodesWithTag("div"); 
@@ -964,12 +970,10 @@ function onListFilterChange() {
   return refreshEvents();
 }
 
-function onEventClick(event) { log ("onEventClick");
-  var day = this.day;
-  var hour = this.hour;
-
-  changeCalendarDisplay( { "day": day, "hour": hour} );
-  changeDateSelectorDisplay(day);
+function onEventClick(event) {
+  changeCalendarDisplay( { "day": this.day,
+                          "scrollEvent": this.getAttribute("id") } );
+  changeDateSelectorDisplay(this.day);
 
   return onRowClick(event);
 }
@@ -1041,7 +1045,7 @@ function onSearchFormSubmit() {
 
 function onCalendarSelectEvent() {
   var list = $("eventsList");
-  list.tBodies[0].deselectAll();
+  $(list.tBodies[0]).deselectAll();
 
   if (selectedCalendarCell)
      for (var i = 0; i < selectedCalendarCell.length; i++)
@@ -1377,7 +1381,7 @@ function onMenuModify(event) {
   if (UserLogin == selected.getAttribute("owner")) {
     var node = selected.childNodes[4];
     var currentName = node.nodeValue.trim();
-    var newName = window.prompt(labels["Address Book Name"],
+    var newName = window.prompt(labels["Name of the Calendar"],
                                currentName);
     if (newName && newName.length > 0
        && newName != currentName) {
@@ -1430,39 +1434,53 @@ function appendCalendar(folderName, folderPath) {
   else {
     var calendarList = $("calendarList");
     var lis = calendarList.childNodesWithTag("li");
-    var color = indexColor(lis.length + 100);
-    //log ("color: " + color);
-
     var li = document.createElement("li");
     
     // Add the calendar to the proper place
+    var previousOwner = null;
     for (var i = 0; i < lis.length; i++) {
       var currentFolderName = lis[i].lastChild.nodeValue.strip();
-      if (lis[i].readAttribute('owner') != owner)
-       continue;
-      if (currentFolderName > folderName)
-       break;
-    }
-    if (i != lis.length) { // User is subscribed to other calendars of the same owner
-      calendarList.insertBefore(li, lis[i]);
-    }
-    else {
-      for (var i = 0; i < lis.length; i++) {
-       if (lis[i].readAttribute('owner') == UserLogin)
-         continue;
-       if (lis[i].readAttribute('owner') > owner) {
-         calendarList.insertBefore(li, lis[i]);
+      var currentOwner = lis[i].readAttribute('owner');
+      if (currentOwner == owner) {
+       previousOwner = currentOwner;
+       if (currentFolderName > folderName)
          break;
-       }
-      }
-      if (i == lis.length) {
-       calendarList.appendChild(li);
       }
+      else if (previousOwner || 
+              (currentOwner != UserLogin && currentOwner > owner))
+       break;
     }
-
+    if (i != lis.length) // User is subscribed to other calendars of the same owner
+      calendarList.insertBefore(li, lis[i]);
+    else 
+      calendarList.appendChild(li);
+    
     li.setAttribute("id", folderPath);
     li.setAttribute("owner", owner);
 
+    // Generate new color
+    var colorTable = [1, 1, 1];
+    var color;
+    var currentValue = lis.length + 1;
+    var index = 0;
+    while (currentValue) {
+      if (currentValue & 1)
+       colorTable[index]++;
+      if (index == 3)
+       index = 0;
+      currentValue >>= 1;
+      index++;
+    }
+    colorTable[0] = parseInt(255 / colorTable[0]) - 1;
+    colorTable[1] = parseInt(255 / colorTable[1]) - 1;
+    colorTable[2] = parseInt(255 / colorTable[2]) - 1;
+
+    color = "#"
+      + colorTable[2].toString(16)
+      + colorTable[1].toString(16)
+      + colorTable[0].toString(16);
+    //log ("color = " + color);
+    
     var checkBox = document.createElement("input");
     checkBox.setAttribute("type", "checkbox");
     li.appendChild(checkBox);
@@ -1471,13 +1489,11 @@ function appendCalendar(folderName, folderPath) {
 
     var colorBox = document.createElement("div");
     li.appendChild(colorBox);
-    li.appendChild(document.createTextNode(" " + folderName));
+    li.appendChild(document.createTextNode(folderName));
     colorBox.appendChild(document.createTextNode("OO"));
 
     $(colorBox).addClassName("colorBox");
-    if (color)
-      $(colorBox).setStyle({color: color,
-                           backgroundColor: color});
+    $(colorBox).addClassName('calendarFolder' + folderPath.substr(1));
 
     // Register events (doesn't work with Safari)
     Event.observe(li, "mousedown",  listRowMouseDownHandler);
@@ -1491,20 +1507,23 @@ function appendCalendar(folderName, folderPath) {
     
     // Update CSS for events color
     if (!document.styleSheets) return;
-    var theRules = new Array();
-    var lastSheet = document.styleSheets[document.styleSheets.length - 1];
-    if (lastSheet.insertRule) { // Mozilla
-      lastSheet.insertRule('.calendarFolder' + folderPath.substr(1) + ' {'
-                          + ' background-color: '
-                          + color
-                          + ' !important; }', 0);
-    }
-    else { // IE
-      lastSheet.addRule('.calendarFolder' + folderPath.substr(1),
-                       ' background-color: '
-                       + color
-                       + ' !important; }');
-    }
+    
+    var styleElement = document.createElement("style");
+    styleElement.type = "text/css";
+    var selectors = [
+                    '.calendarFolder' + folderPath.substr(1),
+                    'div.colorBox.calendarFolder' + folderPath.substr(1)
+                    ];
+    var rules = [
+                ' { background-color: ' + color + ' !important; }',
+                ' { 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);
   }
 }
 
@@ -1534,19 +1553,18 @@ function onCalendarRemove(event) {
       if (folderIdElements.length > 1) {
        unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId);
       }
-      else {
-       var calId = folderIdElements[0].substr(1);
-       deletePersonalCalendar(calId);
-      }
+      else
+       deletePersonalCalendar(folderIdElements[0]);
     }
   }
   
   preventDefault(event);
 }
 
-function deletePersonalCalendar(folderId) {
+function deletePersonalCalendar(folderElement) {
+  var folderId = folderElement.substr(1);
   var label
-    = labels["Are you sure you want to delete the selected calendar?"];
+    = labels["Are you sure you want to delete the calendar \"%{0}\"?"].formatted($(folderElement).lastChild.nodeValue.strip());
   if (window.confirm(label)) {
     removeFolderRequestCount++;
     var url = ApplicationBaseURL + "/" + folderId + "/deleteFolder";