X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fstatic%2Fwclib.js;h=de48e2efbf8c37a6112109c341586ca6274048c0;hb=e1d43d5e4e749fa7756b324bbb16da561fc45e87;hp=a894692cd91e9ad15c495006fd0a9b96b9de5856;hpb=e203de3fd4a86e09cbb5b4eaf7d08631db22f3da;p=citadel.git diff --git a/webcit/static/wclib.js b/webcit/static/wclib.js index a894692cd..de48e2efb 100644 --- a/webcit/static/wclib.js +++ b/webcit/static/wclib.js @@ -1,28 +1,141 @@ -// -// $Id: wclib.js,v 625.2 2005/09/18 04:04:32 ajc Exp $ -// -// JavaScript function library for WebCit. -// -// - +/* + * JavaScript function library for WebCit. + * + * Copyright (c) 2005-2012 by the citadel.org team + * + * This program is open source software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 3. + * the Free Software Foundation, either version 3 of the License, or + * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * along with this program. If not, see . + */ var browserType; var room_is_trash = 0; -if (document.layers) {browserType = "nn4"} +var currentlyExpandedFloor = null; +var roomlist = null; +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" + browserType= "gecko"; } - var ns6=document.getElementById&&!document.all; - - +Event.observe(window, 'load', ToggleTaskDateOrNoDateActivate); +Event.observe(window, 'load', taskViewActivate); +//document.observe("dom:loaded", setupPrefEngine); +document.observe("dom:loaded", setupIconBar); 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 CtdlMarkLog($Which, $Status) +{ + if ($Status) + document.getElementById($Which).checked == false; + else + document.getElementById($Which).checked == true; + +} +function ToggleLogEnable($Which) +{ + var p; + var Status = !document.getElementById($Which).checked; + if (Status) + p= encodeURI('g_cmd=LOGS ' + $Which + '|0'); + else + p= encodeURI('g_cmd=LOGS ' + $Which + '|1'); + new Ajax.Request('ajax_servcmd', { + method: 'post', + parameters: p, + onComplete: CtdlMarkLog($Which, Status) + }); +} + +function SMTPRunQueue() +{ + var p; + + p= encodeURI('g_cmd=SMTP runqueue'); + new Ajax.Request('ajax_servcmd', { + method: 'post', + parameters: p, + onComplete: function(transport) { ajax_important_message(transport.responseText.substr(4));} + }); +} + +function NetworkSynchronizeRoom(NodeName) +{ + var p; + + p= encodeURI('g_cmd=NSYN ' + NodeName); + new Ajax.Request('ajax_servcmd', { + method: 'post', + parameters: p, + onComplete: function(transport) { ajax_important_message(transport.responseText.substr(4));} + }); +} +function ToggleVisibility ($Which) +{ + if (document.getElementById) + { + if (document.getElementById($Which).style.display == "none") + document.getElementById($Which).style.display = "inline"; + else + document.getElementById($Which).style.display = "none"; + } +} + +function emptyElement(element) { + childNodes = element.childNodes; + for(var i=0; i 0) { - for (i=0; i 0) ) { - for (i=0; i 800) { + var mvCommand = "g_cmd=MOVE%20" + msgIds + "|"+encodeURIComponent(room)+"|0"; + new Ajax.Request("ajax_servcmd", { + parameters: mvCommand, + method: 'post', + }); + msgIds = ""; + } + + } + var mvCommand = "g_cmd=MOVE%20" + msgIds + "|"+encodeURIComponent(room)+"|0"; + new Ajax.Request('ajax_servcmd', { + method: 'post', + parameters: mvCommand, + onComplete: deleteAllMarkedRows()}); + } +} +function expandFloorEvent(event) { + expandFloor(event.target); +} +function expandFloor(target) { + if (target.nodeName.toLowerCase() != "span") { + return; // ignore clicks on child UL + } + ctdlLocalPrefs.setPref("rooms_expanded", target.firstChild.nodeValue); + var parentUL = target.parentNode; + if (currentlyExpandedFloor != null) { + currentlyExpandedFloor.className = currentlyExpandedFloor.className.replace("floor-expanded",""); + } + parentUL.className = parentUL.className + " floor-expanded"; + currentlyExpandedFloor = parentUL; +} + +// These functions handle moving sticky notes around the screen by dragging them + +var uid_of_note_being_dragged = 0; +var saved_cursor_style = 'default'; +var note_was_dragged = 0; + +function NotesDragMouseUp(evt) { + document.onmouseup = null; + document.onmousemove = null; + if (document.layers) { + document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE); } - else if (evt.shiftKey) { - - // Group select: first clear everything out... - if (CtdlNumMsgsSelected > 0) { - for (i=0; i 0) { + p = 'note_uid=' + uid_of_note_being_dragged + + '&left=' + d.style.left + + '&top=' + d.style.top + + '&r=' + CtdlRandomString(); new Ajax.Request( - 'ajax_servcmd', { + 'ajax_update_note', + { method: 'post', - parameters: 'g_cmd=SEEN '+msgnum+'|1', - onComplete: CtdlRemoveTheUnseenBold(msgnum) + parameters: p } ); } - - // Save the selected position in case the user does a group select next time. - CtdlLastMsgnumSelected = msgnum; - return false; // try to defeat the default click behavior + uid_of_note_being_dragged = ''; + return true; } -// Delete selected messages. -function CtdlDeleteSelectedMessages(evt) { - - if (CtdlNumMsgsSelected < 1) { - // Nothing to delete, so exit silently. - return false; - } - for (i=0; i 0) { - new Ajax.Request( - 'ajax_servcmd', { - method: 'post', - parameters: 'g_cmd=DELE ' + CtdlMsgsSelected[i], - onComplete: CtdlClearDeletedMsg(CtdlMsgsSelected[i]) - } - ); - } - else { - new Ajax.Request( - 'ajax_servcmd', { - method: 'post', - parameters: 'g_cmd=MOVE ' + CtdlMsgsSelected[i] + '|_TRASH_|0', - onComplete: CtdlClearDeletedMsg(CtdlMsgsSelected[i]) - } - ); - } - } - CtdlNumMsgsSelected = 0; +function NotesDragMouseMove(evt) { + x = (ns6 ? evt.clientX : event.clientX); + x_increment = x - saved_x; + y = (ns6 ? evt.clientY : event.clientY); + y_increment = y - saved_y; - // Clear the preview pane too. - $('preview_pane').innerHTML = ''; -} + // Move the div + d = $('note-' + uid_of_note_being_dragged); + divTop = parseInt(d.style.top); + divLeft = parseInt(d.style.left); -// Move selected messages. -function CtdlMoveSelectedMessages(evt, target_roomname) { - - if (CtdlNumMsgsSelected < 1) { - // Nothing to delete, so exit silently. - return false; - } - for (i=0; i 0) { + p = 'note_uid=' + uid_of_note_being_resized + + '&width=' + d.style.width + + '&height=' + d.style.height + + '&r=' + CtdlRandomString(); + new Ajax.Request( + 'ajax_update_note', + { + method: 'post', + parameters: p + } + ); } - return false; + uid_of_note_being_resized = ''; + return false; // disable the default action } -function CtdlMoveMsgMouseMove(evt) { +function NotesResizeMouseMove(evt) { x = (ns6 ? evt.clientX : event.clientX); + x_increment = x - saved_x; y = (ns6 ? evt.clientY : event.clientY); + y_increment = y - saved_y; - if ( (x == saved_x) && (y == saved_y) ) { - return true; - } - - if (CtdlNumMsgsSelected < 1) { - return true; - } + // Move the div + d = $('note-' + uid_of_note_being_resized); - if (!mm_div) { + divTop = parseInt(d.style.height); + divLeft = parseInt(d.style.width); + newHeight = divTop + y_increment; + if (newHeight < 50) newHeight = 50; - drag_o_text = "
"; - for (i=0; i'; - } - drag_o_text = drag_o_text + "
"; + newWidth = divLeft + x_increment; + if (newWidth < 50) newWidth = 50; - mm_div = document.createElement("DIV"); - mm_div.style.position='absolute'; - mm_div.style.top = y + 'px'; - mm_div.style.left = x + 'px'; - mm_div.style.pixelHeight = '300'; - mm_div.style.pixelWidth = '300'; - mm_div.innerHTML = drag_o_text; - document.body.appendChild(mm_div); - } - else { - mm_div.style.top = y + 'px'; - mm_div.style.left = x + 'px'; - } + d.style.height = newHeight + 'px'; + d.style.width = newWidth + 'px'; - return false; // prevent the default mouse action from happening? + saved_x = x; + saved_y = y; + note_was_resized = 1; + return false; // disable the default action } -function CtdlMoveMsgMouseUp(evt) { - document.onmouseup = null; - document.onmousemove = null; - if (document.layers) { - document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE); - } - - if (mm_div) { - document.body.removeChild(mm_div); - mm_div = null; - } - if (num_drop_targets < 1) { // nowhere to drop - return true; +function NotesResizeMouseDown(evt, uid) { + saved_x = (ns6 ? evt.clientX : event.clientX); + saved_y = (ns6 ? evt.clientY : event.clientY); + document.onmouseup = NotesResizeMouseUp; + document.onmousemove = NotesResizeMouseMove; + if (document.layers) { + document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE); } + uid_of_note_being_resized = uid; + d = $('note-' + uid_of_note_being_resized); + saved_cursor_style = d.style.cursor; + d.style.cursor = 'move'; + return false; // disable the default action +} - // Did we release the mouse button while hovering over a drop target? - // NOTE: this only works cross-browser because the iconbar div is always - // positioned at 0,0. Browsers differ in whether the 'offset' - // functions return pos relative to the document or parent. - - for (i=0; i= l) && (x <= r) && (y >= t) && (y <= b) ) { - // Yes, we dropped it on a hotspot. - CtdlMoveSelectedMessages(evt, drop_targets_roomnames[i]); - return true; - } + // submit an ajax http call to delete it on the server + p = 'note_uid=' + uid_of_note_being_deleted + + '&deletenote=yes' + + '&r=' + CtdlRandomString(); + new Ajax.Request( + 'ajax_update_note', + { + method: 'post', + parameters: p + } + ); } - - return true; } - function ctdl_ts_getInnerText(el) { if (typeof el == "string") return el; if (typeof el == "undefined") { return el }; @@ -552,139 +676,347 @@ 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 = "

  Loading....

