Switching languages now works again
[citadel.git] / webcit / static / wclib.js
index f7db14842e728dd7565401bed530cba5f38dd655..bb193c7b2b5f04d468ac085b35dbb00472e612ba 100644 (file)
@@ -1,9 +1,9 @@
-//
-// $Id$
-//
-// JavaScript function library for WebCit.
-//
-//
+/*
+ * Copyright 2005 - 2010 The Citadel Team
+ * Licensed under the GPL V3
+ *
+ * JavaScript function library for WebCit.
+ */
 
 
 var browserType;
@@ -20,6 +20,7 @@ var currentDropTarget = null;
 var supportsAddEventListener = (!!document.addEventListener);
 var today = new Date();
 
+var wc_log = "";
 if (document.all) {browserType = "ie"}
 if (window.navigator.userAgent.toLowerCase().match("gecko")) {
        browserType= "gecko";
@@ -27,18 +28,33 @@ 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);
 //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 */
@@ -147,8 +163,8 @@ function setupIconBar() {
     }
   }
   var online_users = document.getElementById("online_users");
-  if (online_users.offsetParent != null) {
-    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) {
@@ -187,11 +203,15 @@ 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
@@ -202,48 +222,62 @@ function IconBarRoomList() {
   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);
@@ -267,6 +301,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;
@@ -274,13 +311,13 @@ 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
       msgIds += ","+msgId;
     }
-    var mvCommand = "g_cmd=MOVE " + msgIds + "|"+room+"|0";
+    var mvCommand = encodeURI("g_cmd=MOVE " + msgIds + "|"+room+"|0");
     new Ajax.Request('ajax_servcmd', {
       method: 'post',
          parameters: mvCommand,
@@ -479,8 +516,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;
@@ -551,7 +594,7 @@ function ctdl_ts_getInnerText(el) {
 // Place a gradient loadscreen on an element, e.g to use before Ajax.updater
 function CtdlLoadScreen(elementid) {
 var elem = document.getElementById(elementid);
-elem.innerHTML = "<div align=center><br><table border=0 cellpadding=10 bgcolor=\"#ffffff\"><tr><td><img src=\"static/throbber.gif\" /><font color=\"#AAAAAA\">&nbsp;&nbsp;Loading....</font></td></tr></table><br /></div>";
+elem.innerHTML = "<div align=center><br><table border=0 cellpadding=10 bgcolor=\"#ffffff\"><tr><td><img src=\"static/throbber.gif\" /><font color=\"#AAAAAA\">&nbsp;&nbsp;Loading....</font></td></tr></table><br></div>";
 }
 
 
@@ -573,7 +616,7 @@ function PopOpenAddressBook(target_input) {
 }
 
 function PopulateAddressBookInnerDiv(which_addr_book, target_input) {
-       $('address_book_inner_div').innerHTML = "<div align=center><br><table border=0 cellpadding=10 bgcolor=\"#ffffff\"><tr><td><img src=\"static/throbber.gif\" /><font color=\"#AAAAAA\">&nbsp;&nbsp;Loading....</font></td></tr></table><br /></div>";
+       $('address_book_inner_div').innerHTML = "<div align=center><br><table border=0 cellpadding=10 bgcolor=\"#ffffff\"><tr><td><img src=\"static/throbber.gif\" /><font color=\"#AAAAAA\">&nbsp;&nbsp;Loading....</font></td></tr></table><br></div>";
        p = 'which_addr_book=' + which_addr_book
          + '&target_input=' + target_input
          + '&r=' + CtdlRandomString();
@@ -619,28 +662,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) {
@@ -649,7 +706,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() {
@@ -668,13 +727,14 @@ 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";
        }
 }
 
@@ -755,6 +815,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');
 }
@@ -764,31 +841,45 @@ 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 || 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 RefreshSMTPqueueDisplay() {
+       new Ajax.Updater('smtpqueue_inner_div',
+       'display_smtpqueue_inner_div', { method: 'get',
+               parameters: Math.random() } );
+}
+
+function DeleteSMTPqueueMsg(msgnum1, msgnum2) {
+       var p = encodeURI('g_cmd=DELE ' + msgnum1 + ',' + msgnum2);
+       new Ajax.Request(
+               'ajax_servcmd', {
+                       method: 'post',
+                       parameters: p,
+                       onComplete: RefreshSMTPqueueDisplay()
+               }
+       );
 }
-function fixbanner() {
-  var elems = [$('room_banner'),$('actiondiv')];
-  fixMissingCSSTable(elems);
+
+
+function ConfirmLogoff() {
+       new Ajax.Updater(
+               'md-content',
+               'do_template?template=confirmlogoff',
+                {
+                        method: 'get',
+                       onSuccess: function(cl_success) {
+                               toggleModal(1);
+                       }
+                }
+        );
+}
+
+
+function switch_to_lang(new_lang) {
+        p = 'push?url=' + encodeURI(window.location);
+        new Ajax.Request(p, { method: 'get' } );
+       window.location = 'switch_language?lang=' + new_lang ;
 }