From 32ca1f9fc8a78e092565b51cc97faa724bb4e6cf Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Sat, 30 May 2009 05:09:57 -0400 Subject: [PATCH] - css fixes (#1485869) --- program/js/app.js | 271 ++++++++++++++++++++++++++++++++++------------------- 1 files changed, 172 insertions(+), 99 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 0e0c8bf..4a90bf2 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -165,7 +165,7 @@ this.message_list.addEventListener('select', function(o){ p.msglist_select(o); }); 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; }); + this.message_list.addEventListener('dragend', function(o, e){ p.drag_end(e); }); document.onmouseup = function(e){ return p.doc_mouse_up(e); }; this.message_list.init(); @@ -188,7 +188,9 @@ if (this.env.action=='show' || this.env.action=='preview') { - this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', 'print', 'load-attachment', 'load-headers', true); + this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', + 'open', 'mark', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true); + if (this.env.next_uid) { this.enable_command('nextmessage', true); @@ -198,6 +200,13 @@ { this.enable_command('previousmessage', true); this.enable_command('firstmessage', true); + } + + if (this.env.blockedobjects) + { + if (this.gui_objects.remoteobjectsmsg) + this.gui_objects.remoteobjectsmsg.style.display = 'block'; + this.enable_command('load-images', 'always-load', true); } } @@ -209,13 +218,6 @@ { this.enable_command('compose', 'add-contact', false); parent.rcmail.show_contentframe(true); - } - - if ((this.env.action=='show' || this.env.action=='preview') && this.env.blockedobjects) - { - if (this.gui_objects.remoteobjectsmsg) - this.gui_objects.remoteobjectsmsg.style.display = 'block'; - this.enable_command('load-images', 'always-load', true); } if (this.env.action=='compose') @@ -279,7 +281,7 @@ this.contact_list.addEventListener('select', function(o){ p.contactlist_select(o); }); this.contact_list.addEventListener('dragstart', function(o){ p.drag_start(o); }); this.contact_list.addEventListener('dragmove', function(o, e){ p.drag_move(e); }); - this.contact_list.addEventListener('dragend', function(o){ p.drag_active = false; }); + this.contact_list.addEventListener('dragend', function(o, e){ p.drag_end(e); }); this.contact_list.init(); if (this.env.cid) @@ -348,7 +350,7 @@ case 'login': var input_user = $('#rcmloginuser'); - input_user.bind('keypress', function(e){ return rcmail.login_user_keyup(e); }); + input_user.bind('keyup', function(e){ return rcmail.login_user_keyup(e); }); if (input_user.val() == '') input_user.focus(); @@ -418,7 +420,7 @@ } // set eventhandler to message icon - if ((row.icon = row.obj.cells[0].childNodes[0]) && row.icon.nodeName=='IMG') + if (row.icon = row.obj.getElementsByTagName('TD')[0].getElementsByTagName('IMG')[0]) { var p = this; row.icon.id = 'msgicn_'+row.uid; @@ -431,12 +433,11 @@ { var found; if((found = find_in_array('flag', this.env.coltypes)) >= 0) - this.set_env('flagged_col', found+1); + this.set_env('flagged_col', found+1); } // set eventhandler to flag icon, if icon found - if (this.env.flagged_col && (row.flagged_icon = row.obj.cells[this.env.flagged_col].childNodes[0]) - && row.flagged_icon.nodeName=='IMG') + if (this.env.flagged_col && (row.flagged_icon = row.obj.getElementsByTagName('TD')[this.env.flagged_col].getElementsByTagName('IMG')[0])) { var p = this; row.flagged_icon.id = 'flaggedicn_'+row.uid; @@ -473,7 +474,7 @@ else if (input_subject.val() == '') input_subject.focus(); else if (input_message) - this.set_caret2start(input_message); + input_message.focus(); // get summary of all field values this.compose_field_hash(true); @@ -485,7 +486,7 @@ this.init_address_input_events = function(obj) { var handler = function(e){ return ref.ksearch_keypress(e,this); }; - obj.bind((bw.safari ? 'keydown' : 'keypress'), handler); + obj.bind((bw.safari || bw.ie ? 'keydown' : 'keypress'), handler); obj.attr('autocomplete', 'off'); }; @@ -566,7 +567,16 @@ return true; else if (this.env.permaurl) parent.location.href = this.env.permaurl; - break; + break; + + case 'open': + var uid; + if (uid = this.get_single_uid()) + { + obj.href = '?_task='+this.env.task+'&_action=show&_mbox='+urlencode(this.env.mailbox)+'&_uid='+uid; + return true; + } + break; // misc list commands case 'list': @@ -597,23 +607,13 @@ case 'sort': - // get the type of sorting - var a_sort = props.split('_'); - var sort_col = a_sort[0]; - var sort_order = a_sort[1] ? a_sort[1].toUpperCase() : null; + var sort_order, sort_col = props; - // no sort order specified: toggle - if (sort_order==null) - { - if (this.env.sort_col==sort_col) - sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC'; - else - sort_order = this.env.sort_order; - } - - if (this.env.sort_col==sort_col && this.env.sort_order==sort_order) - break; - + if (this.env.sort_col==sort_col) + sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC'; + else + sort_order = 'ASC'; + // set table header class $('#rcm'+this.env.sort_col).removeClass('sorted'+(this.env.sort_order.toUpperCase())); $('#rcm'+sort_col).addClass('sorted'+sort_order); @@ -913,7 +913,7 @@ tinyMCE.execCommand('mceSpellCheck', true); } else if (this.env.spellcheck && this.env.spellcheck.spellCheck && this.spellcheck_ready) { - this.env.spellcheck.spellCheck(this.env.spellcheck.check_link); + this.env.spellcheck.spellCheck(); this.set_spellcheck_state('checking'); } break; @@ -1003,10 +1003,16 @@ var uid; if (uid = this.get_single_uid()) { - ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox)); + ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)); if (this.sourcewin) window.setTimeout(function(){ ref.sourcewin.focus(); }, 20); } + break; + + case 'download': + var uid; + if (uid = this.get_single_uid()) + this.goto_url('viewsource', '&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+'&_save=1'); break; case 'add-contact': @@ -1233,9 +1239,6 @@ this.drag_start = function(list) { - this.initialBodyScrollTop = bw.ie ? 0 : window.pageYOffset; - this.initialMailBoxScrollTop = document.getElementById("mailboxlist-container").scrollTop; - var model = this.task == 'mail' ? this.env.mailboxes : this.env.address_sources; this.drag_active = true; @@ -1245,6 +1248,9 @@ // save folderlist and folders location/sizes for droptarget calculation in drag_move() if (this.gui_objects.folderlist && model) { + this.initialBodyScrollTop = bw.ie ? 0 : window.pageYOffset; + this.initialListScrollTop = this.gui_objects.folderlist.parentNode.scrollTop; + var li, pos, list, height; list = $(this.gui_objects.folderlist); pos = list.offset(); @@ -1262,12 +1268,27 @@ } }; + this.drag_end = function(e) + { + this.drag_active = false; + + // over the folders + if (this.gui_objects.folderlist && this.env.folder_coords) { + for (var k in this.env.folder_coords) { + if (k == this.env.last_folder_target) { + $(this.get_folder_li(k)).removeClass('droptarget'); + this.env.last_folder_target = null; + } + } + } + }; + this.drag_move = function(e) { if (this.gui_objects.folderlist && this.env.folder_coords) { // offsets to compensate for scrolling while dragging a message var boffset = bw.ie ? -document.documentElement.scrollTop : this.initialBodyScrollTop; - var moffset = this.initialMailBoxScrollTop-document.getElementById('mailboxlist-container').scrollTop; + var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop; var toffset = -moffset-boffset; var li, pos, mouse; @@ -1368,12 +1389,12 @@ if (this.env.mailbox == this.env.drafts_mailbox) { this.enable_command('reply', 'reply-all', 'forward', false); - this.enable_command('show', 'print', selected); + this.enable_command('show', 'print', 'open', 'download', 'viewsource', selected); this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false)); } else { - this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected); + this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', 'open', 'download', 'viewsource', selected); this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false)); } @@ -2124,7 +2145,7 @@ this.stop_spellchecking = function() { if (this.env.spellcheck && !this.spellcheck_ready) { - exec_event(this.env.spellcheck.check_link, 'click'); + $(this.env.spellcheck.spell_span).trigger('click'); this.set_spellcheck_state('ready'); } }; @@ -2135,15 +2156,14 @@ // stop spellchecking process if (!vis) this.stop_spellchecking(); - - this.env.spellcheck.check_link.style.visibility = vis ? 'visible' : 'hidden'; - this.env.spellcheck.switch_lan_pic.style.visibility = vis ? 'visible' : 'hidden'; + + $(this.env.spellcheck.spell_container).css('visibility', vis ? 'visible' : 'hidden'); } }; this.set_spellcheck_state = function(s) { - this.spellcheck_ready = (s=='check_spelling' || s=='ready'); + this.spellcheck_ready = (s == 'ready' || s == 'no_error_found'); this.enable_command('spellcheck', this.spellcheck_ready); }; @@ -2200,7 +2220,7 @@ var input_message = $("[name='_message']"); var message = input_message.val(); var is_html = ($("input[name='_is_html']").val() == '1'); - var sig, p; + var sig, p, len; if (!this.env.identity) this.env.identity = id @@ -2224,7 +2244,8 @@ } message = message.replace(/[\r\n]+$/, ''); - + len = message.length; + // add the new signature string if (this.env.signatures && this.env.signatures[id]) { @@ -2236,6 +2257,7 @@ if (sig.indexOf('-- ')!=0) sig = '-- \n'+sig; message += '\n\n'+sig; + if (len) len += 1; } } else @@ -2281,6 +2303,10 @@ } input_message.val(message); + + // move cursor before the signature + if (!is_html) + this.set_caret_pos(input_message.get(0), len); this.env.identity = id; return true; @@ -2404,19 +2430,26 @@ }; // send remote request to search mail or contacts - this.qsearch = function(value, addurl) + this.qsearch = function(value) { if (value != '') { - if (this.message_list) + var addurl = ''; + if (this.message_list) { this.message_list.clear(); - else if (this.contact_list) { + if (this.env.search_mods) { + var head_arr = new Array(); + for (var n in this.env.search_mods) + head_arr.push(n); + addurl += '&_headers='+head_arr.join(','); + } + } else if (this.contact_list) { this.contact_list.clear(true); this.show_contentframe(false); } if (this.gui_objects.search_filter) - addurl = '&_filter=' + this.gui_objects.search_filter.value; + addurl += '&_filter=' + this.gui_objects.search_filter.value; // reset vars this.env.current_page = 1; @@ -2563,19 +2596,22 @@ q = q.replace(/(^\s+|\s+$)/g, '').toLowerCase(); // Don't (re-)search if string is empty or if the last results are still active - if (!q.length || q == this.ksearch_value) + if (q == this.ksearch_value) return; - + this.ksearch_value = q; + if (!q.length) + return; + this.display_message(this.get_label('searching'), 'loading', true); - this.http_post('autocomplete', '_search='+q); + this.http_post('autocomplete', '_search='+urlencode(q)); }; this.ksearch_query_results = function(results, search) { // ignore this outdated search response - if (search != this.ksearch_value) + if (this.ksearch_value && search != this.ksearch_value) return; this.hide_message(); @@ -3009,7 +3045,6 @@ var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']'); this.name_input = document.createElement('INPUT'); this.name_input.value = this.env.subscriptionrows[id][0].replace(reg, ''); - this.name_input.style.width = '100%'; reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$'); this.name_input.__parent = this.env.subscriptionrows[id][0].replace(reg, ''); @@ -3461,6 +3496,9 @@ if ((target_li = this.get_folder_li(name))) { $(target_li).removeClass('unfocused').addClass('selected'); } + + // trigger event hook + this.triggerEvent('selectfolder', { folder:name, old:old }); } }; @@ -3512,7 +3550,11 @@ if (!this.gui_objects.messagelist || !this.message_list) return false; - var tbody = this.gui_objects.messagelist.tBodies[0]; + if (this.message_list.background) + var tbody = this.message_list.background; + else + var tbody = this.gui_objects.messagelist.tBodies[0]; + var rowcount = tbody.rows.length; var even = rowcount%2; @@ -3528,13 +3570,14 @@ + (even ? ' even' : ' odd') + (flags.unread ? ' unread' : '') + (flags.deleted ? ' deleted' : '') - + (flags.flagged ? ' flagged' : ''); + + (flags.flagged ? ' flagged' : '') + + (this.message_list.in_selection(uid) ? ' selected' : ''); - var row = $('<tr>').attr('id', 'rcmrow'+uid).attr('class', css_class); - - if (this.message_list.in_selection(uid)) - row.addClass('selected'); - + // for performance use DOM instead of jQuery here + var row = document.createElement('TR'); + row.id = 'rcmrow'+uid; + row.className = css_class; + var icon = this.env.messageicon; if (flags.deleted && this.env.deletedicon) icon = this.env.deletedicon; @@ -3551,36 +3594,48 @@ icon = this.env.unreadicon; // add icon col - $('<td>').addClass('icon').html(icon ? '<img src="'+icon+'" alt="" />' : '').appendTo(row); - + var col = document.createElement('TD'); + col.className = 'icon'; + col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : ''; + row.appendChild(col); + // add each submitted col for (var n = 0; n < this.coltypes.length; n++) { var c = this.coltypes[n]; - col = $('<td>').addClass(String(c).toLowerCase()); - + col = document.createElement('TD'); + col.className = String(c).toLowerCase(); + if (c=='flag') { if (flags.flagged && this.env.flaggedicon) - col.html('<img src="'+this.env.flaggedicon+'" alt="" />'); + col.innerHTML = '<img src="'+this.env.flaggedicon+'" alt="" />'; else if(!flags.flagged && this.env.unflaggedicon) - col.html('<img src="'+this.env.unflaggedicon+'" alt="" />'); - } + col.innerHTML = '<img src="'+this.env.unflaggedicon+'" alt="" />'; + } else if (c=='attachment') - col.html(attachment && this.env.attachmenticon ? '<img src="'+this.env.attachmenticon+'" alt="" />' : ' '); + col.innerHTML = (attachment && this.env.attachmenticon ? '<img src="'+this.env.attachmenticon+'" alt="" />' : ' '); else - col.html(cols[c]); + col.innerHTML = cols[c]; - col.appendTo(row); + row.appendChild(col); } this.message_list.insert_row(row, attop); + this.triggerEvent('insertrow', { uid:uid, row:row }); // 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); - } - }; + } + }; + + // messages list handling in background (for performance) + this.offline_message_list = function(flag) + { + if (this.message_list) + this.message_list.set_background_mode(flag); + }; // replace content of row count display this.set_rowcount = function(text) @@ -3692,17 +3747,24 @@ var rowcount = tbody.rows.length; var even = rowcount%2; - var row = $('<tr>').attr('id', 'rcmrow'+cid).addClass('class').addClass(even ? 'even' : 'odd'); - + var row = document.createElement('TR'); + row.id = 'rcmrow'+cid; + row.className = 'contact '+(even ? 'even' : 'odd'); + if (this.contact_list.in_selection(cid)) - row.addClass('selected'); + row.className += ' selected'; // add each submitted col for (var c in cols) { - col = $('<td>').addClass(String(c).toLowerCase()).html(cols[c]).appendTo(row); + col = document.createElement('TD'); + col.className = String(c).toLowerCase(); + col.innerHTML = cols[c]; + row.appendChild(col); } this.contact_list.insert_row(row); + this.triggerEvent('insertrow', { cid:cid, row:row }); + this.enable_command('export', (this.contact_list.rowcount > 0)); }; @@ -3772,6 +3834,13 @@ error: function(o) { rcmail.http_error(o); }, success: function(data) { rcmail.set_busy(false); $(document.getElementById(id)).val(data); console.log(data); } }); + } + + this.plain2html = function(plainText, id) + { + this.set_busy(true, 'converting'); + $(document.getElementById(id)).val('<pre>'+plainText+'</pre>'); + this.set_busy(false); } @@ -3848,7 +3917,7 @@ console.log(response.exec); eval(response.exec); } - + // process the response data according to the sent action switch (response.action) { case 'delete': @@ -3886,9 +3955,16 @@ 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()); + + if (response.action == 'list') + this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount }); } - else if (this.task == 'addressbook') + else if (this.task == 'addressbook') { this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0)); + + if (response.action == 'list') + this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount }); + } break; } }; @@ -3896,16 +3972,13 @@ // handle HTTP request errors 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); + var errmsg = request.statusText; - request_obj.reset(); - request_obj.__lock = false; - this.display_message('Unknown Server Error!', 'error'); -*/ + this.set_busy(false); + request.abort(); + + if (errmsg) + this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error'); }; // use an image to send a keep-alive siganl to the server @@ -3980,19 +4053,19 @@ return obj.value.length; }; - this.set_caret2start = function(obj) + this.set_caret_pos = function(obj, pos) { - if (obj.createTextRange) + if (obj.setSelectionRange) + obj.setSelectionRange(pos, pos); + else if (obj.createTextRange) { var range = obj.createTextRange(); range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); range.select(); } - else if (obj.setSelectionRange) - obj.setSelectionRange(0,0); - - obj.focus(); - }; + } // set all fields of a form disabled this.lock_form = function(form, lock) -- Gitblit v1.9.1