"; +} -// This function handles the creation of new notes in the "Notes" view. -// -function add_new_note() { - new_eid = CtdlRandomString(); - $('new_notes_here').innerHTML = $('new_notes_here').innerHTML - + '' - + '' + Date() + '
' - ; +// Pop open the address book (target_input is the INPUT field to populate) - new Ajax.InPlaceEditor('note' + new_eid, - 'updatenote?eid=' + new_eid , {rows:5,cols:72}); +function PopOpenAddressBook(target_input) { + $('address_book_popup').style.display = 'block'; + p = 'target_input=' + target_input + '&r=' + CtdlRandomString(); + new Ajax.Updater( + 'address_book_popup_middle_div', + 'display_address_book_middle_div', + { + method: 'get', + parameters: p, + evalScripts: true + } + ); } -function CtdlShowRaw(msgnum) { -var customnav = document.createElement("span"); -var mode_citadel = document.createElement("a"); -mode_citadel.appendChild(document.createTextNode("Citadel Source")); -var mode_rfc822 = document.createElement("a"); -mode_rfc822.appendChild(document.createTextNode(" RFC822 Source")); -mode_citadel.setAttribute("href","#"); -mode_rfc822.setAttribute("href","#"); -mode_rfc822.setAttribute("onclick","rawSwitch822('" + msgnum + "');"); -mode_citadel.setAttribute("onclick","rawSwitchCitadel('" + msgnum + "');"); -customnav.appendChild(mode_citadel); -customnav.appendChild(mode_rfc822); -customnav.setAttribute("class","floatcustomnav"); -floatwindow("headerscreen","pre",customnav); -rawSwitch822(msgnum); +function PopulateAddressBookInnerDiv(which_addr_book, target_input) { + $('address_book_inner_div').innerHTML = "

  Loading....

