]> code.citadel.org Git - citadel.git/blobdiff - webcit/static/wclib.js
* streamline copyright statements; add Conclusion of included components; flip to...
[citadel.git] / webcit / static / wclib.js
index 48fdd05d83d9fcfc31dd48ec3f3f4975d576ff0e..79df4271ef8aa0aa572ce9ddb244c6b6d12d4f94 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";
@@ -28,17 +32,36 @@ 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 */
@@ -132,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);
@@ -145,7 +170,7 @@ function setupIconBar() {
     }
   }
   var online_users = document.getElementById("online_users");
-  if (online_users.offsetParent != null) {
+  if (online_users.offsetParent != null && online_users.offsetTop > 0) {
     new Ajax.PeriodicalUpdater('online_users', 'do_template?template=wholist_section', {method: 'get', frequency: 30});
   }
 }
@@ -187,6 +212,10 @@ function switch_to_menu_buttons() {
 }
 function IconBarRoomList() {
   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");
@@ -196,18 +225,19 @@ function IconBarRoomList() {
   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));
+    currentDropTargets.push(addRoomToList(mailboxUL, room, curRoomName));
   }
-  if (currentExpanded != null && currentExpanded == "Mailbox") {
+  if (currentExpanded != null && currentExpanded == _mailbox ) {
     expandFloor(mailboxSPAN);
   }
   for(var a=0; a<floors.length; a++) {
@@ -220,13 +250,13 @@ function IconBarRoomList() {
     floorSPAN.appendChild(document.createTextNode(name));
     $(floorSPAN).observe('click', expandFloorEvent);
     floorLI.appendChild(floorSPAN);
-    floorLI.setAttribute("class", "floor");
+    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));
+      currentDropTargets.push(addRoomToList(floorUL, room, curRoomName));
     }
     if (currentExpanded != null && currentExpanded == name) {
       expandFloor(floorSPAN);
@@ -234,7 +264,7 @@ function IconBarRoomList() {
   }
 }
 
-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];
@@ -264,6 +294,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;
@@ -616,12 +649,24 @@ function HandleRSVP(question_divname, title_divname, msgnum, cal_partnum, sc) {
 // TODO: Collapse into one function
 function toggleTaskDtStart(event) {
        var checkBox = $('nodtstart');
+       var checkBoxTime = $('dtstart_time');
        dtStart = document.getElementById("dtstart");
+       dtStartHour = document.getElementById("dtstart_hour");
+       dtStartMinute = document.getElementById("dtstart_minute");
        if (checkBox.checked) {
                dtStart.disabled = true;
+               dtStartHour.disabled = true;
+               dtStartMinute.disabled = true;
                dtStart.style.textDecoration = "line-through";
        } else {
                dtStart.disabled = false;
+               if (checkBoxTime.checked) {
+                       dtStartHour.disabled = false;
+                       dtStartMinute.disabled = false;
+               } else {
+                       dtStartHour.disabled = true;
+                       dtStartMinute.disabled = true;
+               }
                dtStart.style.textDecoration = "";
                if (dtStart.value.length == 0)
                        dtStart.dpck._initCurrentDate();
@@ -629,12 +674,24 @@ function toggleTaskDtStart(event) {
 }
 function toggleTaskDue(event) {
        var checkBox = $('nodue');
+       var checkBoxTime = $('due_time');
        dueField = document.getElementById("due");
+       dueFieldHour = document.getElementById("due_hour");
+       dueFieldMinute = document.getElementById("due_minute");
        if (checkBox.checked) {
                dueField.disabled = true;
+               dueFieldHour.disabled = true;
+               dueFieldMinute.disabled = true;
                dueField.style.textDecoration = "line-through";
        } else {
                dueField.disabled = false;
+               if (checkBoxTime.checked) {
+                       dueFieldHour.disabled = false;
+                       dueFieldMinute.disabled = false;
+               } else {
+                       dueFieldHour.disabled = true;
+                       dueFieldMinute.disabled = true;
+               }
                dueField.style.textDecoration = "";
                if (dueField.value.length == 0)
                        dueField.dpck._initCurrentDate();
@@ -646,7 +703,9 @@ function ToggleTaskDateOrNoDateActivate(event) {
                toggleTaskDtStart(null);
                toggleTaskDue(null);
                $('nodtstart').observe('click', toggleTaskDtStart);
+               $('dtstart_time').observe('click', toggleTaskDtStart);
                $('nodue').observe('click', toggleTaskDue);
+               $('due_time').observe('click', toggleTaskDue);
        } 
 }
 function TaskViewGatherCategoriesFromTable() {
@@ -752,6 +811,23 @@ 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');
 }
@@ -761,11 +837,13 @@ function WCLog(msg) {
     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) {
+ if (elems[0] == null || elems[1] == null) {
     return;
   }
   if (elems[0].getStyle("display") != "table-cell") {
@@ -786,6 +864,66 @@ function fixMissingCSSTable(elems) {
   }
 }
 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";
+  }
 }