X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fstatic%2Fwclib.js;h=5eec5d0d4a45043610bc51bd078ce758319c809a;hb=add79b79bcc86d61a2f8661103f7fce6d554f45c;hp=bbcd7c5d3ca9a15e8a1df0c599014864e0b1312c;hpb=db253f6fade2e8286be0b5c911e7635b0c3c79c5;p=citadel.git diff --git a/webcit/static/wclib.js b/webcit/static/wclib.js index bbcd7c5d3..5eec5d0d4 100644 --- a/webcit/static/wclib.js +++ b/webcit/static/wclib.js @@ -1,5 +1,5 @@ // -// $Id: wclib.js,v 625.2 2005/09/18 04:04:32 ajc Exp $ +// $Id$ // // JavaScript function library for WebCit. // @@ -7,6 +7,7 @@ var browserType; +var room_is_trash = 0; if (document.layers) {browserType = "nn4"} if (document.all) {browserType = "ie"} @@ -15,24 +16,39 @@ if (window.navigator.userAgent.toLowerCase().match("gecko")) { } var ns6=document.getElementById&&!document.all; +Event.observe(window, 'load', ToggleTaskDateOrNoDateActivate); +Event.observe(window, 'load', taskViewActivate); +function CtdlRandomString() { + return((Math.random()+'').substr(3)); +} -// -// This code handles the popups for instant messages. -// +// We love string tokenizers. +function extract_token(source_string, token_num, delimiter) { + var i = 0; + var extracted_string = source_string; -function hide_page_popup() { - if (browserType == "gecko" ) - document.poppedLayer = eval('document.getElementById(\'page_popup\')'); - else if (browserType == "ie") - document.poppedLayer = eval('document.all[\'page_popup\']'); - else - document.poppedLayer = eval('document.layers[\'`page_popup\']'); + if (token_num > 0) { + for (i=0; i= 0) { + extracted_string = extracted_string.substr(j+1); + } + } + } - document.poppedLayer.style.visibility = "hidden"; + j = extracted_string.indexOf(delimiter); + if (j >= 0) { + extracted_string = extracted_string.substr(0, j); + } + + return extracted_string; } + + +// This code handles the popups for important-messages. function hide_imsg_popup() { if (browserType == "gecko" ) document.poppedLayer = eval('document.getElementById(\'important_message\')'); @@ -44,6 +60,7 @@ function hide_imsg_popup() { document.poppedLayer.style.visibility = "hidden"; } + // This function activates the ajax-powered recipient autocompleters on the message entry screen. function activate_entmsg_autocompleters() { new Ajax.Autocompleter('cc_id', 'cc_name_choices', 'cc_autocomplete', {} ); @@ -61,20 +78,46 @@ var drop_targets_roomnames = new Array(); function switch_to_room_list() { $('iconbar').innerHTML = $('iconbar').innerHTML.substr(0, $('iconbar').innerHTML.indexOf('switch')); + CtdlLoadScreen('iconbar'); new Ajax.Updater('iconbar', 'iconbar_ajax_rooms', { method: 'get' } ); } function expand_floor(floor_div) { if (which_div_expanded != null) { - $(which_div_expanded).style.display = 'none' ; + if ($(which_div_expanded) != null) { + $(which_div_expanded).style.display = 'none' ; + } } + + // clicking on the already-expanded floor causes the whole list to collapse + if (which_div_expanded == floor_div) { + which_div_expanded = null; + + // notify the server that no floors are expanded + new Ajax.Request( + 'set_floordiv_expanded/-1', { + method: 'post' + } + ); + return true; + } + + // expand the requested floor $(floor_div).style.display = 'block'; which_div_expanded = floor_div; + + // notify the server of which floor is expanded + new Ajax.Request( + 'set_floordiv_expanded/'+floor_div, { + method: 'post' + } + ); } function switch_to_menu_buttons() { which_div_expanded = null; num_drop_targets = 0; + CtdlLoadScreen('iconbar'); new Ajax.Updater('iconbar', 'iconbar_ajax_menu', { method: 'get' } ); } @@ -83,6 +126,7 @@ function switch_to_menu_buttons() { // var CtdlNumMsgsSelected = 0; var CtdlMsgsSelected = new Array(); +var CtdlLastMsgnumSelected = 0; // This gets called when you single click on a message in the mailbox view. // We know that the element id of the table row will be the letter 'm' plus the message number. @@ -92,9 +136,10 @@ function CtdlSingleClickMsg(evt, msgnum) { // Clear the preview pane until we load the new message $('preview_pane').innerHTML = ''; - // De-select any messages that were already selected, *unless* the Ctrl key - // is being pressed, in which case the user wants multi select. - if (!evt.ctrlKey) { + // De-select any messages that were already selected, *unless* the Ctrl or + // Shift key is being pressed, in which case the user wants multi select + // or group select. + if ( (!evt.ctrlKey) && (!evt.shiftKey) ) { if (CtdlNumMsgsSelected > 0) { for (i=0; i 0) { + 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; @@ -208,12 +323,31 @@ function CtdlRemoveTheUnseenBold(msgnum) { } // A message has been deleted, so yank it from the list. -// (IE barfs on m9999.innerHTML='' so we use a script.aculo.us effect instead.) function CtdlClearDeletedMsg(msgnum) { - new Effect.Squish('m'+msgnum); -} + // Traverse the table looking for a row whose ID contains the desired msgnum + var table = $('summary_headers'); + if (table) { + for (var r = 0; r < table.rows.length; r++) { + var thename = table.rows[r].id; + if (thename.substr(1) == msgnum) { + try { + table.deleteRow(r); + } + catch(e) { + alert('error: browser failed to clear row ' + r); + } + } + } + } + else { // if we can't delete it, + new Effect.Squish('m'+msgnum); // just hide it. + } + + +} + // These functions called when the user down-clicks on the message list resizer bar var saved_x = 0; @@ -288,6 +422,190 @@ function CtdlResizeMsgListMouseDown(evt) { + + +// 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); + } + + d = $('note-' + uid_of_note_being_dragged); + d.style.cursor = saved_cursor_style; + + // If any motion actually occurred, submit an ajax http call to record it to the server + if (note_was_dragged > 0) { + p = 'note_uid=' + uid_of_note_being_dragged + + '&left=' + d.style.left + + '&top=' + d.style.top + + '&r=' + CtdlRandomString(); + new Ajax.Request( + 'ajax_update_note', + { + method: 'post', + parameters: p + } + ); + } + + uid_of_note_being_dragged = ''; + return true; +} + +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; + + // Move the div + d = $('note-' + uid_of_note_being_dragged); + + divTop = parseInt(d.style.top); + divLeft = parseInt(d.style.left); + + d.style.top = (divTop + y_increment) + 'px'; + d.style.left = (divLeft + x_increment) + 'px'; + + saved_x = x; + saved_y = y; + note_was_dragged = 1; + return true; +} + + +function NotesDragMouseDown(evt, uid) { + saved_x = (ns6 ? evt.clientX : event.clientX); + saved_y = (ns6 ? evt.clientY : event.clientY); + document.onmouseup = NotesDragMouseUp; + document.onmousemove = NotesDragMouseMove; + if (document.layers) { + document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE); + } + uid_of_note_being_dragged = uid; + d = $('note-' + uid_of_note_being_dragged); + saved_cursor_style = d.style.cursor; + d.style.cursor = 'move'; + return false; // disable the default action +} + + + +// These functions handle resizing sticky notes by dragging the resize handle + +var uid_of_note_being_resized = 0; +var saved_cursor_style = 'default'; +var note_was_resized = 0; + +function NotesResizeMouseUp(evt) { + document.onmouseup = null; + document.onmousemove = null; + if (document.layers) { + document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE); + } + + d = $('note-' + uid_of_note_being_resized); + d.style.cursor = saved_cursor_style; + + // If any motion actually occurred, submit an ajax http call to record it to the server + if (note_was_resized > 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 + } + ); + } + + uid_of_note_being_resized = ''; + return true; +} + +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; + + // Move the div + d = $('note-' + uid_of_note_being_resized); + + divTop = parseInt(d.style.height); + divLeft = parseInt(d.style.width); + + d.style.height = (divTop + y_increment) + 'px'; + d.style.width = (divLeft + x_increment) + 'px'; + + saved_x = x; + saved_y = y; + note_was_resized = 1; + 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 +} + + +function DeleteStickyNote(evt, uid, confirmation_prompt) { + uid_of_note_being_deleted = uid; + d = $('note-' + uid_of_note_being_deleted); + + if (confirm(confirmation_prompt)) { + new Effect.Puff(d); + + // 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 + } + ); + } +} + + + + + + + + + + + + + + + // These functions handle drag and drop message moving var mm_div = null; @@ -418,3 +736,191 @@ function ctdl_ts_getInnerText(el) { } +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 rawSwitch822(msgnum) { +CtdlLoadScreen("headerscreen"); +new Ajax.Updater("headerscreen", +'ajax_servcmd_esc', + { method: 'post',parameters: 'g_cmd=MSG2 ' +msgnum } ); + +} + +function rawSwitchCitadel(msgnum) { +CtdlLoadScreen("headerscreen"); +new Ajax.Updater("headerscreen", +'ajax_servcmd_esc', + { method: 'post',parameters: 'g_cmd=MSG0 ' +msgnum } ); + +} + +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....

