| | |
| | | |
| | | function rcube_webmail() |
| | | { |
| | | this.env = new Object(); |
| | | this.labels = new Object(); |
| | | this.buttons = new Object(); |
| | | this.buttons_sel = 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(); |
| | | this.env = {}; |
| | | this.labels = {}; |
| | | this.buttons = {}; |
| | | this.buttons_sel = {}; |
| | | this.gui_objects = {}; |
| | | this.gui_containers = {}; |
| | | this.commands = {}; |
| | | this.command_handlers = {}; |
| | | this.onloads = []; |
| | | |
| | | // create protected reference to myself |
| | | this.ref = 'rcmail'; |
| | |
| | | // 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'); |
| | | 'application/x-javascript', 'application/pdf', 'application/x-shockwave-flash'); |
| | | |
| | | // default environment vars |
| | | this.env.keep_alive = 60; // seconds |
| | |
| | | this.env.blankpage = 'program/blank.gif'; |
| | | |
| | | // set jQuery ajax options |
| | | jQuery.ajaxSetup({ |
| | | $.ajaxSetup({ |
| | | cache:false, |
| | | error:function(request, status, err){ ref.http_error(request, status, err); }, |
| | | beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Request', ref.env.request_token); } |
| | |
| | | this.register_button = function(command, id, type, act, sel, over) |
| | | { |
| | | if (!this.buttons[command]) |
| | | this.buttons[command] = new Array(); |
| | | this.buttons[command] = []; |
| | | |
| | | var button_prop = {id:id, type:type}; |
| | | if (act) button_prop.act = act; |
| | |
| | | if (this.env.permaurl) |
| | | this.enable_command('permaurl', true); |
| | | |
| | | switch (this.task) |
| | | { |
| | | switch (this.task) { |
| | | |
| | | case 'mail': |
| | | // enable mail commands |
| | | this.enable_command('list', 'checkmail', 'compose', 'add-contact', 'search', 'reset-search', 'collapse-folder', true); |
| | | |
| | | if (this.gui_objects.messagelist) |
| | | { |
| | | if (this.gui_objects.messagelist) { |
| | | |
| | | this.message_list = new rcube_list_widget(this.gui_objects.messagelist, |
| | | {multiselect:true, multiexpand:true, draggable:true, keyboard:true, dblclick_time:this.dblclick_time}); |
| | | this.message_list.row_init = function(o){ p.init_message_row(o); }; |
| | |
| | | if (this.gui_objects.folderlist) |
| | | this.env.contactfolders = $.extend($.extend({}, this.env.address_sources), this.env.contactgroups); |
| | | |
| | | if (this.gui_objects.contactslist) |
| | | { |
| | | if (this.gui_objects.contactslist) { |
| | | |
| | | this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, |
| | | {multiselect:true, draggable:this.gui_objects.folderlist?true:false, keyboard:true}); |
| | | this.contact_list.row_init = function(row){ p.triggerEvent('insertrow', { cid:row.uid, row:row }); }; |
| | |
| | | return false; |
| | | |
| | | // command not supported or allowed |
| | | if (!this.commands[command]) |
| | | { |
| | | if (!this.commands[command]) { |
| | | // pass command to parent window |
| | | if (this.env.framed && parent.rcmail && parent.rcmail.command) |
| | | parent.rcmail.command(command, props); |
| | |
| | | } |
| | | |
| | | // check input before leaving compose step |
| | | if (this.task=='mail' && this.env.action=='compose' && (command=='list' || command=='mail' || command=='addressbook' || command=='settings')) |
| | | { |
| | | if (this.task=='mail' && this.env.action=='compose' |
| | | && (command == 'list' || command == 'mail' || command == 'addressbook' || command == 'settings')) { |
| | | if (this.cmp_hash != this.compose_field_hash() && !confirm(this.get_label('notsentwarning'))) |
| | | return false; |
| | | } |
| | | |
| | | // process external commands |
| | | if (typeof this.command_handlers[command] == 'function') |
| | | { |
| | | if (typeof this.command_handlers[command] == 'function') { |
| | | var ret = this.command_handlers[command](props, obj); |
| | | return ret !== null ? ret : (obj ? false : true); |
| | | } |
| | | else if (typeof this.command_handlers[command] == 'string') |
| | | { |
| | | else if (typeof this.command_handlers[command] == 'string') { |
| | | var ret = window[this.command_handlers[command]](props, obj); |
| | | return ret !== null ? ret : (obj ? false : true); |
| | | } |
| | |
| | | } |
| | | |
| | | // process internal command |
| | | switch (command) |
| | | { |
| | | switch (command) { |
| | | |
| | | case 'login': |
| | | if (this.gui_objects.loginform) |
| | | this.gui_objects.loginform.submit(); |
| | |
| | | |
| | | case 'save-identity': |
| | | case 'save': |
| | | if (this.gui_objects.editform) |
| | | { |
| | | if (this.gui_objects.editform) { |
| | | var input_pagesize = $("input[name='_pagesize']"); |
| | | var input_name = $("input[name='_name']"); |
| | | var input_email = $("input[name='_email']"); |
| | | |
| | | // user prefs |
| | | if (input_pagesize.length && isNaN(parseInt(input_pagesize.val()))) |
| | | { |
| | | if (input_pagesize.length && isNaN(parseInt(input_pagesize.val()))) { |
| | | alert(this.get_label('nopagesizewarning')); |
| | | input_pagesize.focus(); |
| | | break; |
| | | } |
| | | // contacts/identities |
| | | else |
| | | { |
| | | if (input_name.length && input_name.val() == '') |
| | | { |
| | | else { |
| | | if (input_name.length && input_name.val() == '') { |
| | | alert(this.get_label('nonamewarning')); |
| | | input_name.focus(); |
| | | break; |
| | | } |
| | | else if (input_email.length && !rcube_check_email(input_email.val())) |
| | | { |
| | | else if (input_email.length && !rcube_check_email(input_email.val())) { |
| | | alert(this.get_label('noemailwarning')); |
| | | input_email.focus(); |
| | | break; |
| | |
| | | if (props && !props._row) |
| | | break; |
| | | |
| | | var uid; |
| | | var flag = 'read'; |
| | | var uid, flag = 'read'; |
| | | |
| | | if (props._row.uid) { |
| | | uid = props._row.uid; |
| | |
| | | if (props && !props._row) |
| | | break; |
| | | |
| | | var uid; |
| | | var flag = 'flagged'; |
| | | var uid, flag = 'flagged'; |
| | | |
| | | if (props._row.uid) { |
| | | uid = props._row.uid; |
| | |
| | | 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 && jQuery.inArray(props.mimetype, this.mimetypes)>=0) { |
| | | if (this.env.uid && props.mimetype && $.inArray(props.mimetype, this.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'); |
| | |
| | | } |
| | | |
| | | // use contact_id passed as command parameter |
| | | var a_cids = new Array(); |
| | | var a_cids = []; |
| | | if (props) |
| | | a_cids[a_cids.length] = props; |
| | | // get selected contacts |
| | |
| | | |
| | | case 'print': |
| | | var uid; |
| | | if (uid = this.get_single_uid()) |
| | | { |
| | | if (uid = this.get_single_uid()) { |
| | | ref.printwin = window.open(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : '')); |
| | | if (this.printwin) |
| | | { |
| | | if (this.printwin) { |
| | | window.setTimeout(function(){ ref.printwin.focus(); }, 20); |
| | | if (this.env.action != 'show') |
| | | this.mark_message('read', uid); |
| | |
| | | |
| | | case 'viewsource': |
| | | var uid; |
| | | if (uid = this.get_single_uid()) |
| | | { |
| | | if (uid = this.get_single_uid()) { |
| | | 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); |
| | |
| | | case 'search': |
| | | if (!props && this.gui_objects.qsearchbox) |
| | | props = this.gui_objects.qsearchbox.value; |
| | | if (props) |
| | | { |
| | | if (props) { |
| | | this.qsearch(props); |
| | | break; |
| | | } |
| | |
| | | this.enable_command = function() |
| | | { |
| | | var args = arguments; |
| | | if(!args.length) return -1; |
| | | if (!args.length) |
| | | return -1; |
| | | |
| | | var command; |
| | | var enable = args[args.length-1]; |
| | | var command, enable = args[args.length-1]; |
| | | |
| | | for(var n=0; n<args.length-1; n++) |
| | | { |
| | | for (var n=0; n<args.length-1; n++) { |
| | | command = args[n]; |
| | | this.commands[command] = enable; |
| | | this.set_button(command, (enable ? 'act' : 'pas')); |
| | |
| | | // lock/unlock interface |
| | | this.set_busy = function(a, message) |
| | | { |
| | | if (a && message) |
| | | { |
| | | if (a && message) { |
| | | var msg = this.get_label(message); |
| | | if (msg==message) |
| | | msg = 'Loading...'; |
| | |
| | | |
| | | this.drag_menu = function(e, target) |
| | | { |
| | | var modkey = rcube_event.get_modifier(e); |
| | | var menu = $('#'+this.gui_objects.message_dragmenu); |
| | | var modkey = rcube_event.get_modifier(e), |
| | | menu = $('#'+this.gui_objects.message_dragmenu); |
| | | |
| | | if (menu && modkey == SHIFT_KEY && this.commands['copy']) { |
| | | var pos = rcube_event.get_mouse_pos(e); |
| | |
| | | pos = list.offset(); |
| | | this.env.folderlist_coords = { x1:pos.left, y1:pos.top, x2:pos.left + list.width(), y2:pos.top + list.height() }; |
| | | |
| | | this.env.folder_coords = new Array(); |
| | | this.env.folder_coords = []; |
| | | for (var k in model) { |
| | | if (li = this.get_folder_li(k)) { |
| | | // only visible folders |
| | |
| | | var boffset = bw.ie ? -document.documentElement.scrollTop : this.initialBodyScrollTop; |
| | | var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop; |
| | | var toffset = -moffset-boffset; |
| | | |
| | | var li, div, pos, mouse; |
| | | |
| | | mouse = rcube_event.get_mouse_pos(e); |
| | | pos = this.env.folderlist_coords; |
| | | mouse.y += toffset; |
| | |
| | | |
| | | this.collapse_folder = function(id) |
| | | { |
| | | var li = this.get_folder_li(id); |
| | | var div = $(li.getElementsByTagName('div')[0]); |
| | | var li = this.get_folder_li(id), |
| | | div = $(li.getElementsByTagName('div')[0]); |
| | | |
| | | if (!div || (!div.hasClass('collapsed') && !div.hasClass('expanded'))) |
| | | return; |
| | | |
| | | var ul = $(li.getElementsByTagName('ul')[0]); |
| | | |
| | | if (div.hasClass('collapsed')) { |
| | | ul.show(); |
| | | div.removeClass('collapsed').addClass('expanded'); |
| | |
| | | |
| | | this.init_message_row = function(row) |
| | | { |
| | | var self = this; |
| | | var uid = row.uid; |
| | | var self = this, uid = row.uid; |
| | | |
| | | if (uid && this.env.messages[uid]) |
| | | $.extend(row, this.env.messages[uid]); |
| | |
| | | else |
| | | var tbody = this.gui_objects.messagelist.tBodies[0]; |
| | | |
| | | var rows = this.message_list.rows; |
| | | var rowcount = tbody.rows.length; |
| | | var even = rowcount%2; |
| | | |
| | | if (!this.env.messages[uid]) |
| | | this.env.messages[uid] = {}; |
| | | |
| | |
| | | parent_uid: flags.parent_uid |
| | | }); |
| | | |
| | | var message = this.env.messages[uid]; |
| | | |
| | | var css_class = 'message' |
| | | var tree = expando = '', |
| | | rows = this.message_list.rows, |
| | | rowcount = tbody.rows.length, |
| | | even = rowcount%2, |
| | | message = this.env.messages[uid], |
| | | css_class = 'message' |
| | | + (even ? ' even' : ' odd') |
| | | + (flags.unread ? ' unread' : '') |
| | | + (flags.deleted ? ' deleted' : '') |
| | | + (flags.flagged ? ' flagged' : '') |
| | | + (flags.unread_children && !flags.unread && !this.env.autoexpand_threads ? ' unroot' : '') |
| | | + (this.message_list.in_selection(uid) ? ' selected' : ''); |
| | | |
| | | + (this.message_list.in_selection(uid) ? ' selected' : ''), |
| | | // for performance use DOM instead of jQuery here |
| | | var row = document.createElement('tr'); |
| | | row = document.createElement('tr'), |
| | | col = document.createElement('td'); |
| | | |
| | | row.id = 'rcmrow'+uid; |
| | | row.className = css_class; |
| | | |
| | | // message status icon |
| | | var icon = this.env.messageicon; |
| | | if (!flags.unread && flags.unread_children > 0 && this.env.unreadchildrenicon) |
| | | icon = this.env.unreadchildrenicon; |
| | |
| | | else if(flags.unread && this.env.unreadicon) |
| | | icon = this.env.unreadicon; |
| | | |
| | | var tree = expando = ''; |
| | | |
| | | // threads |
| | | if (this.env.threading) { |
| | | // This assumes that div width is hardcoded to 15px, |
| | | var width = message.depth * 15; |
| | |
| | | tree += icon ? '<img id="msgicn'+uid+'" src="'+icon+'" alt="" class="msgicon" />' : ''; |
| | | |
| | | // first col is always there |
| | | var col = document.createElement('td'); |
| | | col.className = 'threads'; |
| | | col.innerHTML = expando; |
| | | row.appendChild(col); |
| | |
| | | case 1: this.message_list.expand_all(); break; |
| | | } |
| | | // this.message_list.expand(null); |
| | | } |
| | | }; |
| | | |
| | | // update parent in a thread |
| | | this.update_thread_root = function(uid, flag) |
| | |
| | | var row = rows[uid] |
| | | var depth = rows[uid].depth; |
| | | var r, parent, count = 0; |
| | | var roots = new Array(); |
| | | var roots = []; |
| | | |
| | | if (!row.depth) // root message: decrease roots count |
| | | count--; |
| | |
| | | return; |
| | | |
| | | var add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : ''); |
| | | var a_uids = new Array(); |
| | | var a_uids = []; |
| | | |
| | | if (this.env.uid) |
| | | a_uids[0] = this.env.uid; |
| | |
| | | // delete selected messages from the current mailbox |
| | | this.delete_messages = function() |
| | | { |
| | | var selection = this.message_list ? $.merge([], this.message_list.get_selection()) : new Array(); |
| | | var selection = this.message_list ? $.merge([], this.message_list.get_selection()) : []; |
| | | |
| | | // exit if no mailbox specified or if selection is empty |
| | | if (!this.env.uid && !selection.length) |
| | |
| | | // @private |
| | | this._with_selected_messages = function(action, lock, add_url) |
| | | { |
| | | var a_uids = new Array(), |
| | | count = 0; |
| | | var a_uids = [], count = 0; |
| | | |
| | | if (this.env.uid) |
| | | a_uids[0] = this.env.uid; |
| | |
| | | // set a specific flag to one or more messages |
| | | this.mark_message = function(flag, uid) |
| | | { |
| | | var a_uids = new Array(), |
| | | r_uids = new Array(), |
| | | selection = this.message_list ? this.message_list.get_selection() : new Array(); |
| | | var a_uids = [], r_uids = [], |
| | | selection = this.message_list ? this.message_list.get_selection() : []; |
| | | |
| | | if (uid) |
| | | a_uids[0] = uid; |
| | |
| | | // mark all message rows as deleted/undeleted |
| | | this.toggle_delete_status = function(a_uids) |
| | | { |
| | | var rows = this.message_list ? this.message_list.rows : new Array(); |
| | | var rows = this.message_list ? this.message_list.rows : []; |
| | | |
| | | if (a_uids.length==1) |
| | | { |
| | | if (a_uids.length==1) { |
| | | if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted)) |
| | | this.flag_as_deleted(a_uids); |
| | | else |
| | |
| | | } |
| | | |
| | | var all_deleted = true; |
| | | for (var uid, i=0; i<a_uids.length; i++) |
| | | { |
| | | for (var uid, i=0; i<a_uids.length; i++) { |
| | | uid = a_uids[i]; |
| | | if (rows[uid] && !rows[uid].deleted) { |
| | | all_deleted = false; |
| | |
| | | this.flag_as_deleted = function(a_uids) |
| | | { |
| | | var add_url = '', |
| | | r_uids = new Array(), |
| | | rows = this.message_list ? this.message_list.rows : new Array(), |
| | | r_uids = [], |
| | | rows = this.message_list ? this.message_list.rows : [], |
| | | count = 0; |
| | | |
| | | for (var i=0; i<a_uids.length; i++) { |
| | |
| | | this.flag_deleted_as_read = function(uids) |
| | | { |
| | | var icn_src, uid, |
| | | rows = this.message_list ? this.message_list.rows : new Array(), |
| | | rows = this.message_list ? this.message_list.rows : [], |
| | | str = String(uids), |
| | | a_uids = str.split(','); |
| | | |
| | |
| | | var add_url = ''; |
| | | |
| | | // lock interface if it's the active mailbox |
| | | if (mbox == this.env.mailbox) |
| | | { |
| | | if (mbox == this.env.mailbox) { |
| | | lock = true; |
| | | this.set_busy(true, 'loading'); |
| | | add_url = '&_reload=1'; |
| | |
| | | return false; |
| | | |
| | | // lock interface if it's the active mailbox |
| | | if (mbox == this.env.mailbox) |
| | | { |
| | | if (mbox == this.env.mailbox) { |
| | | lock = true; |
| | | this.set_busy(true, 'loading'); |
| | | add_url = '&_reload=1'; |
| | |
| | | if (this.env.search_mods) { |
| | | var mods = this.env.search_mods[this.env.mailbox] ? this.env.search_mods[this.env.mailbox] : this.env.search_mods['*']; |
| | | if (mods) { |
| | | var head_arr = new Array(); |
| | | var head_arr = []; |
| | | for (var n in mods) |
| | | head_arr.push(n); |
| | | addurl += '&_headers='+head_arr.join(','); |
| | |
| | | var key = rcube_event.get_keycode(e); |
| | | var mod = rcube_event.get_modifier(e); |
| | | |
| | | switch (key) |
| | | { |
| | | switch (key) { |
| | | case 38: // key up |
| | | case 40: // key down |
| | | if (!this.ksearch_pane) |
| | |
| | | |
| | | this.ksearch_value = ''; |
| | | this.ksearch_input = null; |
| | | |
| | | this.ksearch_hide(); |
| | | }; |
| | | |
| | |
| | | if (page && this.current_page == page && src == this.env.source && group == this.env.group) |
| | | return false; |
| | | |
| | | if (src != this.env.source) |
| | | { |
| | | if (src != this.env.source) { |
| | | page = 1; |
| | | this.env.current_page = page; |
| | | this.reset_qsearch(); |
| | |
| | | this.env.group = group; |
| | | |
| | | // load contacts remotely |
| | | if (this.gui_objects.contactslist) |
| | | { |
| | | if (this.gui_objects.contactslist) { |
| | | this.list_contacts_remote(src, group, page); |
| | | return; |
| | | } |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) |
| | | { |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | target = window.frames[this.env.contentframe]; |
| | | add_url = '&_framed=1'; |
| | | } |
| | |
| | | { |
| | | var add_url = ''; |
| | | var target = window; |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) |
| | | { |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | add_url = '&_framed=1'; |
| | | target = window.frames[this.env.contentframe]; |
| | | this.show_contentframe(true); |
| | |
| | | else if (framed) |
| | | return false; |
| | | |
| | | if (action && (cid || action=='add') && !this.drag_active) |
| | | { |
| | | if (action && (cid || action=='add') && !this.drag_active) { |
| | | this.set_busy(true); |
| | | target.location.href = this.env.comm_path+'&_action='+action+'&_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group)+'&_cid='+urlencode(cid) + add_url; |
| | | } |
| | |
| | | if (!(selection.length || this.env.cid) || (!this.env.group && !confirm(this.get_label('deletecontactconfirm')))) |
| | | return; |
| | | |
| | | var a_cids = new Array(); |
| | | var qs = ''; |
| | | var a_cids = [], qs = ''; |
| | | |
| | | if (this.env.cid) |
| | | a_cids[a_cids.length] = this.env.cid; |
| | | else |
| | | { |
| | | else { |
| | | var id; |
| | | for (var n=0; n<selection.length; n++) |
| | | { |
| | | for (var n=0; n<selection.length; n++) { |
| | | id = selection[n]; |
| | | a_cids[a_cids.length] = id; |
| | | this.contact_list.remove_row(id, (n == selection.length-1)); |
| | |
| | | if (!this.gui_objects.contactslist || !this.gui_objects.contactslist.tBodies[0]) |
| | | return false; |
| | | |
| | | var tbody = this.gui_objects.contactslist.tBodies[0]; |
| | | var rowcount = tbody.rows.length; |
| | | var even = rowcount%2; |
| | | var tbody = this.gui_objects.contactslist.tBodies[0], |
| | | rowcount = tbody.rows.length, |
| | | even = rowcount%2, |
| | | row = document.createElement('tr'); |
| | | |
| | | var row = document.createElement('tr'); |
| | | row.id = 'rcmrow'+cid; |
| | | row.className = 'contact '+(even ? 'even' : 'odd'); |
| | | |
| | |
| | | { |
| | | this.reset_add_input(); |
| | | |
| | | var key = 'G'+id; |
| | | var link, li = this.get_folder_li(key); |
| | | var key = 'G'+id, link, li = this.get_folder_li(key); |
| | | |
| | | if (li && (link = li.firstChild) && link.tagName.toLowerCase() == 'a') |
| | | link.innerHTML = name; |
| | | |
| | |
| | | this.subscription_list.addEventListener('select', function(o){ p.subscription_select(o); }); |
| | | this.subscription_list.addEventListener('dragstart', function(o){ p.drag_active = true; }); |
| | | this.subscription_list.addEventListener('dragend', function(o){ p.subscription_move_folder(o); }); |
| | | this.subscription_list.row_init = function (row) |
| | | { |
| | | this.subscription_list.row_init = function (row) { |
| | | var anchors = row.obj.getElementsByTagName('a'); |
| | | if (anchors[0]) |
| | | anchors[0].onclick = function() { p.rename_folder(row.id); return false; }; |
| | |
| | | anchors[1].onclick = function() { p.delete_folder(row.id); return false; }; |
| | | row.obj.onmouseover = function() { p.focus_subscription(row.id); }; |
| | | row.obj.onmouseout = function() { p.unfocus_subscription(row.id); }; |
| | | } |
| | | }; |
| | | this.subscription_list.init(); |
| | | } |
| | | }; |
| | | |
| | | // preferences section select and load options frame |
| | | this.section_select = function(list) |
| | |
| | | var id = list.get_single_selection(); |
| | | |
| | | if (id) { |
| | | var add_url = ''; |
| | | var target = window; |
| | | var add_url = '', target = window; |
| | | this.set_busy(true); |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | |
| | | if (action=='edit-identity' && (!id || id==this.env.iid)) |
| | | return false; |
| | | |
| | | var add_url = ''; |
| | | var target = window; |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) |
| | | { |
| | | var add_url = '', target = window; |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | add_url = '&_framed=1'; |
| | | target = window.frames[this.env.contentframe]; |
| | | document.getElementById(this.env.contentframe).style.visibility = 'inherit'; |
| | | } |
| | | |
| | | if (action && (id || action=='add-identity')) |
| | | { |
| | | if (action && (id || action=='add-identity')) { |
| | | this.set_busy(true); |
| | | target.location.href = this.env.comm_path+'&_action='+action+'&_iid='+id+add_url; |
| | | } |
| | | |
| | | return true; |
| | | }; |
| | | |
| | |
| | | |
| | | this.focus_subscription = function(id) |
| | | { |
| | | var row, folder; |
| | | var reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$'); |
| | | var row, folder, |
| | | reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$'); |
| | | |
| | | if (this.drag_active && this.env.folder && (row = document.getElementById(id))) |
| | | if (this.env.subscriptionrows[id] && |
| | | (folder = this.env.subscriptionrows[id][0])) |
| | | { |
| | | (folder = this.env.subscriptionrows[id][0])) { |
| | | if (this.check_droptarget(folder) && |
| | | !this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2] && |
| | | (folder != this.env.folder.replace(reg, '')) && |
| | | (!folder.match(new RegExp('^'+RegExp.escape(this.env.folder+this.env.delimiter))))) |
| | | { |
| | | (!folder.match(new RegExp('^'+RegExp.escape(this.env.folder+this.env.delimiter))))) { |
| | | this.set_env('dstfolder', folder); |
| | | $(row).addClass('droptarget'); |
| | | } |
| | | } |
| | | else if (this.env.folder.match(new RegExp(RegExp.escape(this.env.delimiter)))) |
| | | { |
| | | else if (this.env.folder.match(new RegExp(RegExp.escape(this.env.delimiter)))) { |
| | | this.set_env('dstfolder', this.env.delimiter); |
| | | $(this.subscription_list.frame).addClass('droptarget'); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | this.unfocus_subscription = function(id) |
| | | { |
| | | var row = $('#'+id); |
| | | |
| | | this.set_env('dstfolder', null); |
| | | if (this.env.subscriptionrows[id] && row[0]) |
| | | row.removeClass('droptarget'); |
| | | else |
| | | $(this.subscription_list.frame).removeClass('droptarget'); |
| | | } |
| | | }; |
| | | |
| | | this.subscription_select = function(list) |
| | | { |
| | |
| | | { |
| | | var reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$'); |
| | | if (this.env.folder && this.env.dstfolder && (this.env.dstfolder != this.env.folder) && |
| | | (this.env.dstfolder != this.env.folder.replace(reg, ''))) |
| | | { |
| | | (this.env.dstfolder != this.env.folder.replace(reg, ''))) { |
| | | var reg = new RegExp('[^'+RegExp.escape(this.env.delimiter)+']*['+RegExp.escape(this.env.delimiter)+']', 'g'); |
| | | var basename = this.env.folder.replace(reg, ''); |
| | | var newname = this.env.dstfolder==this.env.delimiter ? basename : this.env.dstfolder+this.env.delimiter+basename; |
| | |
| | | this.reset_folder_rename(); |
| | | |
| | | var form; |
| | | if ((form = this.gui_objects.editform) && form.elements['_folder_name']) |
| | | { |
| | | if ((form = this.gui_objects.editform) && form.elements['_folder_name']) { |
| | | name = form.elements['_folder_name'].value; |
| | | |
| | | if (name.indexOf(this.env.delimiter)>=0) |
| | | { |
| | | if (name.indexOf(this.env.delimiter)>=0) { |
| | | alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')'); |
| | | return false; |
| | | } |
| | |
| | | var temp, row, form; |
| | | |
| | | // reset current renaming |
| | | if (temp = this.edit_folder) |
| | | { |
| | | if (temp = this.edit_folder) { |
| | | this.reset_folder_rename(); |
| | | if (temp == id) |
| | | return; |
| | | } |
| | | |
| | | if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id))) |
| | | { |
| | | if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id))) { |
| | | var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']'); |
| | | this.name_input = document.createElement('input'); |
| | | this.name_input.type = 'text'; |
| | |
| | | var key = rcube_event.get_keycode(e); |
| | | |
| | | // enter |
| | | if (key==13) |
| | | { |
| | | if (key==13) { |
| | | var newname = this.name_input ? this.name_input.value : null; |
| | | if (this.edit_folder && newname) |
| | | { |
| | | if (newname.indexOf(this.env.delimiter)>=0) |
| | | { |
| | | if (this.edit_folder && newname) { |
| | | if (newname.indexOf(this.env.delimiter)>=0) { |
| | | alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')'); |
| | | return false; |
| | | } |
| | |
| | | if (this.edit_folder) |
| | | this.reset_folder_rename(); |
| | | |
| | | if (folder && confirm(this.get_label('deletefolderconfirm'))) |
| | | { |
| | | if (folder && confirm(this.get_label('deletefolderconfirm'))) { |
| | | this.set_busy(true, 'folderdeleting'); |
| | | this.http_post('delete-folder', '_mboxes='+urlencode(folder), true); |
| | | this.set_env('folder', null); |
| | |
| | | |
| | | // find not protected folder |
| | | var refid; |
| | | for (var rid in this.env.subscriptionrows) |
| | | for (var rid in this.env.subscriptionrows) { |
| | | if (this.env.subscriptionrows[rid]!=null && !this.env.subscriptionrows[rid][2]) { |
| | | refid = rid; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | var refrow, form; |
| | | var tbody = this.gui_objects.subscriptionlist.tBodies[0]; |
| | | var id = 'rcmrow'+(tbody.childNodes.length+1); |
| | | var selection = this.subscription_list.get_single_selection(); |
| | | var refrow, form, |
| | | tbody = this.gui_objects.subscriptionlist.tBodies[0], |
| | | id = 'rcmrow'+(tbody.childNodes.length+1), |
| | | selection = this.subscription_list.get_single_selection(); |
| | | |
| | | if (replace && replace.id) |
| | | { |
| | | if (replace && replace.id) { |
| | | id = replace.id; |
| | | refid = replace.id; |
| | | } |
| | | |
| | | if (!id || !refid || !(refrow = document.getElementById(refid))) |
| | | { |
| | | if (!id || !refid || !(refrow = document.getElementById(refid))) { |
| | | // Refresh page if we don't have a table row to clone |
| | | this.goto_url('folders'); |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | else { |
| | | // clone a table row if there are existing rows |
| | | var row = this.clone_table_row(refrow); |
| | | row.id = id; |
| | |
| | | if (!replace) |
| | | row.cells[1].innerHTML = '*'; |
| | | |
| | | if (!replace && row.cells[2] && row.cells[2].firstChild.tagName.toLowerCase()=='input') |
| | | { |
| | | if (!replace && row.cells[2] && row.cells[2].firstChild.tagName.toLowerCase()=='input') { |
| | | row.cells[2].firstChild.value = name; |
| | | row.cells[2].firstChild.checked = true; |
| | | } |
| | | |
| | | // add new folder to rename-folder list and clear input field |
| | | if (!replace && (form = this.gui_objects.editform)) |
| | | { |
| | | if (!replace && (form = this.gui_objects.editform)) { |
| | | if (form.elements['_folder_oldname']) |
| | | form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name); |
| | | if (form.elements['_folder_name']) |
| | |
| | | // replace an existing table row with a new folder line |
| | | this.replace_folder_row = function(oldfolder, newfolder, display_name, before) |
| | | { |
| | | var id = this.get_folder_row_id(oldfolder); |
| | | var row = document.getElementById(id); |
| | | var form, elm, |
| | | id = this.get_folder_row_id(oldfolder), |
| | | row = document.getElementById(id); |
| | | |
| | | // replace an existing table row (if found) |
| | | this.add_folder_row(newfolder, display_name, row, before); |
| | | |
| | | // rename folder in rename-folder dropdown |
| | | var form, elm; |
| | | if ((form = this.gui_objects.editform) && (elm = form.elements['_folder_oldname'])) |
| | | { |
| | | for (var i=0;i<elm.options.length;i++) |
| | | { |
| | | if (elm.options[i].value == oldfolder) |
| | | { |
| | | if ((form = this.gui_objects.editform) && (elm = form.elements['_folder_oldname'])) { |
| | | for (var i=0; i<elm.options.length; i++) { |
| | | if (elm.options[i].value == oldfolder) { |
| | | elm.options[i].text = display_name; |
| | | elm.options[i].value = newfolder; |
| | | break; |
| | |
| | | // (the row will not be removed, just hidden) |
| | | this.remove_folder_row = function(folder) |
| | | { |
| | | var row; |
| | | var id = this.get_folder_row_id(folder); |
| | | var form, elm, row, id = this.get_folder_row_id(folder); |
| | | |
| | | if (id && (row = document.getElementById(id))) |
| | | row.style.display = 'none'; |
| | | |
| | | // remove folder from rename-folder list |
| | | var form; |
| | | if ((form = this.gui_objects.editform) && form.elements['_folder_oldname']) |
| | | { |
| | | for (var i=0;i<form.elements['_folder_oldname'].options.length;i++) |
| | | { |
| | | if (form.elements['_folder_oldname'].options[i].value == folder) |
| | | { |
| | | form.elements['_folder_oldname'].options[i] = null; |
| | | if ((form = this.gui_objects.editform) && (elm = form.elements['_folder_oldname'])) { |
| | | for (var i=0; i<elm.options.length; i++) { |
| | | if (elm.options[i].value == folder) { |
| | | elm.options[i] = null; |
| | | break; |
| | | } |
| | | } |
| | |
| | | this.http_post('disable-threading', '_mbox='+urlencode(folder)); |
| | | }; |
| | | |
| | | |
| | | // helper method to find a specific mailbox row ID |
| | | this.get_folder_row_id = function(folder) |
| | | { |
| | |
| | | // duplicate a specific table row |
| | | this.clone_table_row = function(row) |
| | | { |
| | | var cell, td; |
| | | var new_row = document.createElement('tr'); |
| | | for(var n=0; n<row.cells.length; n++) |
| | | { |
| | | var cell, td, |
| | | new_row = document.createElement('tr'); |
| | | |
| | | for(var n=0; n<row.cells.length; n++) { |
| | | cell = row.cells[n]; |
| | | td = document.createElement('td'); |
| | | |
| | |
| | | // set button to a specific state |
| | | this.set_button = function(command, state) |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, obj; |
| | | var button, obj, a_buttons = this.buttons[command]; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return false; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | for (var n=0; n<a_buttons.length; n++) { |
| | | button = a_buttons[n]; |
| | | obj = document.getElementById(button.id); |
| | | |
| | |
| | | button.pas = String(obj.className); |
| | | |
| | | // set image according to button state |
| | | if (obj && button.type=='image' && button[state]) |
| | | { |
| | | if (obj && button.type=='image' && button[state]) { |
| | | button.status = state; |
| | | obj.src = button[state]; |
| | | } |
| | | // set class name according to button state |
| | | else if (obj && typeof(button[state])!='undefined') |
| | | { |
| | | else if (obj && typeof(button[state])!='undefined') { |
| | | button.status = state; |
| | | obj.className = button[state]; |
| | | } |
| | | // disable/enable input buttons |
| | | if (obj && button.type=='input') |
| | | { |
| | | if (obj && button.type=='input') { |
| | | button.status = state; |
| | | obj.disabled = !state; |
| | | } |
| | |
| | | return; |
| | | |
| | | var button, obj, link; |
| | | for (var n=0; n<this.buttons[command].length; n++) |
| | | { |
| | | for (var n=0; n<this.buttons[command].length; n++) { |
| | | button = this.buttons[command][n]; |
| | | obj = document.getElementById(button.id); |
| | | |
| | | if (button.type=='image' && obj) |
| | | { |
| | | if (button.type=='image' && obj) { |
| | | obj.setAttribute('alt', this.get_label(label)); |
| | | if ((link = obj.parentNode) && link.tagName.toLowerCase() == 'a') |
| | | link.setAttribute('title', this.get_label(label)); |
| | |
| | | // mouse over button |
| | | this.button_over = function(command, id) |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, elm; |
| | | var button, elm, a_buttons = this.buttons[command]; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return false; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | for (var n=0; n<a_buttons.length; n++) { |
| | | button = a_buttons[n]; |
| | | if(button.id==id && button.status=='act') |
| | | { |
| | | if (button.id == id && button.status == 'act') { |
| | | elm = document.getElementById(button.id); |
| | | if (elm && button.over) { |
| | | if (button.type == 'image') |
| | |
| | | // mouse down on button |
| | | this.button_sel = function(command, id) |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, elm; |
| | | var button, elm, a_buttons = this.buttons[command]; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | for (var n=0; n<a_buttons.length; n++) { |
| | | button = a_buttons[n]; |
| | | if(button.id==id && button.status=='act') |
| | | { |
| | | if (button.id == id && button.status == 'act') { |
| | | elm = document.getElementById(button.id); |
| | | if (elm && button.sel) { |
| | | if (button.type == 'image') |
| | |
| | | // mouse out of button |
| | | this.button_out = function(command, id) |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, elm; |
| | | var button, elm, a_buttons = this.buttons[command]; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | for (var n=0; n<a_buttons.length; n++) { |
| | | button = a_buttons[n]; |
| | | if(button.id==id && button.status=='act') |
| | | { |
| | | if (button.id == id && button.status == 'act') { |
| | | elm = document.getElementById(button.id); |
| | | if (elm && button.act) { |
| | | if (button.type == 'image') |
| | |
| | | { |
| | | if (title && document.title) |
| | | document.title = title; |
| | | } |
| | | }; |
| | | |
| | | // display a system message |
| | | this.display_message = function(msg, type, hold) |
| | | { |
| | | if (!this.loaded) // save message in order to display after page loaded |
| | | { |
| | | if (!this.loaded) { |
| | | // save message in order to display after page loaded |
| | | this.pending_message = new Array(msg, type); |
| | | return true; |
| | | } |
| | |
| | | // mark a mailbox as selected and set environment variable |
| | | this.select_folder = function(name, old, prefix) |
| | | { |
| | | if (this.gui_objects.folderlist) |
| | | { |
| | | if (this.gui_objects.folderlist) { |
| | | var current_li, target_li; |
| | | |
| | | if ((current_li = this.get_folder_li(old, prefix))) { |
| | |
| | | { |
| | | if (!prefix) |
| | | prefix = 'rcmli'; |
| | | if (this.gui_objects.folderlist) |
| | | { |
| | | |
| | | if (this.gui_objects.folderlist) { |
| | | name = String(name).replace(this.identifier_expr, '_'); |
| | | return document.getElementById(prefix+name); |
| | | } |
| | |
| | | } |
| | | |
| | | var cell, col, n; |
| | | for (n=0; thead && n<this.env.coltypes.length; n++) |
| | | { |
| | | for (n=0; thead && n<this.env.coltypes.length; n++) { |
| | | col = this.env.coltypes[n]; |
| | | if ((cell = thead.rows[0].cells[n+1]) && (col=='from' || col=='to')) |
| | | { |
| | | if ((cell = thead.rows[0].cells[n+1]) && (col=='from' || col=='to')) { |
| | | // if we have links for sorting, it's a bit more complicated... |
| | | if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') |
| | | { |
| | | if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') { |
| | | cell.firstChild.innerHTML = this.get_label(this.env.coltypes[n]); |
| | | cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); }; |
| | | cell.firstChild.__col = col; |
| | |
| | | this.env.flagged_col = null; |
| | | |
| | | var found; |
| | | if((found = jQuery.inArray('subject', this.env.coltypes)) >= 0) { |
| | | if((found = $.inArray('subject', this.env.coltypes)) >= 0) { |
| | | this.set_env('subject_col', found); |
| | | if (this.message_list) |
| | | this.message_list.subject_col = found+1; |
| | | } |
| | | if((found = jQuery.inArray('flag', this.env.coltypes)) >= 0) |
| | | if((found = $.inArray('flag', this.env.coltypes)) >= 0) |
| | | this.set_env('flagged_col', found); |
| | | }; |
| | | |
| | |
| | | |
| | | this.env.unread_counts[mbox] = count; |
| | | this.set_unread_count_display(mbox, set_title); |
| | | } |
| | | }; |
| | | |
| | | // update the mailbox count display |
| | | this.set_unread_count_display = function(mbox, set_title) |
| | | { |
| | | var reg, text_obj, item, mycount, childcount, div; |
| | | if (item = this.get_folder_li(mbox)) |
| | | { |
| | | if (item = this.get_folder_li(mbox)) { |
| | | mycount = this.env.unread_counts[mbox] ? this.env.unread_counts[mbox] : 0; |
| | | text_obj = item.getElementsByTagName('a')[0]; |
| | | reg = /\s+\([0-9]+\)$/i; |
| | | |
| | | childcount = 0; |
| | | if ((div = item.getElementsByTagName('div')[0]) && |
| | | div.className.match(/collapsed/)) |
| | | { |
| | | div.className.match(/collapsed/)) { |
| | | // add children's counters |
| | | for (var k in this.env.unread_counts) |
| | | if (k.indexOf(mbox + this.env.delimiter) == 0) |
| | |
| | | |
| | | // set unread count to window title |
| | | reg = /^\([0-9]+\)\s+/i; |
| | | if (set_title && document.title) |
| | | { |
| | | if (set_title && document.title) { |
| | | var doc_title = String(document.title); |
| | | var new_title = ""; |
| | | |
| | |
| | | window.parent.focus(); |
| | | else |
| | | window.focus(); |
| | | } |
| | | }; |
| | | |
| | | this.toggle_prefer_html = function(checkbox) |
| | | { |
| | | var addrbook_show_images; |
| | | if (addrbook_show_images = document.getElementById('rcmfd_addrbook_show_images')) |
| | | addrbook_show_images.disabled = !checkbox.checked; |
| | | } |
| | | }; |
| | | |
| | | this.toggle_preview_pane = function(checkbox) |
| | | { |
| | | var preview_pane_mark_read; |
| | | if (preview_pane_mark_read = document.getElementById('rcmfd_preview_pane_mark_read')) |
| | | preview_pane_mark_read.disabled = !checkbox.checked; |
| | | } |
| | | }; |
| | | |
| | | // display fetched raw headers |
| | | this.set_headers = function(content) |
| | |
| | | |
| | | $(elem).removeClass('show-headers').addClass('hide-headers'); |
| | | $(this.gui_objects.all_headers_row).show(); |
| | | elem.onclick = function() { rcmail.hide_headers(elem); } |
| | | elem.onclick = function() { rcmail.hide_headers(elem); }; |
| | | |
| | | // fetch headers only once |
| | | if (!this.gui_objects.all_headers_box.innerHTML) |
| | | { |
| | | if (!this.gui_objects.all_headers_box.innerHTML) { |
| | | this.display_message(this.get_label('loading'), 'loading', true); |
| | | this.http_post('headers', '_uid='+this.env.uid); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // hide all-headers row |
| | | this.hide_headers = function(elem) |
| | |
| | | |
| | | $(elem).removeClass('hide-headers').addClass('show-headers'); |
| | | $(this.gui_objects.all_headers_row).hide(); |
| | | elem.onclick = function() { rcmail.load_headers(elem); } |
| | | } |
| | | elem.onclick = function() { rcmail.load_headers(elem); }; |
| | | }; |
| | | |
| | | // percent (quota) indicator |
| | | this.percent_indicator = function(obj, data) |
| | |
| | | // replace quota image |
| | | obj.innerHTML = ''; |
| | | $(obj).append(bar1).append(bar2).append(main); |
| | | } |
| | | }; |
| | | |
| | | /********************************************************/ |
| | | /********* html to text conversion functions *********/ |
| | |
| | | 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); |
| | | } |
| | | }; |
| | | |
| | | |
| | | /********************************************************/ |
| | |
| | | |
| | | // send request |
| | | console.log('HTTP GET: ' + url); |
| | | jQuery.get(url, { _unlock:(lock?1:0) }, function(data){ ref.http_response(data); }, 'json'); |
| | | $.get(url, { _unlock:(lock?1:0) }, function(data){ ref.http_response(data); }, 'json'); |
| | | }; |
| | | |
| | | // send a http POST request to the server |
| | |
| | | |
| | | // send request |
| | | console.log('HTTP POST: ' + url); |
| | | jQuery.post(url, postdata, function(data){ ref.http_response(data); }, 'json'); |
| | | $.post(url, postdata, function(data){ ref.http_response(data); }, 'json'); |
| | | }; |
| | | |
| | | // handle HTTP response |
| | |
| | | this._int = setInterval(function(){ ref.check_for_recent(false); }, this.env.keep_alive * 1000); |
| | | else if (this.env.keep_alive && !this.env.framed && this.task!='login') |
| | | this._int = setInterval(function(){ ref.send_keep_alive(); }, this.env.keep_alive * 1000); |
| | | } |
| | | }; |
| | | |
| | | // send periodic request to check for recent messages |
| | | this.check_for_recent = function(refresh) |
| | |
| | | return this.env.cid ? this.env.cid : (this.contact_list ? this.contact_list.get_single_selection() : null); |
| | | }; |
| | | |
| | | |
| | | // gets cursor position |
| | | this.get_caret_pos = function(obj) |
| | | { |
| | | if (typeof(obj.selectionEnd)!='undefined') |
| | | return obj.selectionEnd; |
| | | else if (document.selection && document.selection.createRange) |
| | | { |
| | | else if (document.selection && document.selection.createRange) { |
| | | var range = document.selection.createRange(); |
| | | if (range.parentElement()!=obj) |
| | | return 0; |
| | |
| | | return obj.value.length; |
| | | }; |
| | | |
| | | // moves cursor to specified position |
| | | this.set_caret_pos = function(obj, pos) |
| | | { |
| | | if (obj.setSelectionRange) |
| | | obj.setSelectionRange(pos, pos); |
| | | else if (obj.createTextRange) |
| | | { |
| | | else if (obj.createTextRange) { |
| | | var range = obj.createTextRange(); |
| | | range.collapse(true); |
| | | range.moveEnd('character', pos); |
| | | range.moveStart('character', pos); |
| | | range.select(); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // set all fields of a form disabled |
| | | this.lock_form = function(form, lock) |
| | |
| | | return; |
| | | |
| | | var type; |
| | | for (var n=0; n<form.elements.length; n++) |
| | | { |
| | | for (var n=0; n<form.elements.length; n++) { |
| | | type = form.elements[n]; |
| | | if (type=='hidden') |
| | | continue; |