| | |
| | | |
| | | this.identifier_expr = new RegExp('[^0-9a-z\-_]', 'gi'); |
| | | |
| | | // mimetypes supported by the browser (default settings) |
| | | this.mimetypes = new Array('text/plain', 'text/html', 'text/xml', |
| | | 'image/jpeg', 'image/gif', 'image/png', |
| | | 'application/x-javascript', 'application/pdf', 'application/x-shockwave-flash'); |
| | | |
| | | // default environment vars |
| | | this.env.keep_alive = 60; // seconds |
| | | this.env.request_timeout = 180; // seconds |
| | |
| | | if (over) button_prop.over = over; |
| | | |
| | | this.buttons[command].push(button_prop); |
| | | |
| | | if (this.loaded) |
| | | init_button(command, button_prop); |
| | | }; |
| | | |
| | | // register a specific gui object |
| | | this.gui_object = function(name, id) |
| | | { |
| | | this.gui_objects[name] = id; |
| | | this.gui_objects[name] = this.loaded ? rcube_find_object(id) : id; |
| | | }; |
| | | |
| | | // register a container object |
| | |
| | | } |
| | | if (this.gui_objects.qsearchbox) { |
| | | this.enable_command('search', 'reset-search', 'moveto', true); |
| | | $(this.gui_objects.qsearchbox).select(); |
| | | } |
| | | |
| | | if (this.contact_list && this.contact_list.rowcount > 0) |
| | |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | // prevent from form submit with Enter key in file input fields |
| | | if (bw.ie) |
| | | $('input[type=file]').keydown(function(e) { if (e.keyCode == '13') e.preventDefault(); }); |
| | | |
| | | // flag object as complete |
| | | this.loaded = true; |
| | |
| | | if (props == 'reload') { |
| | | form.action += '?_reload=1'; |
| | | } |
| | | else if ((input = $("input[name='_name']", form)) &&input.length && input.val() == '') { |
| | | alert(this.get_label('nonamewarning')); |
| | | input.focus(); |
| | | break; |
| | | } |
| | | else if (this.task == 'settings' && (this.env.identities_level % 2) == 0 && |
| | | (input = $("input[name='_email']", form)) && input.length && !rcube_check_email(input.val()) |
| | | ) { |
| | |
| | | var qstring = '_mbox='+urlencode(this.env.mailbox)+'&_uid='+this.env.uid+'&_part='+props.part; |
| | | |
| | | // open attachment in frame if it's of a supported mimetype |
| | | if (this.env.uid && props.mimetype && $.inArray(props.mimetype, this.mimetypes)>=0) { |
| | | if (this.env.uid && props.mimetype && this.env.mimetypes && $.inArray(props.mimetype, this.env.mimetypes)>=0) { |
| | | if (props.mimetype == 'text/html') |
| | | qstring += '&_safe=1'; |
| | | this.attachment_win = window.open(this.env.comm_path+'&_action=get&'+qstring+'&_frame=1', 'rcubemailattachment'); |
| | |
| | | // reset quicksearch |
| | | case 'reset-search': |
| | | var n, s = this.env.search_request || this.env.qsearch; |
| | | |
| | | this.reset_qsearch(); |
| | | this.select_all_mode = false; |
| | | |
| | | if (s && this.env.mailbox) |
| | | this.list_mailbox(this.env.mailbox); |
| | | this.list_mailbox(this.env.mailbox, 1); |
| | | else if (s && this.task == 'addressbook') { |
| | | if (this.env.source == '') { |
| | | for (n in this.env.address_sources) break; |
| | | this.env.source = n; |
| | | this.env.group = ''; |
| | | } |
| | | this.list_contacts(this.env.source, this.env.group); |
| | | this.list_contacts(this.env.source, this.env.group, 1); |
| | | } |
| | | break; |
| | | |
| | |
| | | this.drag_menu = function(e, target) |
| | | { |
| | | var modkey = rcube_event.get_modifier(e), |
| | | menu = $('#'+this.gui_objects.message_dragmenu); |
| | | menu = this.gui_objects.message_dragmenu; |
| | | |
| | | if (menu && modkey == SHIFT_KEY && this.commands['copy']) { |
| | | var pos = rcube_event.get_mouse_pos(e); |
| | | this.env.drag_target = target; |
| | | menu.css({top: (pos.y-10)+'px', left: (pos.x-10)+'px'}).show(); |
| | | $(menu).css({top: (pos.y-10)+'px', left: (pos.x-10)+'px'}).show(); |
| | | return true; |
| | | } |
| | | |
| | |
| | | |
| | | this.drag_menu_action = function(action) |
| | | { |
| | | var menu = $('#'+this.gui_objects.message_dragmenu); |
| | | var menu = this.gui_objects.message_dragmenu; |
| | | if (menu) { |
| | | menu.hide(); |
| | | $(menu).hide(); |
| | | } |
| | | this.command(action, this.env.drag_target); |
| | | this.env.drag_target = null; |
| | |
| | | |
| | | this.expunge_mailbox = function(mbox) |
| | | { |
| | | var lock = false, |
| | | url = '_mbox='+urlencode(mbox); |
| | | var lock, url = '_mbox='+urlencode(mbox); |
| | | |
| | | // lock interface if it's the active mailbox |
| | | if (mbox == this.env.mailbox) { |
| | | lock = this.set_busy(true, 'loading'); |
| | | url += '&_reload=1'; |
| | | } |
| | | lock = this.set_busy(true, 'loading'); |
| | | url += '&_reload=1'; |
| | | if (this.env.search_request) |
| | | url += '&_search='+this.env.search_request; |
| | | } |
| | | |
| | | // send request to server |
| | | this.http_post('expunge', url, lock); |
| | |
| | | return false; |
| | | |
| | | // get file input field, count files on capable browser |
| | | var field = $('input[type=file]', form).get(0), |
| | | var i, size = 0, field = $('input[type=file]', form).get(0), |
| | | files = field.files ? field.files.length : field.value ? 1 : 0; |
| | | |
| | | // create hidden iframe and post upload form |
| | | if (files) { |
| | | // check file size |
| | | if (field.files && this.env.max_filesize && this.env.filesizeerror) { |
| | | for (i=0; i<files; i++) |
| | | size += field.files[i].size; |
| | | if (size && size > this.env.max_filesize) { |
| | | this.display_message(this.env.filesizeerror, 'error'); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | var frame_name = this.async_upload_form(form, 'upload', function(e) { |
| | | var d, content = ''; |
| | | try { |
| | |
| | | |
| | | case 27: // escape |
| | | this.ksearch_hide(); |
| | | break; |
| | | return; |
| | | |
| | | case 37: // left |
| | | case 39: // right |
| | |
| | | var old_value = this.ksearch_value; |
| | | this.ksearch_value = q; |
| | | |
| | | this.ksearch_destroy(); |
| | | |
| | | // ...string is empty |
| | | if (!q.length) |
| | | return; |
| | |
| | | // ...new search value contains old one and previous search result was empty |
| | | if (old_value && old_value.length && this.env.contacts && !this.env.contacts.length && q.indexOf(old_value) == 0) |
| | | return; |
| | | |
| | | this.ksearch_destroy(); |
| | | |
| | | var i, lock, source, xhr, reqid = new Date().getTime(), |
| | | threads = props && props.threads ? props.threads : 1, |
| | |
| | | li.innerHTML = text.replace(new RegExp('('+RegExp.escape(s_val)+')', 'ig'), '##$1%%').replace(/</g, '<').replace(/>/g, '>').replace(/##([^%]+)%%/g, '<b>$1</b>'); |
| | | li.onmouseover = function(){ ref.ksearch_select(this); }; |
| | | li.onmouseup = function(){ ref.ksearch_click(this) }; |
| | | li._rcm_id = i; |
| | | li._rcm_id = this.env.contacts.length + i; |
| | | ul.appendChild(li); |
| | | maxlen -= 1; |
| | | } |
| | |
| | | }; |
| | | |
| | | // update a contact record in the list |
| | | this.update_contact_row = function(cid, cols_arr, newcid) |
| | | this.update_contact_row = function(cid, cols_arr, newcid, source) |
| | | { |
| | | var c, row, list = this.contact_list; |
| | | |
| | | cid = String(cid).replace(this.identifier_expr, '_'); |
| | | |
| | | // when in searching mode, concat cid with the source name |
| | | if (!list.rows[cid]) { |
| | | cid = cid+'-'+source; |
| | | if (newcid) |
| | | newcid = newcid+'-'+source; |
| | | } |
| | | |
| | | if (list.rows[cid] && (row = list.rows[cid].obj)) { |
| | | for (c=0; c<cols_arr.length; c++) |
| | |
| | | this.set_photo_actions = function(id) |
| | | { |
| | | var n, buttons = this.buttons['upload-photo']; |
| | | for (n=0; n < buttons.length; n++) |
| | | for (n=0; buttons && n < buttons.length; n++) |
| | | $('#'+buttons[n].id).html(this.get_label(id == '-del-' ? 'addphoto' : 'replacephoto')); |
| | | |
| | | $('#ff_photo').val(id); |
| | |
| | | /********* GUI functionality *********/ |
| | | /*********************************************************/ |
| | | |
| | | var init_button = function(cmd, prop) |
| | | { |
| | | var elm = document.getElementById(prop.id); |
| | | if (!elm) |
| | | return; |
| | | |
| | | var preload = false; |
| | | if (prop.type == 'image') { |
| | | elm = elm.parentNode; |
| | | preload = true; |
| | | } |
| | | |
| | | elm._command = cmd; |
| | | elm._id = prop.id; |
| | | if (prop.sel) { |
| | | elm.onmousedown = function(e){ return rcmail.button_sel(this._command, this._id); }; |
| | | elm.onmouseup = function(e){ return rcmail.button_out(this._command, this._id); }; |
| | | if (preload) |
| | | new Image().src = prop.sel; |
| | | } |
| | | if (prop.over) { |
| | | elm.onmouseover = function(e){ return rcmail.button_over(this._command, this._id); }; |
| | | elm.onmouseout = function(e){ return rcmail.button_out(this._command, this._id); }; |
| | | if (preload) |
| | | new Image().src = prop.over; |
| | | } |
| | | }; |
| | | |
| | | // enable/disable buttons for page shifting |
| | | this.set_page_buttons = function() |
| | | { |
| | |
| | | continue; |
| | | |
| | | for (var i=0; i< this.buttons[cmd].length; i++) { |
| | | var prop = this.buttons[cmd][i]; |
| | | var elm = document.getElementById(prop.id); |
| | | if (!elm) |
| | | continue; |
| | | |
| | | var preload = false; |
| | | if (prop.type == 'image') { |
| | | elm = elm.parentNode; |
| | | preload = true; |
| | | } |
| | | |
| | | elm._command = cmd; |
| | | elm._id = prop.id; |
| | | if (prop.sel) { |
| | | elm.onmousedown = function(e){ return rcmail.button_sel(this._command, this._id); }; |
| | | elm.onmouseup = function(e){ return rcmail.button_out(this._command, this._id); }; |
| | | if (preload) |
| | | new Image().src = prop.sel; |
| | | } |
| | | if (prop.over) { |
| | | elm.onmouseover = function(e){ return rcmail.button_over(this._command, this._id); }; |
| | | elm.onmouseout = function(e){ return rcmail.button_out(this._command, this._id); }; |
| | | if (preload) |
| | | new Image().src = prop.over; |
| | | } |
| | | init_button(cmd, this.buttons[cmd][i]); |
| | | } |
| | | } |
| | | }; |
| | |
| | | var base = this.env.comm_path; |
| | | |
| | | // overwrite task name |
| | | if (query._action.match(/([a-z]+)\/([a-z-_]+)/)) { |
| | | if (query._action.match(/([a-z]+)\/([a-z-_.]+)/)) { |
| | | query._action = RegExp.$2; |
| | | base = base.replace(/\_task=[a-z]+/, '_task='+RegExp.$1); |
| | | } |
| | |
| | | if (r.request) |
| | | r.request.abort(); |
| | | if (r.lock) |
| | | this.set_busy(r.lock, false); |
| | | this.set_busy(false, null, r.lock); |
| | | }; |
| | | |
| | | // handle HTTP response |
| | |
| | | // handle upload errors, parsing iframe content in onload |
| | | $(frame_name).bind('load', {ts:ts}, onload); |
| | | |
| | | form.target = frame_name; |
| | | form.action = this.url(action, { _id:this.env.compose_id||'', _uploadid:ts }); |
| | | form.setAttribute('method', 'POST'); |
| | | form.setAttribute('enctype', 'multipart/form-data'); |
| | | form.submit(); |
| | | $(form).attr({ |
| | | target: frame_name, |
| | | action: this.url(action, { _id:this.env.compose_id||'', _uploadid:ts }), |
| | | method: 'POST'}) |
| | | .attr(form.encoding ? 'encoding' : 'enctype', 'multipart/form-data') |
| | | .submit(); |
| | | |
| | | return frame_name; |
| | | }; |