1 /*jshint strict: false, bitwise: false */
2 /*global document, window, Ajax, currentlyMarkedRows, Event, event, taskViewActivate, setTimeout, fillRooms, $, ctdlLocalPrefs, currentDropTargets, iconBarRoomList, confirm, Effect */
4 * JavaScript function library for WebCit.
6 * Copyright (c) 2005-2012 by the citadel.org team
8 * This program is open source software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License, version 3.
10 * the Free Software Foundation, either version 3 of the License, or
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 var room_is_trash = 0;
25 var currentlyExpandedFloor = null;
28 var supportsAddEventListener = (!!document.addEventListener);
29 var today = new Date();
32 if (document.all) {browserType = "ie";}
33 if (window.navigator.userAgent.toLowerCase().match("gecko")) {
36 var ns6=document.getElementById&&!document.all;
37 Event.observe(window, 'load', ToggleTaskDateOrNoDateActivate);
38 Event.observe(window, 'load', taskViewActivate);
39 //document.observe("dom:loaded", setupPrefEngine);
40 document.observe("dom:loaded", setupIconBar);
41 function ctdlRandomString() {
42 return((Math.random()+'').substr(3));
44 function strcmp ( str1, str2 ) {
45 // http://kevin.vanzonneveld.net
46 // + original by: Waldo Malqui Silva
47 // + input by: Steve Hilder
48 // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
49 // + revised by: gorthaur
50 // * example 1: strcmp( 'waldo', 'owald' );
52 // * example 2: strcmp( 'owald', 'waldo' );
55 return ( ( str1 === str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
58 function ctdlMarkLog(Which, Status)
61 document.getElementById(Which).checked = false;
64 document.getElementById(Which).checked = true;
68 function ToggleLogEnable(Which)
71 var element = document.getElementById(Which);
72 if (element.hasOwnProperty('checked')) {
73 var Status = element.checked;
75 p = encodeURI('g_cmd=LOGS ' + Which + '|0');
78 p = encodeURI('g_cmd=LOGS ' + Which + '|1');
80 new Ajax.Request('ajax_servcmd', {
83 onComplete: ctdlMarkLog(Which, Status)
88 function SMTPRunQueue()
92 p= encodeURI('g_cmd=SMTP runqueue');
93 new Ajax.Request('ajax_servcmd', {
96 onComplete: function(transport) { ajax_important_message(transport.responseText.substr(4));}
100 function NetworkSynchronizeRoom(NodeName)
104 p= encodeURI('g_cmd=NSYN ' + NodeName);
105 new Ajax.Request('ajax_servcmd', {
108 onComplete: function(transport) { ajax_important_message(transport.responseText.substr(4));}
111 function ToggleVisibility ($Which)
113 if (document.getElementById)
115 if (document.getElementById($Which).style.display === "none") {
116 document.getElementById($Which).style.display = "inline";
119 document.getElementById($Which).style.display = "none";
124 function emptyElement(element) {
125 var childNodes = element.childNodes;
126 for(var i=0; i<childNodes.length; i++) {
128 element.removeChild(childNodes[i]);
130 wCLog(e+"|"+e.description);
134 // Implements superior internet explorer 'extract all child text from element' feature'.
135 // Falls back on buggy, patent violating standardized method
136 function getTextContent(element) {
137 if (element.textContent === undefined) {
138 return element.innerText;
140 return element.textContent;
142 /** Same reasons as above */
143 function setTextContent(element, textContent) {
144 if(element.textContent === undefined) {
145 element.innerText = textContent;
147 element.textContent = textContent;
151 // We love string tokenizers.
152 function extract_token(source_string, token_num, delimiter) {
154 var extracted_string = source_string;
157 for (i=0; i<token_num; ++i) {
158 j = extracted_string.indexOf(delimiter);
160 extracted_string = extracted_string.substr(j+1);
165 j = extracted_string.indexOf(delimiter);
167 extracted_string = extracted_string.substr(0, j);
170 return extracted_string;
173 function CtdlSpawnContextMenu(event, source) {
174 // remove any existing menus
175 disintergrateContextMenus(null);
176 var x = event.clientX-10; // cut a few pixels out so our mouseout works right
177 var y = event.clientY-10;
178 var contextDIV = document.createElement("div");
179 contextDIV.setAttribute("id", "ctdlContextMenu");
180 document.body.appendChild(contextDIV);
181 var sourceChildren = source.childNodes;
182 for(var j=0; j<sourceChildren.length; j++) {
183 contextDIV.appendChild(sourceChildren[j].cloneNode(true));
185 var leftRule = "left: "+x+"px;";
186 contextDIV.setAttribute("style", leftRule);
187 contextDIV.setAttribute("actual", leftRule);
188 contextDIV.style.top = y+"px";
189 contextDIV.style.display = "block";
190 $(contextDIV).observe('mouseout',disintergrateContextMenus);
192 function disintergrateContextMenus(event) {
193 var contextMenu = document.getElementById("ctdlContextMenu");
195 contextMenu.parentNode.removeChild(contextMenu);
197 Event.stopObserving(document,'click',disintergrateContextMenus);
199 // This code handles the popups for important-messages.
200 function hide_imsg_popup() {
201 if (browserType === "gecko") {
202 document.poppedLayer = eval('document.getElementById(\'important_message\')');
204 else if (browserType === "ie") {
205 document.poppedLayer = eval('document.all[\'important_message\']');
208 document.poppedLayer = eval('document.layers[\'`important_message\']');
211 document.poppedLayer.style.visibility = "hidden";
213 function remove_something(what_to_search, new_visibility) {
214 if (browserType === "gecko") {
215 document.poppedLayer = eval('document.getElementById(\'' + what_to_search + '\')');
217 else if (browserType === "ie") {
218 document.poppedLayer = eval('document.all[\'' + what_to_search + '\']');
221 document.poppedLayer = eval('document.layers[\'`' + what_to_search + '\']');
223 if (document.poppedLayer !== null) {
224 document.poppedLayer.innerHTML = "";
228 function unhide_imsg_popup() {
229 if (browserType === "gecko") {
230 document.poppedLayer = eval('document.getElementById(\'important_message\')');
232 else if (browserType === "ie") {
233 document.poppedLayer = eval('document.all[\'important_message\']');
236 document.poppedLayer = eval('document.layers[\'`important_message\']');
239 document.poppedLayer.style.visibility = "visible";
240 setTimeout('hide_imsg_popup()', 5000);
243 function ajax_important_message(messagetext)
245 if (browserType === "gecko") {
246 document.poppedLayer = eval('document.getElementById(\'important_message\')');
248 else if (browserType === "ie") {
249 document.poppedLayer = eval('document.all[\'important_message\']');
252 document.poppedLayer = eval('document.layers[\'`important_message\']');
254 document.poppedLayer.style.visibility = "visible";
255 setTimeout('hide_imsg_popup()', 5000);
256 document.poppedLayer.innerHTML = messagetext;
259 // This function activates the ajax-powered recipient autocompleters on the message entry screen.
260 function activate_entmsg_autocompleters() {
261 new Ajax.Autocompleter('cc_id', 'cc_name_choices', 'cc_autocomplete', {} );
262 new Ajax.Autocompleter('bcc_id', 'bcc_name_choices', 'bcc_autocomplete', {} );
263 new Ajax.Autocompleter('recp_id', 'recp_name_choices', 'recp_autocomplete', {} );
266 function activate_iconbar_wholist_populat0r()
268 new Ajax.PeriodicalUpdater('online_users', 'do_template?template=who_iconbar', {method: 'get', frequency: 30});
271 function setupIconBar() {
273 /* WARNING: VILE, SLEAZY HACK. We determine the state of the box based on the image loaded. */
274 if ( $('expand_roomlist').src.substring($('expand_roomlist').src.length - 12) === "collapse.gif" ) {
275 $('roomlist').style.display = 'block';
276 $('roomlist').innerHTML = '';
277 fillRooms(iconBarRoomList);
280 $('roomlist').style.display = 'none';
283 /* WARNING: VILE, SLEAZY HACK. We determine the state of the box based on the image loaded. */
284 if ( $('expand_wholist').src.substring($('expand_wholist').src.length - 12) === "collapse.gif" ) {
285 $('online_users').style.display = 'block';
286 activate_iconbar_wholist_populat0r();
289 $('online_users').style.display = 'none';
295 // These functions handle moving sticky notes around the screen by dragging them
297 var uid_of_note_being_dragged = 0;
298 var saved_cursor_style = 'default';
299 var note_was_dragged = 0;
301 function NotesDragMouseUp(evt) {
302 document.onmouseup = null;
303 document.onmousemove = null;
304 if (document.layers) {
305 document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE);
308 var d = $('note-' + uid_of_note_being_dragged);
309 d.style.cursor = saved_cursor_style;
311 // If any motion actually occurred, submit an ajax http call to record it to the server
312 if (note_was_dragged > 0) {
313 var p = 'note_uid=' + uid_of_note_being_dragged
314 + '&left=' + d.style.left
315 + '&top=' + d.style.top
316 + '&r=' + ctdlRandomString();
326 uid_of_note_being_dragged = '';
329 var saved_x, saved_y;
330 function NotesDragMouseMove(evt) {
331 var x = (ns6 ? evt.clientX : event.clientX);
332 var x_increment = x - saved_x;
333 var y = (ns6 ? evt.clientY : event.clientY);
334 var y_increment = y - saved_y;
337 var d = $('note-' + uid_of_note_being_dragged);
339 var divTop = parseInt(d.style.top);
340 var divLeft = parseInt(d.style.left);
342 d.style.top = (divTop + y_increment) + 'px';
343 d.style.left = (divLeft + x_increment) + 'px';
347 note_was_dragged = 1;
352 function NotesDragMouseDown(evt, uid) {
353 saved_x = (ns6 ? evt.clientX : event.clientX);
354 saved_y = (ns6 ? evt.clientY : event.clientY);
355 document.onmouseup = NotesDragMouseUp;
356 document.onmousemove = NotesDragMouseMove;
357 if (document.layers) {
358 document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE);
360 uid_of_note_being_dragged = uid;
361 var d = $('note-' + uid_of_note_being_dragged);
362 saved_cursor_style = d.style.cursor;
363 d.style.cursor = 'move';
364 return false; // disable the default action
368 // Called when the user clicks on the palette icon of a sticky note to change its color.
369 // It toggles the color selector visible or invisible.
371 function NotesClickPalette(evt, uid) {
372 var uid_of_note_being_colored = uid;
373 var d = $('palette-' + uid_of_note_being_colored);
375 if (d.style.display) {
376 if (d.style.display === 'none') {
377 d.style.display = 'block';
380 d.style.display = 'none';
384 d.style.display = 'block';
391 // Called when the user clicks on one of the colors in an open color selector.
392 // Sets the desired color and then closes the color selector.
394 function NotesClickColor(evt, uid, red, green, blue, notecolor, titlecolor) {
395 var uid_of_note_being_colored = uid;
396 var palette_button = $('palette-' + uid_of_note_being_colored);
397 var note_div = $('note-' + uid_of_note_being_colored);
398 var titlebar_div = $('titlebar-' + uid_of_note_being_colored);
400 // alert('FIXME red=' + red + ' green=' + green + ' blue=' + blue);
402 note_div.style.backgroundColor = notecolor;
403 titlebar_div.style.backgroundColor = titlecolor;
404 palette_button.style.display = 'none';
406 // submit an ajax http call to record it to the server
407 var p = 'note_uid=' + uid_of_note_being_colored
411 + '&r=' + ctdlRandomString();
424 // These functions handle resizing sticky notes by dragging the resize handle
426 var uid_of_note_being_resized = 0;
427 var saved_cursor_style = 'default';
428 var note_was_resized = 0;
430 function NotesResizeMouseUp(evt) {
431 document.onmouseup = null;
432 document.onmousemove = null;
433 if (document.layers) {
434 document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE);
437 var d = $('note-' + uid_of_note_being_resized);
438 d.style.cursor = saved_cursor_style;
440 // If any motion actually occurred, submit an ajax http call to record it to the server
441 if (note_was_resized > 0) {
442 var p = 'note_uid=' + uid_of_note_being_resized
443 + '&width=' + d.style.width
444 + '&height=' + d.style.height
445 + '&r=' + ctdlRandomString();
455 uid_of_note_being_resized = '';
456 return false; // disable the default action
459 function NotesResizeMouseMove(evt) {
460 var x = (ns6 ? evt.clientX : event.clientX);
461 var x_increment = x - saved_x;
462 var y = (ns6 ? evt.clientY : event.clientY);
463 var y_increment = y - saved_y;
466 var d = $('note-' + uid_of_note_being_resized);
468 var divTop = parseInt(d.style.height);
469 var divLeft = parseInt(d.style.width);
471 var newHeight = divTop + y_increment;
472 if (newHeight < 50) {
476 var newWidth = divLeft + x_increment;
480 d.style.height = newHeight + 'px';
481 d.style.width = newWidth + 'px';
485 note_was_resized = 1;
486 return false; // disable the default action
490 function NotesResizeMouseDown(evt, uid) {
491 var saved_x = (ns6 ? evt.clientX : event.clientX);
492 var saved_y = (ns6 ? evt.clientY : event.clientY);
493 document.onmouseup = NotesResizeMouseUp;
494 document.onmousemove = NotesResizeMouseMove;
495 if (document.layers) {
496 document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE);
498 uid_of_note_being_resized = uid;
499 var d = $('note-' + uid_of_note_being_resized);
500 saved_cursor_style = d.style.cursor;
501 d.style.cursor = 'move';
502 return false; // disable the default action
506 function DeleteStickyNote(evt, uid, confirmation_prompt) {
507 var uid_of_note_being_deleted = uid;
508 var d = $('note-' + uid_of_note_being_deleted);
510 if (confirm(confirmation_prompt)) {
513 // submit an ajax http call to delete it on the server
514 var p = 'note_uid=' + uid_of_note_being_deleted
516 + '&r=' + ctdlRandomString();
527 function ctdl_ts_getInnerText(el) {
528 if (typeof el === "string") {
531 if (typeof el === "undefined") {
535 return el.innerText; //Not needed but it is faster
539 var cs = el.childNodes;
541 for (var i = 0; i < l; i++) {
542 switch (cs[i].nodeType) {
543 case 1: //ELEMENT_NODE
544 str += ts_getInnerText(cs[i]);
547 str += cs[i].nodeValue;
555 // Place a gradient loadscreen on an element, e.g to use before Ajax.updater
556 function CtdlLoadScreen(elementid) {
557 var elem = document.getElementById(elementid);
558 elem.innerHTML = "<div align=center><br>" +
559 "<table border=0 cellpadding=10 bgcolor=\"#ffffff\">" +
560 " <tr><td><img src=\"static/throbber.gif\" />" +
561 " <font color=\"#AAAAAA\"> Loading....</font>" +
562 "</td></tr></table><br></div>";
567 // Pop open the address book (target_input is the INPUT field to populate)
569 function PopOpenAddressBook(target_input) {
570 $('address_book_popup').style.display = 'block';
571 p = 'target_input=' + target_input + '&r=' + ctdlRandomString();
573 'address_book_popup_middle_div',
574 'do_template?template=addressbook_list',
583 function PopulateAddressBookInnerDiv(which_addr_book, target_input) {
585 $('address_book_inner_div').innerHTML =
586 "<div align=center><br>" +
587 "<table border=0 cellpadding=10 bgcolor=\"#ffffff\">" +
588 "<tr><td><img src=\"static/throbber.gif\" />" +
589 "<font color=\"#AAAAAA\">" +
590 " Loading...." +
591 "</font></td></tr></table><br></div>";
593 p = 'which_addr_book=' + which_addr_book
594 + '&target_input=' + target_input
595 + '&r=' + ctdlRandomString()
596 + "&template=addressbook_namelist";
598 'address_book_inner_div',
607 // What happens when a contact is selected from the address book popup
608 // (populate the specified target)
610 function AddContactsToTarget(target, whichaddr) {
611 while (whichaddr.selectedIndex !== -1) {
612 if (target.value.length > 0) {
613 target.value = target.value + ', ';
615 target.value = target.value + whichaddr.value;
616 whichaddr.options[whichaddr.selectedIndex].selected = false;
620 // Respond to a meeting invitation
621 function RespondToInvitation(question_divname, title_divname, msgnum, cal_partnum, sc) {
622 p = 'msgnum=' + msgnum + '&cal_partnum=' + cal_partnum + '&sc=' + sc ;
623 new Ajax.Updater(title_divname, 'respond_to_request', { method: 'post', parameters: p } );
624 Effect.Fade(question_divname, { duration: 0.5 });
627 // Handle a received RSVP
628 function HandleRSVP(question_divname, title_divname, msgnum, cal_partnum, sc) {
629 p = 'msgnum=' + msgnum + '&cal_partnum=' + cal_partnum + '&sc=' + sc ;
630 new Ajax.Updater(title_divname, 'handle_rsvp', { method: 'post', parameters: p } );
631 Effect.Fade(question_divname, { duration: 0.5 });
633 /* var fakeMouse = document.createEvent("MouseEvents");
634 fakeMouse.initMouseEvent("click", true, true, window,
635 0,0,0,0,0, false, false, false, false, 0, null); */
636 // TODO: Collapse into one function
637 function toggleTaskDtStart(event) {
638 var checkBox = $('nodtstart');
639 var checkBoxTime = $('dtstart_time_assoc');
640 var dtstart = document.getElementById("dtstart");
641 var dtstart_date = document.getElementById("dtstart_date");
642 var dtstart_time = document.getElementById("dtstart_time");
643 if (checkBox.checked) {
644 dtstart_date.style.visibility = "hidden";
645 dtstart_time.style.visibility = "hidden";
647 if (checkBoxTime.checked) {
648 dtstart_time.style.visibility = "visible";
650 dtstart_time.style.visibility = "hidden";
652 dtstart_date.style.visibility = "visible";
653 if (dtstart.value.length === 0) {
654 dtstart.dpck._initCurrentDate();
658 function toggleTaskDue(event) {
659 var checkBox = $('nodue');
660 var checkBoxTime = $('due_time_assoc');
661 var due = document.getElementById("due");
662 var due_date = document.getElementById("due_date");
663 var due_time = document.getElementById("due_time");
664 if (checkBox.checked) {
665 due_date.style.visibility = "hidden";
666 due_time.style.visibility = "hidden";
668 if (checkBoxTime.checked) {
669 due_time.style.visibility = "visible";
671 due_time.style.visibility = "hidden";
673 due_date.style.visibility = "visible";
674 if (due.value.length === 0) {
675 due.dpck._initCurrentDate();
679 function ToggleTaskDateOrNoDateActivate(event) {
680 var dtstart = document.getElementById("nodtstart");
681 if (dtstart !== null) {
682 toggleTaskDtStart(null);
684 $('nodtstart').observe('click', toggleTaskDtStart);
685 $('dtstart_time_assoc').observe('click', toggleTaskDtStart);
686 $('nodue').observe('click', toggleTaskDue);
687 $('due_time_assoc').observe('click', toggleTaskDue);
690 function TaskViewGatherCategoriesFromTable() {
691 var table = $('taskview');
694 function attachDatePicker(relative) {
695 var dpck = new DatePicker({
697 language: 'en', //wclang.substr(0,2),
698 disableFutureDate: false,
699 dateFormat: [ ["yyyy", "mm", "dd"], "-"],
702 document.getElementById(relative).dpck = dpck; // attach a ref to it
704 function eventEditAllDay() {
705 var allDayCheck = document.getElementById("alldayevent");
706 var dtend_time = document.getElementById("dtend_time");
707 var dtstart_time = document.getElementById("dtstart_time");
708 if(allDayCheck.checked) {
709 dtstart_time.style.visibility = "hidden";
710 dtend_time.style.visibility = "hidden";
712 dtstart_time.style.visibility = "visible";
713 dtend_time.style.visibility = "visible";
717 // Functions which handle show/hide of various elements in the recurrence editor
719 function RecurrenceShowHide() {
721 if ($('is_recur').checked) {
722 $('rrule_div').style.display = 'block';
725 $('rrule_div').style.display = 'none';
728 if ($('freq_selector').selectedIndex === 4) {
729 $('weekday_selector').style.display = 'block';
732 $('weekday_selector').style.display = 'none';
735 if ($('freq_selector').selectedIndex === 5) {
736 $('monthday_selector').style.display = 'block';
739 $('monthday_selector').style.display = 'none';
742 if ($('rrend_count').checked) {
743 $('rrcount').disabled = false;
746 $('rrcount').disabled = true;
749 if ($('rrend_until').checked) {
750 $('rruntil').disabled = false;
753 $('rruntil').disabled = true;
756 if ($('rrmonthtype_mday').checked) {
757 $('rrmday').disabled = false;
760 $('rrmday').disabled = true;
763 if ($('rrmonthtype_wday').checked) {
764 $('rrmweek').disabled = false;
765 $('rrmweekday').disabled = false;
768 $('rrmweek').disabled = true;
769 $('rrmweekday').disabled = true;
772 if ($('freq_selector').selectedIndex === 6) {
773 $('yearday_selector').style.display = 'block';
776 $('yearday_selector').style.display = 'none';
779 $('ymday').innerHTML = 'XXXX-' + $('dtstart').value.substr(5);
780 $('rrmday').innerHTML = $('dtstart').value.substr(8);
782 if ($('rryeartype_ywday').checked) {
783 $('rrymweek').disabled = false;
784 $('rrymweekday').disabled = false;
785 $('rrymonth').disabled = false;
788 $('rrymweek').disabled = true;
789 $('rrymweekday').disabled = true;
790 $('rrymonth').disabled = true;
796 // Enable or disable the 'check attendee availability' button depending on whether
797 // the attendees list is empty
798 function EnableOrDisableCheckButton()
800 if ($('attendees_box').value.length === 0) {
801 $('check_button').disabled = true;
804 $('check_button').disabled = false;
811 function launchChat(event) {
814 'toolbar=no,location=no,directories=no,copyhistory=no,status=no,scrollbars=yes,resizable=yes');
817 function wCLog(msg) {
818 if (!!window.console && !!console.log) {
820 } else if (!!window.opera && !!opera.postError) {
821 opera.postError(msg);
823 wc_log += msg + "\r\n";
827 function RefreshSMTPqueueDisplay() {
828 new Ajax.Updater('mailqueue_list',
829 'dotskip?room=__CitadelSMTPspoolout__&view=11&ListOnly=yes', { method: 'get',
830 parameters: Math.random() } );
833 function DeleteSMTPqueueMsg(msgnum1, msgnum2) {
834 var p = encodeURI('g_cmd=DELE ' + msgnum1 + ',' + msgnum2);
839 onComplete: function(transport) {
840 ajax_important_message(transport.responseText.substr(4));
841 RefreshSMTPqueueDisplay();}
847 function ConfirmLogoff() {
850 'do_template?template=confirmlogoff',
854 onSuccess: function(cl_success) {
862 function switch_to_lang(new_lang) {
863 p = 'push?url=' + encodeURI(window.location);
864 new Ajax.Request(p, { method: 'get' } );
865 window.location = 'switch_language?lang=' + new_lang ;
869 function toggle_roomlist()
871 /* WARNING: VILE, SLEAZY HACK. We determine the state of the box based on the image loaded. */
872 if ( $('expand_roomlist').src.substring($('expand_roomlist').src.length - 12) === "collapse.gif" ) {
873 $('roomlist').style.display = 'none';
874 $('expand_roomlist').src = 'static/webcit_icons/expand.gif';
879 $('roomlist').style.display = 'block';
880 $('expand_roomlist').src = 'static/webcit_icons/collapse.gif';
881 $('roomlist').innerHTML = '';
882 fillRooms(iconBarRoomList);
886 // tell the server what I did
887 p = 'toggle_roomlist_expanded_state?wstate=' + wstate + '?rand=' + Math.random() ;
888 new Ajax.Request(p, { method: 'get' } );
890 return false; /* this prevents the click from registering as a roomlist button press */
894 function toggle_wholist()
896 /* WARNING: VILE, SLEAZY HACK. We determine the state of the box based on the image loaded. */
897 if ( $('expand_wholist').src.substring($('expand_wholist').src.length - 12) === "collapse.gif" ) {
898 $('online_users').style.display = 'none';
899 $('expand_wholist').src = 'static/webcit_icons/expand.gif';
904 $('online_users').style.display = 'block';
905 $('expand_wholist').src = 'static/webcit_icons/collapse.gif';
906 activate_iconbar_wholist_populat0r();
910 // tell the server what I did
911 p = 'toggle_wholist_expanded_state?wstate=' + wstate + '?rand=' + Math.random() ;
912 new Ajax.Request(p, { method: 'get' } );
914 return false; /* this prevents the click from registering as a wholist button press */
917 function getBlogStartText(wikitype) {
918 var wikitext = document.getElementById("wikitext").innerHTML;
919 var wikipublish = document.getElementById("wikipublish").innerHTML;
920 var wikilinktext = document.getElementById("wikilinktext").innerHTML;
921 var wikilinkmore = document.getElementById("wikilinkmore").innerHTML;
922 var wikilinkembedmedia = document.getElementById("wikilinkembedmedia").innerHTML;
924 return "<html><head></head><body>\n" +
925 "<h1>" + wikitext + "</h1>\n" +
926 "<p>" + wikipublish + "</p>\n" +
927 "<a href='wiki?page=firstarticle'>" + wikilinktext + "</a>" +
928 "<p>" + wikilinkmore + "</p>\n" +
929 "<p>" + wikilinkembedmedia + " </p>\n<p><img src='/download_file/test.jpg' alt=\"alttext\"></p>\n" +
933 return "#" + wikitext + "\n" +
934 wikipublish + "\n\n" +
935 "[" + wikilinktext + "](wiki?page=firstarticle)\n\n" +
936 wikilinkmore + "\n\n" +
937 wikilinkembedmedia + "\n\n ![alttext](/download_file/test.jpg)";
941 function create_blog()
943 var er_view_blog = document.getElementById('er_view_blog');
944 var Nonce = document.getElementById('Nonce');
945 var roomname = document.getElementById('er_name').value;
946 var editroomname = roomname + '\\edit';
947 var filePath = "files_" + roomname;
948 var floorID = document.getElementById('er_floor').value;
950 var selects = document.getElementById("er_floor");
951 var selectedFloor = selects.options[selects.selectedIndex].value;
952 var selectedFloorName = selects.options[selects.selectedIndex].text;
954 var vselects = document.getElementById("er_view");
955 var vselectedMarkup = vselects.options[vselects.selectedIndex].value;
956 var vselectedMarkupName = vselects.options[vselects.selectedIndex].text;
958 var adminPW = document.getElementById('adminlist_passworded').checked;
960 var passvoid = document.getElementById('er_password').value;
961 var roomtypeWiki = document.getElementById('er_blog_markup_html').value;
963 var isHtmlWiki = vselectedMarkup === roomtypeWiki;
964 var starttext = getBlogStartText(isHtmlWiki);
966 ToggleVisibility('er_password');
969 type_edit = document.getElementById('adminlist_passworded').value;
970 ToggleVisibility('li_adminlist_invonly');
971 ToggleVisibility('adminlist_passworded');
975 type_edit = document.getElementById('adminlist_invonly').value;
976 ToggleVisibility('adminlist_invonly');
977 ToggleVisibility('li_adminlist_passworded');
980 ToggleVisibility('er_floor');
981 document.getElementById('er_floor_fixed').innerHTML = selectedFloorName;
982 ToggleVisibility('er_floor_fixed');
984 ToggleVisibility('er_name');
985 document.getElementById('er_name_fixed').innerHTML = roomname;
986 ToggleVisibility('er_name_fixed');
988 ToggleVisibility('er_view');
989 document.getElementById('er_view_fixed').innerHTML = vselectedMarkupName;
990 ToggleVisibility('er_view_fixed');
992 ToggleVisibility('create_buttons');
994 ToggleVisibility('edit_info');
995 ToggleVisibility('throbber');
1003 er_view: er_view_blog,
1005 template: "room_result_json",
1008 setflags_blog_room: {
1016 er_dirname: filePath,
1024 er_view: er_view_blog,
1025 template: "room_result_json",
1028 create_blog_edit_room: {
1030 er_name: editroomname,
1032 er_view: vselectedMarkup,
1034 er_password: passvoid,
1035 template: "room_result_json",
1038 setflags_blog_edit_room: {
1040 er_name: editroomname,
1046 er_dirname: filePath,
1054 er_view: er_view_blog,
1055 template: "room_result_json",
1058 blog_wiki_startmessage : {
1060 force_room: editroomname,
1062 markdown: (isHtmlWiki)?0:1,
1069 * - create the blog room
1070 * - set the blog rooms file flags
1071 * - create the edit room
1072 * - set the blog edit room flags
1074 new Ajax.Request("/entroom",
1076 parameters: $H(roomdata.create_blog_room).toQueryString(),
1077 onComplete: function(transport) {
1078 new Ajax.Request("/editroom",
1080 parameters: $H(roomdata.setflags_blog_room).toQueryString(),
1081 onComplete: function(transport) {
1082 new Ajax.Request("/entroom",
1084 parameters: $H(roomdata.create_blog_edit_room).toQueryString(),
1085 onComplete: function(transport) {
1086 new Ajax.Request("/editroom",
1088 parameters: $H(roomdata.setflags_blog_edit_room).toQueryString(),
1089 onComplete: function(transport) {
1090 ToggleVisibility('throbber');
1091 new Ajax.Request("/post",
1093 parameters: $H(roomdata.blog_wiki_startmessage).toQueryString(),
1094 onComplete: function(transport) {
1116 function deleteAllSelectedMessages() {
1121 function publishMessage()
1123 var messages = document.getElementsByClassName("message");
1124 var messageIdParts = messages[0].id.split('|');
1125 var editRoomName = getTextContent(document.getElementById("rmname"));
1126 var roomName = editRoomName.substring(0, editRoomName.length - 5);
1129 editRoom: editRoomName,
1131 msgNo : messageIdParts[1],
1132 msgIdStr : messageIdParts[2]
1135 mvCommand = encodeURI("g_cmd=MOVE " + publish.msgNo + "|" + publish.blogRoom + "|1");
1137 new Ajax.Request("ajax_servcmd", {
1138 parameters: mvCommand,
1140 onSuccess: function(transport) {
1141 wCLog(transport.responseText);