From cc97ea0559af1a92a54dbcdf738ee4d95e67d3ff Mon Sep 17 00:00:00 2001 From: thomascube Date: Sun, 19 Apr 2009 17:44:29 +0000 Subject: Merged branch devel-api (from r2208 to r2387) back into trunk (omitting some sample plugins) --- program/js/app.js | 997 ++++++++++++++++++++------------------------------- program/js/common.js | 230 ++++++------ program/js/editor.js | 4 +- program/js/list.js | 172 +++------ 4 files changed, 557 insertions(+), 846 deletions(-) (limited to 'program/js') diff --git a/program/js/app.js b/program/js/app.js index 205bb2d6d..0e0c8bf25 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -10,27 +10,26 @@ | Authors: Thomas Bruederli | | Charles McNulty | +-----------------------------------------------------------------------+ - | Requires: common.js, list.js | + | Requires: jquery.js, common.js, list.js | +-----------------------------------------------------------------------+ $Id$ */ -var rcube_webmail_client; - function rcube_webmail() - { +{ this.env = new Object(); this.labels = new Object(); this.buttons = new Object(); this.gui_objects = new Object(); + this.gui_containers = new Object(); this.commands = new Object(); + this.command_handlers = new Object(); this.onloads = new Array(); // create protected reference to myself - rcube_webmail_client = this; - this.ref = 'rcube_webmail_client'; + this.ref = 'rcmail'; var ref = this; // webmail client settings @@ -53,6 +52,12 @@ function rcube_webmail() this.env.bin_path = './bin/'; this.env.blankpage = 'program/blank.gif'; + // set jQuery ajax options + jQuery.ajaxSetup({ cache:false, + error:function(request, status, err){ ref.http_error(request, status, err); }, + beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid')); } + }); + // set environment variable(s) this.set_env = function(p, value) { @@ -89,11 +94,33 @@ function rcube_webmail() this.gui_objects[name] = id; }; + // register a container object + this.gui_container = function(name, id) + { + this.gui_containers[name] = id; + }; + + // add a GUI element (html node) to a specified container + this.add_element = function(elm, container) + { + if (this.gui_containers[container] && this.gui_containers[container].jquery) + this.gui_containers[container].append(elm); + }; + + // register an external handler for a certain command + this.register_command = function(command, callback, enable) + { + this.command_handlers[command] = callback; + + if (enable) + this.enable_command(command, true); + }; + // execute the given script on load this.add_onload = function(f) - { - this.onloads[this.onloads.length] = f; - }; + { + this.onloads[this.onloads.length] = f; + }; // initialize webmail client this.init = function() @@ -108,6 +135,10 @@ function rcube_webmail() return; } + // find all registered gui containers + for (var n in this.gui_containers) + this.gui_containers[n] = $('#'+this.gui_containers[n]); + // find all registered gui objects for (var n in this.gui_objects) this.gui_objects[n] = rcube_find_object(this.gui_objects[n]); @@ -135,15 +166,13 @@ function rcube_webmail() this.message_list.addEventListener('dragstart', function(o){ p.drag_start(o); }); this.message_list.addEventListener('dragmove', function(o, e){ p.drag_move(e); }); this.message_list.addEventListener('dragend', function(o){ p.drag_active = false; }); + document.onmouseup = function(e){ return p.doc_mouse_up(e); }; this.message_list.init(); this.enable_command('toggle_status', 'toggle_flag', true); if (this.gui_objects.mailcontframe) - { this.gui_objects.mailcontframe.onmousedown = function(e){ return p.click_on_list(e); }; - document.onmouseup = function(e){ return p.doc_mouse_up(e); }; - } else this.message_list.focus(); } @@ -196,7 +225,7 @@ function rcube_webmail() { this.env.spellcheck.spelling_state_observer = function(s){ ref.set_spellcheck_state(s); }; this.set_spellcheck_state('ready'); - if (rcube_find_object('_is_html').value == '1') + if ($("input[name='_is_html']").val() == '1') this.display_spellcheck_controls(false); } if (this.env.drafts_mailbox) @@ -263,6 +292,8 @@ function rcube_webmail() } else this.contact_list.focus(); + + this.gui_objects.folderlist = this.gui_objects.contactslist; } this.set_page_buttons(); @@ -316,20 +347,16 @@ function rcube_webmail() break; case 'login': - var input_user = rcube_find_object('rcmloginuser'); - var input_pass = rcube_find_object('rcmloginpwd'); - var input_tz = rcube_find_object('rcmlogintz'); - - if (input_user) - input_user.onkeyup = function(e){ return rcmail.login_user_keyup(e); }; - if (input_user && input_user.value=='') + var input_user = $('#rcmloginuser'); + input_user.bind('keypress', function(e){ return rcmail.login_user_keyup(e); }); + + if (input_user.val() == '') input_user.focus(); - else if (input_pass) - input_pass.focus(); + else + $('#rcmloginpwd').focus(); // detect client timezone - if (input_tz) - input_tz.value = new Date().getTimezoneOffset() / -60; + $('#rcmlogintz').val(new Date().getTimezoneOffset() / -60); this.enable_command('login', true); break; @@ -347,11 +374,16 @@ function rcube_webmail() // show message if (this.pending_message) this.display_message(this.pending_message[0], this.pending_message[1]); + + // map implicit containers + if (this.gui_objects.folderlist) + this.gui_containers.foldertray = $(this.gui_objects.folderlist); - // start keep-alive interval - this.start_keepalive(); + // trigger init event hook + this.triggerEvent('init', { task:this.task, action:this.env.action }); // execute all foreign onload scripts + // @deprecated for (var i=0; i= pos.x2 - || mouse.y < pos.y1 || mouse.y >= pos.y2) - { - if (this.env.last_folder_target) { - this.set_classname(this.get_folder_li(this.env.last_folder_target), 'droptarget', false); + if (mouse.x < pos.x1 || mouse.x >= pos.x2 || mouse.y < pos.y1 || mouse.y >= pos.y2) { + if (this.env.last_folder_target) { + $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget'); this.env.last_folder_target = null; - } - return; } + return; + } // over the folders - for (var k in this.env.folder_coords) - { - pos = this.env.folder_coords[k]; - if (this.check_droptarget(k) && ((mouse.x >= pos.x1) && (mouse.x < pos.x2) - && (mouse.y >= pos.y1) && (mouse.y < pos.y2))) - { - this.set_classname(this.get_folder_li(k), 'droptarget', true); - this.env.last_folder_target = k; - } - else - this.set_classname(this.get_folder_li(k), 'droptarget', false); + for (var k in this.env.folder_coords) { + pos = this.env.folder_coords[k]; + if (this.check_droptarget(k) && ((mouse.x >= pos.x1) && (mouse.x < pos.x2) + && (mouse.y >= pos.y1) && (mouse.y < pos.y2))) { + $(this.get_folder_li(k)).addClass('droptarget'); + this.env.last_folder_target = k; + } + else { + $(this.get_folder_li(k)).removeClass('droptarget'); + if (k == this.env.last_folder_target) + this.env.last_folder_target = null; } } - }; + } + }; this.collapse_folder = function(id) { var div; if ((li = this.get_folder_li(id)) && - (div = li.getElementsByTagName("div")[0]) && - (div.className.match(/collapsed/) || div.className.match(/expanded/))) + (div = $(li.getElementsByTagName("div")[0])) && + (div.hasClass('collapsed') || div.hasClass('expanded'))) { - var ul = li.getElementsByTagName("ul")[0]; - if (div.className.match(/collapsed/)) + var ul = $(li.getElementsByTagName("ul")[0]); + if (div.hasClass('collapsed')) { - ul.style.display = ''; - this.set_classname(div, 'collapsed', false); - this.set_classname(div, 'expanded', true); + ul.show(); + div.removeClass('collapsed').addClass('expanded'); var reg = new RegExp('&'+urlencode(id)+'&'); this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, '')); } else { - ul.style.display = 'none'; - this.set_classname(div, 'expanded', false); - this.set_classname(div, 'collapsed', true); + ul.hide(); + div.removeClass('expanded').addClass('collapsed'); this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&'); // select parent folder if one of its childs is currently selected @@ -1309,10 +1354,6 @@ function rcube_webmail() else if (this.contact_list) this.contact_list.focus(); - var mbox_li; - if (mbox_li = this.get_folder_li()) - this.set_classname(mbox_li, 'unfocused', true); - return rcube_event.get_button(e) == 2 ? true : rcube_event.cancel(e); }; @@ -1412,6 +1453,7 @@ function rcube_webmail() // also send search request to get the right messages if (this.env.search_request) add_url += '&_search='+this.env.search_request; + var url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox)+add_url; if (action == 'preview' && String(target.location.href).indexOf(url) >= 0) this.show_contentframe(true); @@ -1424,19 +1466,19 @@ function rcube_webmail() if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread) { this.set_message(id, 'unread', false); - if (this.env.unread_counts[this.env.mailbox]) - { - this.env.unread_counts[this.env.mailbox] -= 1; - this.set_unread_count(this.env.mailbox, this.env.unread_counts[this.env.mailbox], this.env.mailbox == 'INBOX'); - } - } + if (this.env.unread_counts[this.env.mailbox]) + { + this.env.unread_counts[this.env.mailbox] -= 1; + this.set_unread_count(this.env.mailbox, this.env.unread_counts[this.env.mailbox], this.env.mailbox == 'INBOX'); + } + } } }; this.show_contentframe = function(show) { var frm; - if (this.env.contentframe && (frm = rcube_find_object(this.env.contentframe))) + if (this.env.contentframe && (frm = $('#'+this.env.contentframe)) && frm.length) { if (!show && window.frames[this.env.contentframe]) { @@ -1444,7 +1486,7 @@ function rcube_webmail() window.frames[this.env.contentframe].location.href = this.env.blankpage; } else if (!bw.safari && !bw.konq) - frm.style.display = show ? 'block' : 'none'; + frm[show ? 'show' : 'hide'](); } if (!show && this.busy) @@ -1677,37 +1719,38 @@ function rcube_webmail() if (flag) this.set_message_status(uid, flag, status); + var rowobj = $(rows[uid].obj); if (rows[uid].unread && rows[uid].classname.indexOf('unread')<0) { rows[uid].classname += ' unread'; - this.set_classname(rows[uid].obj, 'unread', true); + rowobj.addClass('unread'); } else if (!rows[uid].unread && rows[uid].classname.indexOf('unread')>=0) { rows[uid].classname = rows[uid].classname.replace(/\s*unread/, ''); - this.set_classname(rows[uid].obj, 'unread', false); + rowobj.removeClass('unread'); } if (rows[uid].deleted && rows[uid].classname.indexOf('deleted')<0) { rows[uid].classname += ' deleted'; - this.set_classname(rows[uid].obj, 'deleted', true); + rowobj.addClass('deleted'); } else if (!rows[uid].deleted && rows[uid].classname.indexOf('deleted')>=0) { rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, ''); - this.set_classname(rows[uid].obj, 'deleted', false); + rowobj.removeClass('deleted'); } if (rows[uid].flagged && rows[uid].classname.indexOf('flagged')<0) { rows[uid].classname += ' flagged'; - this.set_classname(rows[uid].obj, 'flagged', true); + rowobj.addClass('flagged'); } else if (!rows[uid].flagged && rows[uid].classname.indexOf('flagged')>=0) { rows[uid].classname = rows[uid].classname.replace(/\s*flagged/, ''); - this.set_classname(rows[uid].obj, 'flagged', false); + rowobj.removeClass('flagged'); } this.set_message_icon(uid); @@ -1811,8 +1854,8 @@ function rcube_webmail() { this.set_message_status(id, 'deleted', true); if (this.env.read_when_deleted) - this.set_message_status(id, 'unread', false); - this.set_message(id); + this.set_message_status(id, 'unread', false); + this.set_message(id); } } } @@ -1999,14 +2042,15 @@ function rcube_webmail() this.login_user_keyup = function(e) { var key = rcube_event.get_keycode(e); - var elm; + var passwd = $('#rcmloginpwd'); // enter - if ((key==13) && (elm = rcube_find_object('_pass'))) - { - elm.focus(); - return false; + if (key == 13 && passwd.length && !passwd.val()) { + passwd.focus(); + return rcube_event.cancel(e); } + + return true; }; @@ -2018,15 +2062,15 @@ function rcube_webmail() this.check_compose_input = function() { // check input fields - var input_to = rcube_find_object('_to'); - var input_cc = rcube_find_object('_cc'); - var input_bcc = rcube_find_object('_bcc'); - var input_from = rcube_find_object('_from'); - var input_subject = rcube_find_object('_subject'); - var input_message = rcube_find_object('_message'); + var input_to = $("[name='_to']"); + var input_cc = $("[name='_cc']"); + var input_bcc = $("[name='_bcc']"); + var input_from = $("[name='_from']"); + var input_subject = $("[name='_subject']"); + var input_message = $("[name='_message']"); // check sender (if have no identities) - if (input_from.type == 'text' && !rcube_check_email(input_from.value, true)) + if (input_from.attr('type') == 'text' && !rcube_check_email(input_from.val(), true)) { alert(this.get_label('nosenderwarning')); input_from.focus(); @@ -2034,7 +2078,7 @@ function rcube_webmail() } // check for empty recipient - var recipients = input_to.value ? input_to.value : (input_cc.value ? input_cc.value : input_bcc.value); + var recipients = input_to.val() ? input_to.val() : (input_cc.val() ? input_cc.val() : input_bcc.val()); if (!rcube_check_email(recipients.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true)) { alert(this.get_label('norecipientwarning')); @@ -2043,7 +2087,7 @@ function rcube_webmail() } // display localized warning for missing subject - if (input_subject && input_subject.value == '') + if (input_subject.val() == '') { var subject = prompt(this.get_label('nosubjectwarning'), this.get_label('nosubject')); @@ -2055,12 +2099,12 @@ function rcube_webmail() } else { - input_subject.value = subject ? subject : this.get_label('nosubject'); + input_subject.val((subject ? subject : this.get_label('nosubject'))); } } // check for empty body - if ((!window.tinyMCE || !tinyMCE.get('compose-body')) && input_message.value == '' && !confirm(this.get_label('nobodywarning'))) + if ((!window.tinyMCE || !tinyMCE.get('compose-body')) && input_message.val() == '' && !confirm(this.get_label('nobodywarning'))) { input_message.focus(); return false; @@ -2105,9 +2149,7 @@ function rcube_webmail() this.set_draft_id = function(id) { - var f; - if (f = rcube_find_object('_draft_saveid')) - f.value = id; + $("input[name='_draft_saveid']").val(id); }; this.auto_save_start = function() @@ -2122,29 +2164,26 @@ function rcube_webmail() this.compose_field_hash = function(save) { // check input fields - var input_to = rcube_find_object('_to'); - var input_cc = rcube_find_object('_cc'); - var input_bcc = rcube_find_object('_bcc'); - var input_subject = rcube_find_object('_subject'); - var editor, input_message; + var value_to = $("[name='_to']").val(); + var value_cc = $("[name='_cc']").val(); + var value_bcc = $("[name='_bcc']").val(); + var value_subject = $("[name='_subject']").val(); var str = ''; - if (input_to && input_to.value) - str += input_to.value+':'; - if (input_cc && input_cc.value) - str += input_cc.value+':'; - if (input_bcc && input_bcc.value) - str += input_bcc.value+':'; - if (input_subject && input_subject.value) - str += input_subject.value+':'; - - if (editor = tinyMCE.get('compose-body')) + if (value_to) + str += value_to+':'; + if (value_cc) + str += value_cc+':'; + if (value_bcc) + str += value_bcc+':'; + if (value_subject) + str += value_subject+':'; + + var editor = tinyMCE.get('compose-body'); + if (editor) str += editor.getContent(); else - { - input_message = rcube_find_object('_message'); - str += input_message.value; - } + str += $("[name='_message']").val(); if (save) this.cmp_hash = str; @@ -2158,9 +2197,9 @@ function rcube_webmail() return false; var id = obj.options[obj.selectedIndex].value; - var input_message = rcube_find_object('_message'); - var message = input_message ? input_message.value : ''; - var is_html = (rcube_find_object('_is_html').value == '1'); + var input_message = $("[name='_message']"); + var message = input_message.val(); + var is_html = ($("input[name='_is_html']").val() == '1'); var sig, p; if (!this.env.identity) @@ -2174,9 +2213,9 @@ function rcube_webmail() if (this.env.signatures[this.env.identity]['is_html']) sig = this.env.signatures[this.env.identity]['plain_text']; else - sig = this.env.signatures[this.env.identity]['text']; + sig = this.env.signatures[this.env.identity]['text']; - if (sig.indexOf('-- ')!=0) + if (sig.indexOf('-- ')!=0) sig = '-- \n'+sig; p = message.lastIndexOf(sig); @@ -2207,32 +2246,32 @@ function rcube_webmail() { // Append the signature as a div within the body var sigElem = editor.dom.get('_rc_sig'); - var newsig = ''; - var htmlsig = true; + var newsig = ''; + var htmlsig = true; if (!sigElem) { - // add empty line before signature on IE - if (bw.ie) + // add empty line before signature on IE + if (bw.ie) editor.getBody().appendChild(editor.getDoc().createElement('br')); - sigElem = editor.getDoc().createElement('div'); + sigElem = editor.getDoc().createElement('div'); sigElem.setAttribute('id', '_rc_sig'); editor.getBody().appendChild(sigElem); } - if (this.env.signatures[id]) - { - newsig = this.env.signatures[id]['text']; - htmlsig = this.env.signatures[id]['is_html']; - - if (newsig) { - if (htmlsig && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0) + if (this.env.signatures[id]) + { + newsig = this.env.signatures[id]['text']; + htmlsig = this.env.signatures[id]['is_html']; + + if (newsig) { + if (htmlsig && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0) newsig = '

--

' + newsig; - else if (!htmlsig && newsig.indexOf('-- ')!=0) + else if (!htmlsig && newsig.indexOf('-- ')!=0) newsig = '-- \n' + newsig; - } - } + } + } if (htmlsig) sigElem.innerHTML = newsig; @@ -2241,8 +2280,7 @@ function rcube_webmail() } } - if (input_message) - input_message.value = message; + input_message.val(message); this.env.identity = id; return true; @@ -2256,27 +2294,24 @@ function rcube_webmail() var elm, list; if (elm = this.gui_objects.uploadbox) { - if (a && (list = this.gui_objects.attachmentlist)) + if (a && (list = this.gui_objects.attachmentlist)) { - var pos = rcube_get_object_pos(list); - var left = pos.x; - var top = pos.y + list.offsetHeight + 10; - - elm.style.top = top+'px'; - elm.style.left = left+'px'; + var pos = $(list).offset(); + elm.style.top = (pos.top + list.offsetHeight + 10) + 'px'; + elm.style.left = pos.left + 'px'; } elm.style.visibility = a ? 'visible' : 'hidden'; } // clear upload form - try { + try { if (!a && this.gui_objects.attachmentform != this.gui_objects.messageform) - this.gui_objects.attachmentform.reset(); - } - catch(e){} // ignore errors + this.gui_objects.attachmentform.reset(); + } + catch(e){} // ignore errors - return true; + return true; }; // upload attachment file @@ -2336,10 +2371,7 @@ function rcube_webmail() if (!this.gui_objects.attachmentlist) return false; - var li = document.createElement('LI'); - li.id = name; - li.innerHTML = content; - this.gui_objects.attachmentlist.appendChild(li); + $('
  • ').attr('id', name).html(content).appendTo(this.gui_objects.attachmentlist); return true; }; @@ -2439,7 +2471,7 @@ function rcube_webmail() highlight = document.getElementById('rcmksearchSelected'); if (!highlight) - highlight = this.ksearch_pane.ul.firstChild; + highlight = this.ksearch_pane.__ul.firstChild; if (highlight) this.ksearch_select(dir ? highlight.previousSibling : highlight.nextSibling); @@ -2479,15 +2511,13 @@ function rcube_webmail() this.ksearch_select = function(node) { - var current = document.getElementById('rcmksearchSelected'); - if (current && node) { - current.removeAttribute('id'); - this.set_classname(current, 'selected', false); + var current = $('#rcmksearchSelected'); + if (current[0] && node) { + current.removeAttr('id').removeClass('selected'); } if (node) { - node.setAttribute('id', 'rcmksearchSelected'); - this.set_classname(node, 'selected', true); + $(node).attr('id', 'rcmksearchSelected').addClass('selected'); this.ksearch_selected = node._rcm_id; } }; @@ -2521,8 +2551,8 @@ function rcube_webmail() if (inp_value === null) return; - if (this.ksearch_pane && this.ksearch_pane.visible) - this.ksearch_pane.show(0); + if (this.ksearch_pane && this.ksearch_pane.is(":visible")) + this.ksearch_pane.hide(); // get string from current cursor pos to last comma var cpos = this.get_caret_pos(this.ksearch_input); @@ -2561,15 +2591,13 @@ function rcube_webmail() // create results pane if not present if (!this.ksearch_pane) { - ul = document.createElement('UL'); - this.ksearch_pane = new rcube_layer('rcmKSearchpane', {vis:0, zindex:30000}); - this.ksearch_pane.elm.appendChild(ul); - this.ksearch_pane.ul = ul; + ul = $('
      '); + this.ksearch_pane = $('
      ').attr('id', 'rcmKSearchpane').css({ position:'absolute', 'z-index':30000 }).append(ul).appendTo(document.body); + this.ksearch_pane.__ul = ul[0]; } - else - ul = this.ksearch_pane.ul; // remove all search results + ul = this.ksearch_pane.__ul; ul.innerHTML = ''; // add each result line to list @@ -2583,14 +2611,12 @@ function rcube_webmail() } // select the first - ul.firstChild.setAttribute('id', 'rcmksearchSelected'); - this.set_classname(ul.firstChild, 'selected', true); + $(ul.firstChild).attr('id', 'rcmksearchSelected').addClass('selected'); this.ksearch_selected = 0; // move the results pane right under the input box and make it visible - var pos = rcube_get_object_pos(this.ksearch_input); - this.ksearch_pane.move(pos.x, pos.y+this.ksearch_input.offsetHeight); - this.ksearch_pane.show(1); + var pos = $(this.ksearch_input).offset(); + this.ksearch_pane.css({ left:pos.left+'px', top:(pos.top + this.ksearch_input.offsetHeight)+'px' }).show(); } // hide results pane else @@ -2623,7 +2649,7 @@ function rcube_webmail() this.ksearch_selected = null; if (this.ksearch_pane) - this.ksearch_pane.show(0); + this.ksearch_pane.hide(); }; @@ -2788,19 +2814,18 @@ function rcube_webmail() // update a contact record in the list this.update_contact_row = function(cid, cols_arr) - { + { var row; - if (this.contact_list.rows[cid] && (row = this.contact_list.rows[cid].obj)) - { + if (this.contact_list.rows[cid] && (row = this.contact_list.rows[cid].obj)) { for (var c=0; c'+cont+'
      '; - var _rcube = this; - this.gui_objects.message.innerHTML = cont; - this.gui_objects.message.style.display = 'block'; + var obj = $(this.gui_objects.message).html(cont).show(); if (type!='loading') - this.gui_objects.message.onmousedown = function(){ _rcube.hide_message(); return true; }; + obj.bind('mousedown', function(){ ref.hide_message(); return true; }); if (!hold) - this.message_timer = window.setTimeout(function(){ ref.hide_message(); }, this.message_time); + this.message_timer = window.setTimeout(function(){ ref.hide_message(true); }, this.message_time); }; // make a message row disapear - this.hide_message = function() + this.hide_message = function(fade) { if (this.gui_objects.message) - { - this.gui_objects.message.style.display = 'none'; - this.gui_objects.message.onmousedown = null; - } + $(this.gui_objects.message).unbind()[(fade?'fadeOut':'hide')](); }; // mark a mailbox as selected and set environment variable @@ -3446,16 +3454,12 @@ function rcube_webmail() { var current_li, target_li; - if ((current_li = this.get_folder_li(old))) - { - this.set_classname(current_li, 'selected', false); - this.set_classname(current_li, 'unfocused', false); + if ((current_li = this.get_folder_li(old))) { + $(current_li).removeClass('selected').removeClass('unfocused'); } - if ((target_li = this.get_folder_li(name))) - { - this.set_classname(target_li, 'unfocused', false); - this.set_classname(target_li, 'selected', true); + if ((target_li = this.get_folder_li(name))) { + $(target_li).removeClass('unfocused').addClass('selected'); } } }; @@ -3512,22 +3516,24 @@ function rcube_webmail() var rowcount = tbody.rows.length; var even = rowcount%2; - this.env.messages[uid] = {deleted:flags.deleted?1:0, - replied:flags.replied?1:0, - unread:flags.unread?1:0, - forwarded:flags.forwarded?1:0, - flagged:flags.flagged?1:0}; - - var row = document.createElement('TR'); - row.id = 'rcmrow'+uid; - row.className = 'message' - + (even ? ' even' : ' odd') + this.env.messages[uid] = { + deleted: flags.deleted?1:0, + replied: flags.replied?1:0, + unread: flags.unread?1:0, + forwarded: flags.forwarded?1:0, + flagged:flags.flagged?1:0 + }; + + var css_class = 'message' + + (even ? ' even' : ' odd') + (flags.unread ? ' unread' : '') - + (flags.deleted ? ' deleted' : '') - + (flags.flagged ? ' flagged' : ''); + + (flags.deleted ? ' deleted' : '') + + (flags.flagged ? ' flagged' : ''); + + var row = $('').attr('id', 'rcmrow'+uid).attr('class', css_class); if (this.message_list.in_selection(uid)) - row.className += ' selected'; + row.addClass('selected'); var icon = this.env.messageicon; if (flags.deleted && this.env.deletedicon) @@ -3544,49 +3550,42 @@ function rcube_webmail() else if(flags.unread && this.env.unreadicon) icon = this.env.unreadicon; - var col = document.createElement('TD'); - col.className = 'icon'; - col.innerHTML = icon ? '' : ''; - row.appendChild(col); + // add icon col + $('').addClass('icon').html(icon ? '' : '').appendTo(row); // add each submitted col - for (var n = 0; n < this.coltypes.length; n++) - { + for (var n = 0; n < this.coltypes.length; n++) { var c = this.coltypes[n]; - col = document.createElement('TD'); - col.className = String(c).toLowerCase(); + col = $('').addClass(String(c).toLowerCase()); - if (c=='flag') - { + if (c=='flag') { if (flags.flagged && this.env.flaggedicon) - col.innerHTML = ''; + col.html(''); else if(!flags.flagged && this.env.unflaggedicon) - col.innerHTML = ''; + col.html(''); } else if (c=='attachment') - col.innerHTML = attachment && this.env.attachmenticon ? '' : ' '; + col.html(attachment && this.env.attachmenticon ? '' : ' '); else - col.innerHTML = cols[c]; + col.html(cols[c]); - row.appendChild(col); + col.appendTo(row); } this.message_list.insert_row(row, attop); // remove 'old' row - if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize) - { - var uid = this.message_list.get_last_row(); - this.message_list.remove_row(uid); - this.message_list.clear_selection(uid); - } - }; + if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize) { + var uid = this.message_list.get_last_row(); + this.message_list.remove_row(uid); + this.message_list.clear_selection(uid); + } + }; // replace content of row count display this.set_rowcount = function(text) { - if (this.gui_objects.countdisplay) - this.gui_objects.countdisplay.innerHTML = text; + $(this.gui_objects.countdisplay).html(text); // update page navigation buttons this.set_page_buttons(); @@ -3602,8 +3601,8 @@ function rcube_webmail() // replace content of quota display this.set_quota = function(content) { - if (this.gui_objects.quotadisplay && content) - this.gui_objects.quotadisplay.innerHTML = content; + if (content && this.gui_objects.quotadisplay) + $(this.gui_objects.quotadisplay).html(content); }; // update the mailboxlist @@ -3632,9 +3631,8 @@ function rcube_webmail() { // add children's counters for (var k in this.env.unread_counts) - if (k.indexOf(mbox + this.env.delimiter) == 0) { + if (k.indexOf(mbox + this.env.delimiter) == 0) childcount += this.env.unread_counts[k]; - } } if (mycount && text_obj.innerHTML.match(reg)) @@ -3650,7 +3648,10 @@ function rcube_webmail() this.set_unread_count_display(mbox.replace(reg, ''), false); // set the right classes - this.set_classname(item, 'unread', (mycount+childcount)>0 ? true : false); + if ((mycount+childcount)>0) + $(item).addClass('unread'); + else + $(item).removeClass('unread'); } // set unread count to window title @@ -3691,21 +3692,15 @@ function rcube_webmail() var rowcount = tbody.rows.length; var even = rowcount%2; - var row = document.createElement('TR'); - row.id = 'rcmrow'+cid; - row.className = 'contact '+(even ? 'even' : 'odd'); + var row = $('').attr('id', 'rcmrow'+cid).addClass('class').addClass(even ? 'even' : 'odd'); if (this.contact_list.in_selection(cid)) - row.className += ' selected'; + row.addClass('selected'); // add each submitted col - for (var c in cols) - { - col = document.createElement('TD'); - col.className = String(c).toLowerCase(); - col.innerHTML = cols[c]; - row.appendChild(col); - } + for (var c in cols) { + col = $('').addClass(String(c).toLowerCase()).html(cols[c]).appendTo(row); + } this.contact_list.insert_row(row); this.enable_command('export', (this.contact_list.rowcount > 0)); @@ -3720,19 +3715,16 @@ function rcube_webmail() // display fetched raw headers this.set_headers = function(content) - { - if (this.gui_objects.all_headers_row && this.gui_objects.all_headers_box && content) - { - var box = this.gui_objects.all_headers_box; - box.innerHTML = content; - box.style.display = 'block'; + { + if (this.gui_objects.all_headers_row && this.gui_objects.all_headers_box && content) { + $(this.gui_objects.all_headers_box).html(content).show(); if (this.env.framed && parent.rcmail) - parent.rcmail.set_busy(false); + parent.rcmail.set_busy(false); else this.set_busy(false); - } - }; + } + }; // display all-headers row and fetch raw message headers this.load_headers = function(elem) @@ -3740,15 +3732,14 @@ function rcube_webmail() if (!this.gui_objects.all_headers_row || !this.gui_objects.all_headers_box || !this.env.uid) return; - this.set_classname(elem, 'show-headers', false); - this.set_classname(elem, 'hide-headers', true); - this.gui_objects.all_headers_row.style.display = bw.ie ? 'block' : 'table-row'; + $(elem).removeClass('show-headers').addClass('hide-headers'); + $(this.gui_objects.all_headers_row).show(); elem.onclick = function() { rcmail.hide_headers(elem); } // fetch headers only once if (!this.gui_objects.all_headers_box.innerHTML) { - this.display_message(this.get_label('loading'), 'loading', true); + this.display_message(this.get_label('loading'), 'loading', true); this.http_post('headers', '_uid='+this.env.uid); } } @@ -3759,9 +3750,8 @@ function rcube_webmail() if (!this.gui_objects.all_headers_row || !this.gui_objects.all_headers_box) return; - this.set_classname(elem, 'hide-headers', false); - this.set_classname(elem, 'show-headers', true); - this.gui_objects.all_headers_row.style.display = 'none'; + $(elem).removeClass('hide-headers').addClass('show-headers'); + $(this.gui_objects.all_headers_row).hide(); elem.onclick = function() { rcmail.load_headers(elem); } } @@ -3772,23 +3762,16 @@ function rcube_webmail() this.html2plain = function(htmlText, id) { - var http_request = new rcube_http_request(); var url = this.env.bin_path+'html2text.php'; var rcmail = this; this.set_busy(true, 'converting'); console.log('HTTP POST: '+url); - http_request.onerror = function(o) { rcmail.http_error(o); }; - http_request.oncomplete = function(o) { rcmail.set_text_value(o, id); }; - http_request.POST(url, htmlText, 'application/octet-stream'); - } - - this.set_text_value = function(httpRequest, id) - { - this.set_busy(false); - document.getElementById(id).value = httpRequest.get_text(); - console.log(httpRequest.get_text()); + $.ajax({ type: 'POST', url: url, data: htmlText, contentType: 'application/octet-stream', + error: function(o) { rcmail.http_error(o); }, + success: function(data) { rcmail.set_busy(false); $(document.getElementById(id)).val(data); console.log(data); } + }); } @@ -3813,99 +3796,61 @@ function rcube_webmail() this.redirect(this.env.comm_path+'&_action='+action+querystring, lock); }; - this.http_sockets = new Array(); - - // find a non-busy socket or create a new one - this.get_request_obj = function() - { - for (var n=0; n execute it - if (request_obj.get_text() && (ctype=='text/javascript' || ctype=='application/x-javascript')) - eval(request_obj.get_text()); + // we have labels to add + if (typeof response.texts == 'object') { + for (var name in response.texts) + if (typeof response.texts[name] == 'string') + this.add_label(name, response.texts[name]); + } + // if we get javascript code from server -> execute it + if (response.exec) { + console.log(response.exec); + eval(response.exec); + } + // process the response data according to the sent action - switch (request_obj.__action) { + switch (response.action) { case 'delete': if (this.task == 'addressbook') { var uid = this.contact_list.get_selection(); @@ -3922,7 +3867,7 @@ function rcube_webmail() break; case 'purge': - case 'expunge': + case 'expunge': if (!this.env.messagecount && this.task == 'mail') { // clear preview pane content if (this.env.contentframe) @@ -3937,23 +3882,22 @@ function rcube_webmail() case 'getunread': case 'list': if (this.task == 'mail') { - if (this.message_list && request_obj.__action == 'list') + if (this.message_list && response.action == 'list') this.msglist_select(this.message_list); this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0)); this.enable_command('purge', this.purge_mailbox_test()); } else if (this.task == 'addressbook') this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0)); - break; - } - - request_obj.reset(); - }; + } + }; // handle HTTP request errors - this.http_error = function(request_obj) + this.http_error = function(request, status, err) { + alert(status+":"+err); +/* //alert('Error sending request: '+request_obj.url+' => HTTP '+request_obj.xmlhttp.status); if (request_obj.__lock) this.set_busy(false); @@ -3961,6 +3905,7 @@ function rcube_webmail() request_obj.reset(); request_obj.__lock = false; this.display_message('Unknown Server Error!', 'error'); +*/ }; // use an image to send a keep-alive siganl to the server @@ -4066,161 +4011,11 @@ function rcube_webmail() } }; - } // end object rcube_webmail +} // end object rcube_webmail -/** - * Class for sending HTTP requests - * @constructor - */ -function rcube_http_request() - { - this.url = ''; - this.busy = false; - this.xmlhttp = null; - - // reset object properties - this.reset = function() - { - // set unassigned event handlers - this.onloading = function(){ }; - this.onloaded = function(){ }; - this.oninteractive = function(){ }; - this.oncomplete = function(){ }; - this.onabort = function(){ }; - this.onerror = function(){ }; - - this.url = ''; - this.busy = false; - this.xmlhttp = null; - } - - // create HTMLHTTP object - this.build = function() - { - if (window.XMLHttpRequest) - this.xmlhttp = new XMLHttpRequest(); - else if (window.ActiveXObject) - { - try { this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } - catch(e) { this.xmlhttp = null; } - } - else - { - - } - } - - // send GET request - this.GET = function(url) - { - this.build(); - - if (!this.xmlhttp) - { - this.onerror(this); - return false; - } - - var _ref = this; - this.url = url; - this.busy = true; - - this.xmlhttp.onreadystatechange = function(){ _ref.xmlhttp_onreadystatechange(); }; - this.xmlhttp.open('GET', url, true); - this.xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid')); - this.xmlhttp.send(null); - }; - - this.POST = function(url, body, contentType) - { - // default value for contentType if not provided - if (typeof(contentType) == 'undefined') - contentType = 'application/x-www-form-urlencoded'; - - this.build(); - - if (!this.xmlhttp) - { - this.onerror(this); - return false; - } - - var req_body = body; - if (typeof(body) == 'object') - { - req_body = ''; - for (var p in body) - req_body += (req_body ? '&' : '') + p+'='+urlencode(body[p]); - } - - var ref = this; - this.url = url; - this.busy = true; - - this.xmlhttp.onreadystatechange = function() { ref.xmlhttp_onreadystatechange(); }; - this.xmlhttp.open('POST', url, true); - this.xmlhttp.setRequestHeader('Content-Type', contentType); - this.xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid')); - this.xmlhttp.send(req_body); - }; - - // handle onreadystatechange event - this.xmlhttp_onreadystatechange = function() - { - if(this.xmlhttp.readyState == 1) - this.onloading(this); - - else if(this.xmlhttp.readyState == 2) - this.onloaded(this); - - else if(this.xmlhttp.readyState == 3) - this.oninteractive(this); - - else if(this.xmlhttp.readyState == 4) - { - try { - if (this.xmlhttp.status == 0) - this.onabort(this); - else if(this.xmlhttp.status == 200) - this.oncomplete(this); - else - this.onerror(this); - - this.busy = false; - } - catch(err) - { - this.onerror(this); - this.busy = false; - } - } - } - - // getter method for HTTP headers - this.get_header = function(name) - { - return this.xmlhttp.getResponseHeader(name); - }; - - this.get_text = function() - { - return this.xmlhttp.responseText; - }; - - this.get_xml = function() - { - return this.xmlhttp.responseXML; - }; - - this.reset(); - - } // end class rcube_http_request - -// helper function to call the init method with a delay -function call_init(o) - { - window.setTimeout('if (window[\''+o+'\'] && window[\''+o+'\'].init) { '+o+'.init(); }', - bw.win ? 500 : 200); - } +// copy event engine prototype +rcube_webmail.prototype.addEventListener = rcube_event_engine.prototype.addEventListener; +rcube_webmail.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener; +rcube_webmail.prototype.triggerEvent = rcube_event_engine.prototype.triggerEvent; diff --git a/program/js/common.js b/program/js/common.js index bd699d924..407da4170 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -93,7 +93,7 @@ function roundcube_browser() } -// static functions for event handling +// static functions for DOM event handling var rcube_event = { /** @@ -159,8 +159,8 @@ get_mouse_pos: function(e) } if (e._offset) { - mX += e._offset.x; - mY += e._offset.y; + mX += e._offset.left; + mY += e._offset.top; } return { x:mX, y:mY }; @@ -234,7 +234,86 @@ cancel: function(evt) }; -var rcube_layer_objects = new Array(); +/** + * rcmail objects event interface + */ +function rcube_event_engine() +{ + this._events = {}; +} + +rcube_event_engine.prototype = { + +/** + * Setter for object event handlers + * + * @param {String} Event name + * @param {Function} Handler function + * @return Listener ID (used to remove this handler later on) + */ +addEventListener: function(evt, func, obj) +{ + if (!this._events) + this._events = {}; + if (!this._events[evt]) + this._events[evt] = []; + + var e = {func:func, obj:obj ? obj : window}; + this._events[evt][this._events[evt].length] = e; +}, + +/** + * Removes a specific event listener + * + * @param {String} Event name + * @param {Int} Listener ID to remove + */ +removeEventListener: function(evt, func, obj) +{ + if (typeof obj == 'undefined') + obj = window; + + for (var h,i=0; this._events && this._events[evt] && i < this._events[evt].length; i++) + if ((h = this._events[evt][i]) && h.func == func && h.obj == obj) + this._events[evt][i] = null; +}, + +/** + * This will execute all registered event handlers + * + * @param {String} Event to trigger + * @param {Object} Event object/arguments + */ +triggerEvent: function(evt, e) +{ + var ret, h; + if (typeof e == 'undefined') + e = {}; + if (typeof e == 'object') + e.event = evt; + + if (this._events && this._events[evt] && !this._event_exec) { + this._event_exec = true; + for (var i=0; i < this._events[evt].length; i++) { + if ((h = this._events[evt][i])) { + if (typeof h.func == 'function') + ret = h.func.call ? h.func.call(h.obj, this, e) : h.func(this, e); + else if (typeof h.obj[h.func] == 'function') + ret = h.obj[h.func](this, e); + + // cancel event execution + if (typeof ret != 'undefined' && !ret) + break; + } + } + } + + this._event_exec = false; + return ret; +} + +} // end rcube_event_engine.prototype + /** @@ -243,7 +322,7 @@ var rcube_layer_objects = new Array(); * @constructor */ function rcube_layer(id, attributes) - { +{ this.name = id; // create a new layer in the current document @@ -310,10 +389,6 @@ function rcube_layer(id, attributes) this.y = parseInt(this.elm.offsetTop); this.visible = (this.css.visibility=='visible' || this.css.visibility=='show' || this.css.visibility=='inherit') ? true : false; - this.id = rcube_layer_objects.length; - this.obj = 'rcube_layer_objects['+this.id+']'; - rcube_layer_objects[this.id] = this; - // ********* layer object methods ********* @@ -327,16 +402,6 @@ function rcube_layer(id, attributes) this.css.top = Math.round(this.y)+'px'; } - - // move the layer for a specific step - this.shift = function(x,y) - { - x = Math.round(x*100)/100; - y = Math.round(y*100)/100; - this.move(this.x+x, this.y+y); - } - - // change the layers width and height this.resize = function(w,h) { @@ -347,15 +412,6 @@ function rcube_layer(id, attributes) } - // cut the layer (top,width,height,left) - this.clip = function(t,w,h,l) - { - this.css.clip='rect('+t+' '+w+' '+h+' '+l+')'; - this.clip_height = h; - this.clip_width = w; - } - - // show or hide the layer this.show = function(a) { @@ -383,36 +439,7 @@ function rcube_layer(id, attributes) this.elm.innerHTML = cont; } - - // set the given color to the layer background - this.set_bgcolor = function(c) - { - if(!c || c=='#') - c = 'transparent'; - - this.css.backgroundColor = c; - } - - - // set the opacity of a layer to the given ammount (in %) - this.set_opacity = function(v) - { - if(!bw.opacity) - return; - - var op = v<=1 ? Math.round(v*100) : parseInt(v); - - if(bw.ie) - this.css.filter = 'alpha(opacity:'+op+')'; - else if(bw.safari) - { - this.css.opacity = op/100; - this.css.KhtmlOpacity = op/100; - } - else if(bw.mz) - this.css.MozOpacity = op/100; - } - } +} // check if input is a valid email address @@ -472,7 +499,7 @@ function urlencode(str) // get any type of html objects by id/name function rcube_find_object(id, d) - { +{ var n, f, obj, e; if(!d) d = document; @@ -486,88 +513,34 @@ function rcube_find_object(id, d) if(!obj && d.images.length) obj = d.images[id]; - if(!obj && d.forms.length) - for(f=0; f= pos.x) && (mouse.x < (pos.x + obj.offsetWidth)) && - (mouse.y >= pos.y) && (mouse.y < (pos.y + obj.offsetHeight))); -} + var pos = $(obj).offset(); + return ((mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) && + (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight))); +} -/** - * Return the currently applied value of a css property - * - * @param {Object} html_element Node reference - * @param {String} css_property Property name to read in Javascript notation (eg. 'textAlign') - * @param {String} mozilla_equivalent Equivalent property name in CSS notation (eg. 'text-align') - * @return CSS property value - * @type String - */ -function get_elements_computed_style(html_element, css_property, mozilla_equivalent) - { - if (arguments.length==2) - mozilla_equivalent = css_property; - - var el = html_element; - if (typeof(html_element)=='string') - el = rcube_find_object(html_element); - - if (el && el.currentStyle) - return el.currentStyle[css_property]; - else if (el && document.defaultView && document.defaultView.getComputedStyle) - return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozilla_equivalent); - else - return false; - } - // cookie functions by GoogieSpell function setCookie(name, value, expires, path, domain, secure) @@ -611,7 +584,7 @@ function rcube_console() if (box) { if (msg.charAt(msg.length-1)=='\n') - msg += '--------------------------------------\n'; + msg += '--------------------------------------\n'; else msg += '\n--------------------------------------\n'; @@ -633,7 +606,8 @@ function rcube_console() } var bw = new roundcube_browser(); -var console = new rcube_console(); +if (!window.console) + console = new rcube_console(); // Add escape() method to RegExp object diff --git a/program/js/editor.js b/program/js/editor.js index 6b847ba00..7f937b2b8 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -52,8 +52,8 @@ function rcmail_editor_init(skin_path, editor_lang, spellcheck, mode) spellchecker_languages : (rcmail.env.spellcheck_langs ? rcmail.env.spellcheck_langs : 'Dansk=da,Deutsch=de,+English=en,Espanol=es,Francais=fr,Italiano=it,Nederlands=nl,Polski=pl,Portugues=pt,Suomi=fi,Svenska=sv'), gecko_spellcheck : true, relative_urls : false, - remove_script_host : false , - rc_client: rcube_webmail_client, + remove_script_host : false, + rc_client: rcmail, oninit : 'rcmail_editor_callback' }); } diff --git a/program/js/list.js b/program/js/list.js index 522af59ab..dabcecb92 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -51,7 +51,6 @@ function rcube_list_widget(list, p) this.drag_mouse_start = null; this.dblclick_time = 600; this.row_init = function(){}; - this.events = { click:[], dblclick:[], select:[], keypress:[], dragstart:[], dragmove:[], dragend:[] }; // overwrite default paramaters if (p && typeof(p)=='object') @@ -160,13 +159,15 @@ remove_row: function(uid, sel_next) insert_row: function(row, attop) { var tbody = this.list.tBodies[0]; + if (!row.jquery) + row = $(row); if (attop && tbody.rows.length) - tbody.insertBefore(row, tbody.firstChild); + row.prependTo(tbody) else - tbody.appendChild(row); + row.appendTo(tbody); - this.init_row(row); + this.init_row(row[0]); this.rowcount++; }, @@ -181,10 +182,8 @@ focus: function(e) for (var n=0; n').attr('id', 'rcmdraglayer').css({ position:'absolute', display:'none', 'z-index':2000 }).appendTo(document.body); // get subjects of selectedd messages var names = ''; @@ -754,6 +747,9 @@ drag_mouse_move: function(e) if (((node = obj.childNodes[i].firstChild) && (node.nodeType==3 || node.nodeName=='A')) && (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c))) { + if (n == 0) + this.drag_start_pos = $(node).offset(); + subject = node.nodeType==3 ? node.data : node.innerHTML; // remove leading spaces subject = subject.replace(/^\s+/i, ''); @@ -767,18 +763,18 @@ drag_mouse_move: function(e) } } - this.draglayer.write(names); - this.draglayer.show(1); + this.draglayer.html(names); + this.draglayer.show(); this.drag_active = true; - this.trigger_event('dragstart'); + this.triggerEvent('dragstart'); } if (this.drag_active && this.draglayer) { var pos = rcube_event.get_mouse_pos(e); - this.draglayer.move(pos.x+20, bw.ie ? pos.y-5+document.documentElement.scrollTop : pos.y-5); - this.trigger_event('dragmove', e); + this.draglayer.css({ left:(pos.x+20)+'px', top:(pos.y-5 + (bw.ie ? document.documentElement.scrollTop : 0))+'px' }); + this.triggerEvent('dragmove', e); } this.drag_start = false; @@ -794,11 +790,15 @@ drag_mouse_up: function(e) { document.onmousemove = null; - if (this.draglayer && this.draglayer.visible) - this.draglayer.show(0); + if (this.draglayer && this.draglayer.is(':visible')) { + if (this.drag_start_pos) + this.draglayer.animate(this.drag_start_pos, 300, 'swing').hide(20); + else + this.draglayer.hide(); + } this.drag_active = false; - this.trigger_event('dragend'); + this.triggerEvent('dragend'); rcube_event.remove_listener({element:document, event:'mousemove', object:this, method:'drag_mouse_move'}); rcube_event.remove_listener({element:document, event:'mouseup', object:this, method:'drag_mouse_up'}); @@ -828,68 +828,10 @@ drag_mouse_up: function(e) } return rcube_event.cancel(e); -}, - - - -/** - * set/unset a specific class name - */ -set_classname: function(obj, classname, set) -{ - var reg = new RegExp('\s*'+classname, 'i'); - if (!set && obj.className.match(reg)) - obj.className = obj.className.replace(reg, ''); - else if (set && !obj.className.match(reg)) - obj.className += ' '+classname; -}, - - -/** - * Setter for object event handlers - * - * @param {String} Event name - * @param {Function} Handler function - * @return Listener ID (used to remove this handler later on) - */ -addEventListener: function(evt, handler) -{ - if (this.events[evt]) { - var handle = this.events[evt].length; - this.events[evt][handle] = handler; - return handle; - } - else - return false; -}, - - -/** - * Removes a specific event listener - * - * @param {String} Event name - * @param {Int} Listener ID to remove - */ -removeEventListener: function(evt, handle) -{ - if (this.events[evt] && this.events[evt][handle]) - this.events[evt][handle] = null; -}, - - -/** - * This will execute all registered event handlers - * @private - */ -trigger_event: function(evt, p) -{ - if (this.events[evt] && this.events[evt].length) { - for (var i=0; i