From 0ff9e77c5fb4513bb52454f4309b3652ebd0f5cb Mon Sep 17 00:00:00 2001 From: SJ Date: Wed, 12 Sep 2012 09:51:35 +0200 Subject: [PATCH] added scrolling feature with up/down arrows --- webui/view/javascript/piler.js | 51 ++++ webui/view/javascript/shortcut.js | 223 ++++++++++++++++++ .../default/stylesheet/style-default.css | 1 + .../default/templates/common/layout-new.tpl | 21 ++ .../theme/default/templates/search/helper.tpl | 4 +- 5 files changed, 298 insertions(+), 2 deletions(-) create mode 100644 webui/view/javascript/shortcut.js diff --git a/webui/view/javascript/piler.js b/webui/view/javascript/piler.js index 388aa8bc..eddff9a5 100644 --- a/webui/view/javascript/piler.js +++ b/webui/view/javascript/piler.js @@ -3,6 +3,8 @@ var attachment_types = ["word", "excel", "powerpoint", "pdf", "compressed", "tex var count = 0; var expsrc = 0; +var current_message_serial = 1; +var current_messages = new Array(); function getXMLHttp() { var XMLHttp = null; @@ -68,6 +70,8 @@ function load_ajax_url(url) { function load_search_results(url, params, page) { + current_message_serial = 0; + current_messages = new Array(); document.getElementById('messagelistcontainer').innerHTML = 'spinner'; @@ -88,6 +92,8 @@ function load_search_results(url, params, page) { if(http.readyState == 4) { if(http.status == 200) { document.getElementById('mailcontframe').innerHTML = http.responseText; + + fill_current_messages_array(); } else { alert("Problem retrieving XML data:" + http.statusText); @@ -600,6 +606,25 @@ function append_email_from_slider(id, value) { } +function fill_current_messages_array() { + var a = document.getElementById('results'); + j = 1; + + len = a.childNodes.length; + + for(i=0; i 1) current_message_serial--; + } + + load_url_with_get(message_loader_url + current_messages[current_message_serial], 'mailpreviewframe'); + + current_result_div = document.getElementById('e_' + current_messages[current_message_serial]); + + if(current_result_div){ current_result_div.className = 'resultrow selected'; } + + var objDiv = document.getElementById("messagelistcontainer"); + if(objDiv) objDiv.scrollTop = current_message_serial*17 - 30; +} + + diff --git a/webui/view/javascript/shortcut.js b/webui/view/javascript/shortcut.js new file mode 100644 index 00000000..debaffba --- /dev/null +++ b/webui/view/javascript/shortcut.js @@ -0,0 +1,223 @@ +/** + * http://www.openjs.com/scripts/events/keyboard_shortcuts/ + * Version : 2.01.B + * By Binny V A + * License : BSD + */ +shortcut = { + 'all_shortcuts':{},//All the shortcuts are stored in this array + 'add': function(shortcut_combination,callback,opt) { + //Provide a set of default options + var default_options = { + 'type':'keydown', + 'propagate':false, + 'disable_in_input':false, + 'target':document, + 'keycode':false + } + if(!opt) opt = default_options; + else { + for(var dfo in default_options) { + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; + } + } + + var ele = opt.target; + if(typeof opt.target == 'string') ele = document.getElementById(opt.target); + var ths = this; + shortcut_combination = shortcut_combination.toLowerCase(); + + //The function to be called at keypress + var func = function(e) { + e = e || window.event; + + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields + var element; + if(e.target) element=e.target; + else if(e.srcElement) element=e.srcElement; + if(element.nodeType==3) element=element.parentNode; + + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; + } + + //Find Which key is pressed + if (e.keyCode) code = e.keyCode; + else if (e.which) code = e.which; + var character = String.fromCharCode(code).toLowerCase(); + + if(code == 188) character=","; //If the user presses , when the type is onkeydown + if(code == 190) character="."; //If the user presses , when the type is onkeydown + + var keys = shortcut_combination.split("+"); + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked + var kp = 0; + + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken + var shift_nums = { + "`":"~", + "1":"!", + "2":"@", + "3":"#", + "4":"$", + "5":"%", + "6":"^", + "7":"&", + "8":"*", + "9":"(", + "0":")", + "-":"_", + "=":"+", + ";":":", + "'":"\"", + ",":"<", + ".":">", + "/":"?", + "\\":"|" + } + //Special Keys - and their codes + var special_keys = { + 'esc':27, + 'escape':27, + 'tab':9, + 'space':32, + 'return':13, + 'enter':13, + 'backspace':8, + + 'scrolllock':145, + 'scroll_lock':145, + 'scroll':145, + 'capslock':20, + 'caps_lock':20, + 'caps':20, + 'numlock':144, + 'num_lock':144, + 'num':144, + + 'pause':19, + 'break':19, + + 'insert':45, + 'home':36, + 'delete':46, + 'end':35, + + 'pageup':33, + 'page_up':33, + 'pu':33, + + 'pagedown':34, + 'page_down':34, + 'pd':34, + + 'left':37, + 'up':38, + 'right':39, + 'down':40, + + 'f1':112, + 'f2':113, + 'f3':114, + 'f4':115, + 'f5':116, + 'f6':117, + 'f7':118, + 'f8':119, + 'f9':120, + 'f10':121, + 'f11':122, + 'f12':123 + } + + var modifiers = { + shift: { wanted:false, pressed:false}, + ctrl : { wanted:false, pressed:false}, + alt : { wanted:false, pressed:false}, + meta : { wanted:false, pressed:false} //Meta is Mac specific + }; + + if(e.ctrlKey) modifiers.ctrl.pressed = true; + if(e.shiftKey) modifiers.shift.pressed = true; + if(e.altKey) modifiers.alt.pressed = true; + if(e.metaKey) modifiers.meta.pressed = true; + + for(var i=0; k=keys[i],i 1) { //If it is a special key + if(special_keys[k] == code) kp++; + + } else if(opt['keycode']) { + if(opt['keycode'] == code) kp++; + + } else { //The special keys did not match + if(character == k) kp++; + else { + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase + character = shift_nums[character]; + if(character == k) kp++; + } + } + } + } + + if(kp == keys.length && + modifiers.ctrl.pressed == modifiers.ctrl.wanted && + modifiers.shift.pressed == modifiers.shift.wanted && + modifiers.alt.pressed == modifiers.alt.wanted && + modifiers.meta.pressed == modifiers.meta.wanted) { + callback(e); + + if(!opt['propagate']) { //Stop the event + //e.cancelBubble is supported by IE - this will kill the bubbling process. + e.cancelBubble = true; + e.returnValue = false; + + //e.stopPropagation works in Firefox. + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + return false; + } + } + } + this.all_shortcuts[shortcut_combination] = { + 'callback':func, + 'target':ele, + 'event': opt['type'] + }; + //Attach the function with the event + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); + else ele['on'+opt['type']] = func; + }, + + //Remove the shortcut - just specify the shortcut and I will remove the binding + 'remove':function(shortcut_combination) { + shortcut_combination = shortcut_combination.toLowerCase(); + var binding = this.all_shortcuts[shortcut_combination]; + delete(this.all_shortcuts[shortcut_combination]) + if(!binding) return; + var type = binding['event']; + var ele = binding['target']; + var callback = binding['callback']; + + if(ele.detachEvent) ele.detachEvent('on'+type, callback); + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); + else ele['on'+type] = false; + } +} \ No newline at end of file diff --git a/webui/view/theme/default/stylesheet/style-default.css b/webui/view/theme/default/stylesheet/style-default.css index 71ce4ff8..da23183f 100644 --- a/webui/view/theme/default/stylesheet/style-default.css +++ b/webui/view/theme/default/stylesheet/style-default.css @@ -81,6 +81,7 @@ .row.savedsearch { display: table-row; text-align: right; } .resultrow { display: table-row; height: 18px; } .resultrow.odd { background: #f5f5f5; } + .resultrow.selected { border: 2px solid black; } .resultrow.spam { color: #aaa; } .cell1 { display: table-cell; height: 25px; text-align: left; padding: 3px; font: bold 12px Arial, sans-serif; width: 80px; } diff --git a/webui/view/theme/default/templates/common/layout-new.tpl b/webui/view/theme/default/templates/common/layout-new.tpl index 0979cb5c..e4af9073 100644 --- a/webui/view/theme/default/templates/common/layout-new.tpl +++ b/webui/view/theme/default/templates/common/layout-new.tpl @@ -25,6 +25,7 @@ var email_search_url = '/index.php?route=group/email&'; var group_search_url = '/index.php?route=group/group&'; var folder_search_url = '/index.php?route=folder/folder&'; + var message_loader_url = 'message.php/'; @@ -32,6 +33,8 @@ + +