"; + p = 'which_addr_book=' + which_addr_book + + '&target_input=' + target_input + + '&r=' + CtdlRandomString(); + new Ajax.Updater( + 'address_book_inner_div', + 'display_address_book_inner_div', + { + method: 'get', + parameters: p + } + ); } -function rawSwitch822(msgnum) { -CtdlLoadScreen("headerscreen"); -new Ajax.Updater("headerscreen", -'ajax_servcmd_esc', - { method: 'post',parameters: 'g_cmd=MSG2 ' +msgnum } ); +// What happens when a contact is selected from the address book popup +// (populate the specified target) +function AddContactsToTarget(target, whichaddr) { + while (whichaddr.selectedIndex != -1) { + if (target.value.length > 0) { + target.value = target.value + ', '; + } + target.value = target.value + whichaddr.value; + whichaddr.options[whichaddr.selectedIndex].selected = false; + } +} + +// Respond to a meeting invitation +function RespondToInvitation(question_divname, title_divname, msgnum, cal_partnum, sc) { + p = 'msgnum=' + msgnum + '&cal_partnum=' + cal_partnum + '&sc=' + sc ; + new Ajax.Updater(title_divname, 'respond_to_request', { method: 'post', parameters: p } ); + Effect.Fade(question_divname, { duration: 0.5 }); +} + +// Handle a received RSVP +function HandleRSVP(question_divname, title_divname, msgnum, cal_partnum, sc) { + p = 'msgnum=' + msgnum + '&cal_partnum=' + cal_partnum + '&sc=' + sc ; + new Ajax.Updater(title_divname, 'handle_rsvp', { method: 'post', parameters: p } ); + Effect.Fade(question_divname, { duration: 0.5 }); +} +/* var fakeMouse = document.createEvent("MouseEvents"); + fakeMouse.initMouseEvent("click", true, true, window, + 0,0,0,0,0, false, false, false, false, 0, null); */ +// TODO: Collapse into one function +function toggleTaskDtStart(event) { + var checkBox = $('nodtstart'); + 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_date.style.visibility = "hidden"; + dtstart_time.style.visibility = "hidden"; + } else { + 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'); + 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) { + due_date.style.visibility = "hidden"; + due_time.style.visibility = "hidden"; + } else { + 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) { + var dtstart = document.getElementById("nodtstart"); + if (dtstart != null) { + 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() { + var table = $('taskview'); + +} +function attachDatePicker(relative) { + var dpck = new DatePicker({ + relative: relative, + language: 'en', //wclang.substr(0,2), + disableFutureDate: false, + dateFormat: [ ["yyyy", "mm", "dd"], "-"], + showDuration: 0.2 + }); + document.getElementById(relative).dpck = dpck; // attach a ref to it +} +function eventEditAllDay() { + var allDayCheck = document.getElementById("alldayevent"); + var dtend_time = document.getElementById("dtend_time"); + var dtstart_time = document.getElementById("dtstart_time"); + if(allDayCheck.checked) { + dtstart_time.style.visibility = "hidden"; + dtend_time.style.visibility = "hidden"; + } else { + dtstart_time.style.visibility = "visible"; + dtend_time.style.visibility = "visible"; + } } -function rawSwitchCitadel(msgnum) { -CtdlLoadScreen("headerscreen"); -new Ajax.Updater("headerscreen", -'ajax_servcmd_esc', - { method: 'post',parameters: 'g_cmd=MSG0 ' +msgnum } ); +// Functions which handle show/hide of various elements in the recurrence editor -} +function RecurrenceShowHide() { + + if ($('is_recur').checked) { + $('rrule_div').style.display = 'block'; + } + else { + $('rrule_div').style.display = 'none'; + } + + if ($('freq_selector').selectedIndex == 4) { + $('weekday_selector').style.display = 'block'; + } + else { + $('weekday_selector').style.display = 'none'; + } + + if ($('freq_selector').selectedIndex == 5) { + $('monthday_selector').style.display = 'block'; + } + else { + $('monthday_selector').style.display = 'none'; + } + + if ($('rrend_count').checked) { + $('rrcount').disabled = false; + } + else { + $('rrcount').disabled = true; + } + + if ($('rrend_until').checked) { + $('rruntil').disabled = false; + } + else { + $('rruntil').disabled = true; + } + + if ($('rrmonthtype_mday').checked) { + $('rrmday').disabled = false; + } + else { + $('rrmday').disabled = true; + } + + if ($('rrmonthtype_wday').checked) { + $('rrmweek').disabled = false; + $('rrmweekday').disabled = false; + } + else { + $('rrmweek').disabled = true; + $('rrmweekday').disabled = true; + } + + if ($('freq_selector').selectedIndex == 6) { + $('yearday_selector').style.display = 'block'; + } + else { + $('yearday_selector').style.display = 'none'; + } + + $('ymday').innerHTML = 'XXXX-' + $('dtstart').value.substr(5); + $('rrmday').innerHTML = $('dtstart').value.substr(8); + + if ($('rryeartype_ywday').checked) { + $('rrymweek').disabled = false; + $('rrymweekday').disabled = false; + $('rrymonth').disabled = false; + } + else { + $('rrymweek').disabled = true; + $('rrymweekday').disabled = true; + $('rrymonth').disabled = true; + } -function floatwindow(newdivid,contentelementtype,customnav) { -var windiv = document.createElement("div"); -windiv.setAttribute("class","floatwindow"); -var winid = newdivid+"_window"; -windiv.setAttribute("id",winid); -var nav = document.createElement("div"); -if (customnav != null) { -nav.appendChild(customnav); -} -var minimizeA = document.createElement("a"); -var minimizeButton = document.createTextNode("Close"); -minimizeA.appendChild(minimizeButton); -minimizeA.setAttribute("onclick","killFloatWindow(this);"); -minimizeA.setAttribute("href","#"); -nav.appendChild(minimizeA); -nav.setAttribute("class","floatnav"); -windiv.appendChild(nav); -var contentarea = document.createElement("pre"); -contentarea.setAttribute("class","floatcontent"); -contentarea.setAttribute("id",newdivid); -windiv.appendChild(contentarea); -document.body.appendChild(windiv); -} -function killFloatWindow(caller) { -var span = caller.parentNode; -var fwindow = span.parentNode; -fwindow.parentNode.removeChild(fwindow); } -// Place a gradient loadscreen on an element, e.g to use before Ajax.updater -function CtdlLoadScreen(elementid) { -var elem = document.getElementById(elementid); -elem.innerHTML = "

  Loading....