"; +} + + + +// Pop open the address book (target_input is the INPUT field to populate) + +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 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 + } + ); +} + +// 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'); + dtStart = document.getElementById("dtstart"); + if (checkBox.checked) { + dtStart.disabled = true; + dtStart.style.textDecoration = "line-through"; + } else { + dtStart.disabled = false; + dtStart.style.textDecoration = ""; + if (dtStart.value.length == 0) + dtStart.dpck._initCurrentDate(); + } +} +function toggleTaskDue(event) { + var checkBox = $('nodue'); + dueField = document.getElementById("due"); + if (checkBox.checked) { + dueField.disabled = true; + dueField.style.textDecoration = "line-through"; + } else { + dueField.disabled = false; + dueField.style.textDecoration = ""; + if (dueField.value.length == 0) + dueField.dpck._initCurrentDate(); + } +} +function ToggleTaskDateOrNoDateActivate(event) { + var dtstart = document.getElementById("nodtstart"); + if (dtstart != null) { + toggleTaskDtStart(null); + toggleTaskDue(null); + $('nodtstart').observe('click', toggleTaskDtStart); + $('nodue').observe('click', toggleTaskDue); + } +} +function TaskViewGatherCategoriesFromTable() { + var table = $('taskview'); + +} +function attachDatePicker(relative) { + var dpck = new DatePicker({ + relative: relative, + language: 'en', // fix please + disableFutureDate: false + }); + document.getElementById(relative).dpck = dpck; // attach a ref to it +} +function eventEditAllDay() { + var allDayCheck = document.getElementById("alldayevent"); + var dtend= document.getElementById("dtendcell"); + if(allDayCheck.checked) { + //dtend.disabled = true; + dtend.style.textDecoration = "line-through"; + } else { + //dtend_day.disabled = false; + dtend.style.textDecoration = ""; + } +}