* New new BBS view
[citadel.git] / webcit / static / wclib.js
index 61f4b929cc8751410ff1cd6d9915c0b93a43e3a0..8fd9b16bd2bb12062379b7b598503ace174e9cfd 100644 (file)
@@ -1,9 +1,11 @@
-//
-// $Id$
-//
-// JavaScript function library for WebCit.
-//
-//
+/*
+ * $Id$
+ * Copyright 2005 - 2009 The Citadel Team
+ * Licensed under the GPL V3
+ *
+ * JavaScript function library for WebCit.
+ *
+ */
 
 
 var browserType;
@@ -20,6 +22,8 @@ var currentDropTarget = null;
 var supportsAddEventListener = (!!document.addEventListener);
 var today = new Date();
 
+var wc_log = "";
+var is_ie6 = false;
 if (document.all) {browserType = "ie"}
 if (window.navigator.userAgent.toLowerCase().match("gecko")) {
        browserType= "gecko";
@@ -27,17 +31,37 @@ if (window.navigator.userAgent.toLowerCase().match("gecko")) {
 var ns6=document.getElementById&&!document.all;
 Event.observe(window, 'load', ToggleTaskDateOrNoDateActivate);
 Event.observe(window, 'load', taskViewActivate);
+Event.observe(window, 'load', fixbanner);
+Event.observe(window, 'load', resizeViewport);
+Event.observe(window, 'resize', resizeViewport);
 //document.observe("dom:loaded", setupPrefEngine);
 document.observe("dom:loaded", setupIconBar);
 document.observe('dom:loaded', function() { if (!!document.getElementById("ib_chat_launch")) { $('ib_chat_launch').observe('click', launchChat); } });
 function CtdlRandomString()  {
        return((Math.random()+'').substr(3));
 }
+function strcmp ( str1, str2 ) {
+    // http://kevin.vanzonneveld.net
+    // +   original by: Waldo Malqui Silva
+    // +      input by: Steve Hilder
+    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+    // +    revised by: gorthaur
+    // *     example 1: strcmp( 'waldo', 'owald' );
+    // *     returns 1: 1
+    // *     example 2: strcmp( 'owald', 'waldo' );
+    // *     returns 2: -1
+    return ( ( str1 == str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
+}
 
 function emptyElement(element) {
   childNodes = element.childNodes;
   for(var i=0; i<childNodes.length; i++) {
+    try {
     element.removeChild(childNodes[i]);
+    } catch (e) {
+      WCLog(e+"|"+e.description);
+    }
   }
 }
 /** Implements superior internet explorer 'extract all child text from element' feature'. Falls back on buggy, patent violating standardized method */
@@ -131,6 +155,8 @@ function setupIconBar() {
   if (!document.getElementById("switch")) {
       return;
     }
+  _switchToRoomList = getTextContent(document.getElementById("rmlist_template"));
+  _switchToMenu = getTextContent(document.getElementById("mnlist_template"));
   var switchSpan = document.getElementById("switch").firstChild;
   if (switchSpan != null) {
     setTextContent(switchSpan, _switchToRoomList);
@@ -144,9 +170,8 @@ function setupIconBar() {
     }
   }
   var online_users = document.getElementById("online_users");
-  var ou_displayAs = online_users.style.display;
-  if (ou_displayAs != "none") {
-    new Ajax.PeriodicalUpdater('online_users', 'do_template?template=wholist_section', {method: 'get', frequency: 30});
+  if (online_users.offsetParent != null && online_users.offsetTop > 0) {
+    new Ajax.PeriodicalUpdater('online_users', 'do_template?template=who_iconbar', {method: 'get', frequency: 30});
   }
 }
 function changeIconBarEvent(event) {
@@ -154,9 +179,7 @@ function changeIconBarEvent(event) {
 }
 function changeIconBar(target) {
   var switchTo = target.ctdlSwitchIconBarTo;
-  if (!!window.console) {
-    console.log("Changing to: " + switchTo);
-  }
+  WCLog("Changing to: " + switchTo);
   ctdlLocalPrefs.setPref("iconbar_view", target.ctdlSwitchIconBarTo);  
   if (switchTo == "rooms") {
     switch_to_room_list();
@@ -187,62 +210,81 @@ function switch_to_menu_buttons() {
   var roomlist = document.getElementById("roomlist");
   roomlist.className += " hidden";
 }
-function IconBarRoomList() {
+
+function GenericTreeRoomList(roomlist) {
   var currentExpanded = ctdlLocalPrefs.readPref("rooms_expanded");
+  var curRoomName = "";
+  if (document.getElementById("rmname")) {
+    curRoomName = getTextContent(document.getElementById("rmname"));
+  }
   currentDropTargets = new Array();
   var iconbar = document.getElementById("iconbar");
-  roomlist = document.getElementById("roomlist");
   var ul = document.createElement("ul");
   roomlist.appendChild(ul);
   // Add mailbox, because they are special
   var mailboxLI = document.createElement("li");
   ul.appendChild(mailboxLI);
   var mailboxSPAN = document.createElement("span");
-  mailboxSPAN.appendChild(document.createTextNode("Mailbox"));
+  var _mailbox = getTextContent(document.getElementById("mbox_template"));
+  mailboxSPAN.appendChild(document.createTextNode(_mailbox));
   $(mailboxSPAN).observe('click', expandFloorEvent);
   mailboxLI.appendChild(mailboxSPAN);
-  mailboxLI.setAttribute("class", "floor");
+  mailboxLI.className = "floor";
   var mailboxUL = document.createElement("ul");
   mailboxLI.appendChild(mailboxUL);
   var mailboxRooms = GetMailboxRooms();
   for(var i=0; i<mailboxRooms.length; i++) {
-    var room = mailboxRooms[i];
-    currentDropTargets.push(addRoomToList(mailboxUL, room));
+         var room = mailboxRooms[i];
+         currentDropTargets.push(addRoomToList(mailboxUL, room, curRoomName));
   }
-  if (currentExpanded != null && currentExpanded == "Mailbox") {
-    expandFloor(mailboxSPAN);
+  if (currentExpanded != null && currentExpanded == _mailbox ) {
+         expandFloor(mailboxSPAN);
   }
   for(var a=0; a<floors.length; a++) {
-    var floor = floors[a];
-    var floornum = floor[0];
-    var name = floor[1];
-    var floorLI = document.createElement("li");
-    ul.appendChild(floorLI);
-    var floorSPAN = document.createElement("span");
-    floorSPAN.appendChild(document.createTextNode(name));
-    $(floorSPAN).observe('click', expandFloorEvent);
-    floorLI.appendChild(floorSPAN);
-    floorLI.setAttribute("class", "floor");
-    var floorUL = document.createElement("ul");
-    floorLI.appendChild(floorUL);
-    var roomsForFloor = GetRoomsByFloorNum(floornum);
-    for(var b=0; b<roomsForFloor.length; b++) {
-      var room = roomsForFloor[b];
-      currentDropTargets.push(addRoomToList(floorUL, room));
-    }
-    if (currentExpanded != null && currentExpanded == name) {
-      expandFloor(floorSPAN);
+         var floor = floors[a];
+         var floornum = floor[0];
+    
+         if (floornum != -1)
+         {
+
+                 var name = floor[1];
+                 var floorLI = document.createElement("li");
+                 ul.appendChild(floorLI);
+                 var floorSPAN = document.createElement("span");
+                 floorSPAN.appendChild(document.createTextNode(name));
+                 $(floorSPAN).observe('click', expandFloorEvent);
+                 floorLI.appendChild(floorSPAN);
+                 floorLI.className = "floor";
+                 var floorUL = document.createElement("ul");
+                 floorLI.appendChild(floorUL);
+                 var roomsForFloor = GetRoomsByFloorNum(floornum);
+                 for(var b=0; b<roomsForFloor.length; b++) {
+                         var room = roomsForFloor[b];
+                         currentDropTargets.push(addRoomToList(floorUL, room, curRoomName));
+                 }
+                 if (currentExpanded != null && currentExpanded == name) {
+                         expandFloor(floorSPAN);
+                 }
     }
   }
 }
+function IconBarRoomList() {
+  roomlist = document.getElementById("roomlist");
+  GenericTreeRoomList(roomlist);
+}
+function KNRoomsRoomList() {
+  roomlist = document.getElementById("roomlist_knrooms");
+  GenericTreeRoomList(roomlist);
+}
 
-function addRoomToList(floorUL,room) {
+function addRoomToList(floorUL,room, roomToEmphasize) {
   var roomName = room[RN_ROOM_NAME];
   var flag = room[RN_ROOM_FLAG];
   var curView = room[RN_CUR_VIEW];
   var view = room[RN_DEF_VIEW];
+  var raflags = room[RN_RAFLAGS];
   var isMailBox = ((flag & QR_MAILBOX) == QR_MAILBOX);
-  var hasNewMsgs = ((curView & UA_HASNEWMSGS) == UA_HASNEWMSGS);
+  var hasNewMsgs = ((raflags & UA_HASNEWMSGS) == UA_HASNEWMSGS);
   var roomLI = document.createElement("li");
   var roomA = document.createElement("a");
   roomA.setAttribute("href","dotgoto?room="+roomName);
@@ -266,6 +308,9 @@ function addRoomToList(floorUL,room) {
   if (hasNewMsgs) {
     className += " room-newmsgs";
   }
+  if (roomName == roomToEmphasize) {
+    className += " room-emphasized";
+  }
   roomLI.setAttribute("class", className);
   roomA.dropTarget = true;
   roomA.dropHandler = roomListDropHandler;
@@ -273,7 +318,7 @@ function addRoomToList(floorUL,room) {
 }
 
 function roomListDropHandler(target, dropped) {
-  if (dropped.ctdlMsgId) {
+  if (dropped.getAttribute("citadel:msgid")) {
     var room = getTextContent(target);
     var msgIds = "";
     for(msgId in currentlyMarkedRows) { //defined in summaryview.js
@@ -478,8 +523,14 @@ function NotesResizeMouseMove(evt) {
        divTop = parseInt(d.style.height);
        divLeft = parseInt(d.style.width);
 
-       d.style.height = (divTop + y_increment) + 'px';
-       d.style.width = (divLeft + x_increment) + 'px';
+       newHeight = divTop + y_increment;
+       if (newHeight < 50) newHeight = 50;
+
+       newWidth = divLeft + x_increment;
+       if (newWidth < 50) newWidth = 50;
+
+       d.style.height = newHeight + 'px';
+       d.style.width = newWidth + 'px';
 
        saved_x = x;
        saved_y = y;
@@ -618,28 +669,42 @@ function HandleRSVP(question_divname, title_divname, msgnum, cal_partnum, sc) {
 // TODO: Collapse into one function
 function toggleTaskDtStart(event) {
        var checkBox = $('nodtstart');
-       dtStart = document.getElementById("dtstart");
+       var checkBoxTime = $('dtstart_time_assoc');
+       var dtstart = document.getElementById("dtstart");
+       var dtstart_date = document.getElementById("dtstart_date");
+       var dtstart_time = document.getElementById("dtstart_time");
        if (checkBox.checked) {
-               dtStart.disabled = true;
-               dtStart.style.textDecoration = "line-through";
+               dtstart_date.style.visibility = "hidden";
+               dtstart_time.style.visibility = "hidden";
        } else {
-               dtStart.disabled = false;
-               dtStart.style.textDecoration = "";
-               if (dtStart.value.length == 0)
-                       dtStart.dpck._initCurrentDate();
+               if (checkBoxTime.checked) {
+                       dtstart_time.style.visibility = "visible";
+               } else {
+                       dtstart_time.style.visibility = "hidden";
+               }
+               dtstart_date.style.visibility = "visible";
+               if (dtstart.value.length == 0)
+                       dtstart.dpck._initCurrentDate();
        }
 }
 function toggleTaskDue(event) {
        var checkBox = $('nodue');
-       dueField = document.getElementById("due");
+       var checkBoxTime = $('due_time_assoc');
+       var due = document.getElementById("due");
+       var due_date = document.getElementById("due_date");
+       var due_time = document.getElementById("due_time");
        if (checkBox.checked) {
-               dueField.disabled = true;
-               dueField.style.textDecoration = "line-through";
+               due_date.style.visibility = "hidden";
+               due_time.style.visibility = "hidden";
        } else {
-               dueField.disabled = false;
-               dueField.style.textDecoration = "";
-               if (dueField.value.length == 0)
-                       dueField.dpck._initCurrentDate();
+               if (checkBoxTime.checked) {
+                       due_time.style.visibility = "visible";
+               } else {
+                       due_time.style.visibility = "hidden";
+               }
+               due_date.style.visibility = "visible";
+               if (due.value.length == 0)
+                       due.dpck._initCurrentDate();
        }
 }
 function ToggleTaskDateOrNoDateActivate(event) {
@@ -648,7 +713,9 @@ function ToggleTaskDateOrNoDateActivate(event) {
                toggleTaskDtStart(null);
                toggleTaskDue(null);
                $('nodtstart').observe('click', toggleTaskDtStart);
+               $('dtstart_time_assoc').observe('click', toggleTaskDtStart);
                $('nodue').observe('click', toggleTaskDue);
+               $('due_time_assoc').observe('click', toggleTaskDue);
        } 
 }
 function TaskViewGatherCategoriesFromTable() {
@@ -667,19 +734,17 @@ function attachDatePicker(relative) {
 }
 function eventEditAllDay() {
        var allDayCheck = document.getElementById("alldayevent");
-       var dtend= document.getElementById("dtendcell");
+       var dtend_time = document.getElementById("dtend_time");
+       var dtstart_time = document.getElementById("dtstart_time");
        if(allDayCheck.checked) {
-               //dtend.disabled = true;
-               dtend.style.textDecoration = "line-through";
+               dtstart_time.style.visibility = "hidden";
+               dtend_time.style.visibility = "hidden";
        } else {
-               //dtend_day.disabled = false;
-               dtend.style.textDecoration = "";
+               dtstart_time.style.visibility = "visible";
+               dtend_time.style.visibility = "visible";
        }
 }
 
-
-
-
 // Functions which handle show/hide of various elements in the recurrence editor
 
 function RecurrenceShowHide() {
@@ -757,6 +822,135 @@ function RecurrenceShowHide() {
        }
 
 }
+
+
+// Enable or disable the 'check attendee availability' button depending on whether
+// the attendees list is empty
+function EnableOrDisableCheckButton()
+{
+       if ($('attendees_box').value.length == 0) {
+               $('check_button').disabled = true;
+       }
+       else {
+               $('check_button').disabled = false;
+       }
+}
+
+
+
+
 function launchChat(event) {
 window.open('chat', 'ctdl_chat_window', 'toolbar=no,location=no,directories=no,copyhistory=no,status=no,scrollbars=yes,resizable=yes');
 }
+// logger
+function WCLog(msg) {
+  if (!!window.console && !!console.log) {
+    console.log(msg);
+  } else if (!!window.opera && !!opera.postError) {
+    opera.postError(msg);
+  } else {
+    wc_log += msg + "\r\n";
+  }
+}
+
+function fixMissingCSSTable(elems) {
+ if (elems[0] == null || elems[1] == null) {
+    return;
+  }
+  if (elems[0].getStyle("display") != "table-cell") {
+    var parentNode = elems[0].parentNode;
+    var table = document.createElement("table");
+    table.style.width = "100%";
+    var tbody = document.createElement("tbody");
+    table.appendChild(tbody);
+    var tr = document.createElement("tr");
+    tbody.appendChild(tr);
+    parentNode.appendChild(table);
+    for(var i=0; i<elems.length; i++) {
+      parentNode.removeChild(elems[i]);
+      var td = document.createElement("td");
+      td.appendChild(elems[i]);
+      tr.appendChild(td);
+    }
+  }
+}
+function fixbanner() {
+  // Use prototype api methods here
+  var elems = [$('room_banner'),$('actiondiv')];
+  fixMissingCSSTable(elems);
+  if (!is_ie6) {
+    Event.observe(window, 'resize', makeContentScrollable);
+    makeContentScrollable();
+  }
+}
+function makeContentScrollable() {
+if (document.getElementById("banner")
+      && document.getElementById("content") 
+      && !document.getElementById("summary_view")) {
+  WCLog("makeContentScrollable");
+    document.body.style.overflowY="hidden";
+    var global = $("global");
+    global.className += "scrollable";
+    var content = document.getElementById("content");
+    var banner = document.getElementById("banner");
+    var bannerHeight = banner.offsetHeight;
+    banner.style.width="100%";
+    var bannerPercent = (bannerHeight/document.viewport.getHeight())*100;
+    //banner.style.height=bannerPercent+"%";
+    content.style.overflowY="scroll";
+    //content.style.top=bannerPercent+"%";
+    content.style.height=(100-bannerPercent)+"%";
+    content.style.right="0px";
+  }
+}
+function fixOffsetBanner() {
+  var banner = document.getElementById("banner");
+  if (banner.offsetLeft > 0) {
+    var viewportWidth = document.viewport.getWidth();
+    var iconbarWidth = document.getElementById("iconbar").offsetWidth;
+    var contentDiv = document.getElementById("content");
+    var newContentWidth = viewportWidth-iconbarWidth;
+    contentDiv.style.width = newContentWidth+"px";
+  }
+}
+/** Attempt to stop overflowing in x-axis in IE6 */
+function resizeViewport() {
+  var documentWidth = 0;
+  var viewportWidth = document.viewport.getWidth();
+  var iconbar = $('iconbar');
+  var global = $('global');
+  if (iconbar == null || global == null || document.documentElement == null) {
+    return;
+  }
+  if (typeof window.offsetWidth != 'undefined') {
+    documentWidth = window.offsetWidth;
+  } else {
+    documentWidth = document.documentElement.offsetWidth;
+  }
+  if (documentWidth > viewportWidth) {
+    WCLog("resizeViewport");
+    document.documentElement.style.width = viewportWidth+"px";
+    document.documentElement.style.overflowX = "hidden";
+    //viewportWidth = 0.98 * viewportWidth;
+    var newIconBarSize = 0.16 * viewportWidth;
+    var newContentSize = viewportWidth - newIconBarSize;
+    iconbar.style.width = newIconBarSize+"px";
+    global.style.width = newContentSize+"px";
+  }
+}
+
+function RefreshSMTPqueueDisplay() {
+       new Ajax.Updater('smtpqueue_inner_div',
+       'display_smtpqueue_inner_div', { method: 'get',
+               parameters: Math.random() } );
+}
+
+function DeleteSMTPqueueMsg(msgnum1, msgnum2) {
+       new Ajax.Request(
+               'ajax_servcmd', {
+                       method: 'post',
+                       parameters: 'g_cmd=DELE ' + msgnum1 + ',' + msgnum2,
+                       onComplete: RefreshSMTPqueueDisplay()
+               }
+       );
+}