"; -} - - -// Show info for a user, basically replaces showuser() -// matt@comalies is to blame for this poorly coded masterpiece. -function CtdlShowUserInfoPopup(Element) { - try { - // hopefully no one needs to use the class attribute... could be better done - // with xmlns though.. - var user = Element.getAttribute("class"); - var updname = "biospace_"+user; - if (document.getElementById(updname) == null) { - // insert a space for the bio - var pNode = Element.parentNode; - var newdiv = document.createElement("div"); - newdiv.id = updname; - newdiv.innerHTML = "Getting user info...."; - pNode.appendChild(newdiv); - CtdlLoadScreen(updname); - new Ajax.Updater(updname, 'showuser_ajax?who='+user, { method: 'get' } ); - } + + +// 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; } - catch(err) { - return true; + else { + $('check_button').disabled = false; } - return false; } -// Pop open the address book -function PopOpenAddressBook() { - $('address_book_popup').style.display = 'block'; - new Ajax.Updater( - 'address_book_popup_middle_div', - 'display_address_book_middle_div', - { - method: 'get', - parameters: CtdlRandomString(), - onComplete: PopulateAddressBookInnerDiv() + + +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 RefreshSMTPqueueDisplay() { + new Ajax.Updater('mailqueue_list', + 'dotskip?room=__CitadelSMTPspoolout__&view=11&ListOnly=yes', { 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: function(transport) { ajax_important_message(transport.responseText.substr(4)); RefreshSMTPqueueDisplay();} } ); - Nifty('div#address_book_popup_container_div','big transparent'); } -function PopulateAddressBookInnerDiv() { - $('address_book_inner_div').innerHTML = "

  Loading....

"; + +function ConfirmLogoff() { new Ajax.Updater( - 'address_book_inner_div', - 'display_address_book_inner_div', + 'md-content', + 'do_template?template=confirmlogoff', { method: 'get', - parameters: CtdlRandomString() + evalScripts: true, + 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 ; +} + + +function toggle_roomlist() +{ + /* WARNING: VILE, SLEAZY HACK. We determine the state of the box based on the image loaded. */ + if ( $('expand_roomlist').src.substring($('expand_roomlist').src.length - 12) == "collapse.gif" ) { + $('roomlist').style.display = 'none'; + $('expand_roomlist').src = 'static/webcit_icons/expand.gif'; + wstate=0; + } + + else { + $('roomlist').style.display = 'block'; + $('expand_roomlist').src = 'static/webcit_icons/collapse.gif'; + $('roomlist').innerHTML = ''; + FillRooms(IconBarRoomList); + wstate=1; + } + + // tell the server what I did + p = 'toggle_roomlist_expanded_state?wstate=' + wstate + '?rand=' + Math.random() ; + new Ajax.Request(p, { method: 'get' } ); + + return false; /* this prevents the click from registering as a roomlist button press */ +} + + +function toggle_wholist() +{ + /* WARNING: VILE, SLEAZY HACK. We determine the state of the box based on the image loaded. */ + if ( $('expand_wholist').src.substring($('expand_wholist').src.length - 12) == "collapse.gif" ) { + $('online_users').style.display = 'none'; + $('expand_wholist').src = 'static/webcit_icons/expand.gif'; + wstate=0; + } + + else { + $('online_users').style.display = 'block'; + $('expand_wholist').src = 'static/webcit_icons/collapse.gif'; + activate_iconbar_wholist_populat0r(); + wstate=1; + } + + // tell the server what I did + p = 'toggle_wholist_expanded_state?wstate=' + wstate + '?rand=' + Math.random() ; + new Ajax.Request(p, { method: 'get' } ); + + return false; /* this prevents the click from registering as a wholist button press */ +} + +