]> git.donarmstrong.com Git - roundcube.git/blobdiff - program/js/app.js
Imported Upstream version 0.3.1
[roundcube.git] / program / js / app.js
index b5e8a4fe09f1a0cd1c733b0f52d4cfc440da62e9..57d1471b6394336453e501781f4790bc346d2cf0 100644 (file)
@@ -1,13 +1,14 @@
-var rcube_webmail_client;
 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();
-rcube_webmail_client=this;
-this.ref="rcube_webmail_client";
+this.ref="rcmail";
 var _1=this;
 this.dblclick_time=500;
 this.message_time=3000;
@@ -19,36 +20,55 @@ this.env.draft_autosave=0;
 this.env.comm_path="./";
 this.env.bin_path="./bin/";
 this.env.blankpage="program/blank.gif";
-this.set_env=function(p,_3){
-if(p!=null&&typeof (p)=="object"&&!_3){
+jQuery.ajaxSetup({cache:false,error:function(_2,_3,_4){
+_1.http_error(_2,_3,_4);
+},beforeSend:function(_5){
+_5.setRequestHeader("X-RoundCube-Request",_1.env.request_token);
+}});
+this.set_env=function(p,_7){
+if(p!=null&&typeof (p)=="object"&&!_7){
 for(var n in p){
 this.env[n]=p[n];
 }
 }else{
-this.env[p]=_3;
+this.env[p]=_7;
 }
 };
-this.add_label=function(_5,_6){
-this.labels[_5]=_6;
+this.add_label=function(_9,_a){
+this.labels[_9]=_a;
 };
-this.register_button=function(_7,id,_9,_a,_b,_c){
-if(!this.buttons[_7]){
-this.buttons[_7]=new Array();
+this.register_button=function(_b,id,_d,_e,_f,_10){
+if(!this.buttons[_b]){
+this.buttons[_b]=new Array();
 }
-var _d={id:id,type:_9};
-if(_a){
-_d.act=_a;
+var _11={id:id,type:_d};
+if(_e){
+_11.act=_e;
 }
-if(_b){
-_d.sel=_b;
+if(_f){
+_11.sel=_f;
 }
-if(_c){
-_d.over=_c;
+if(_10){
+_11.over=_10;
 }
-this.buttons[_7][this.buttons[_7].length]=_d;
+this.buttons[_b][this.buttons[_b].length]=_11;
 };
-this.gui_object=function(_e,id){
-this.gui_objects[_e]=id;
+this.gui_object=function(_12,id){
+this.gui_objects[_12]=id;
+};
+this.gui_container=function(_14,id){
+this.gui_containers[_14]=id;
+};
+this.add_element=function(elm,_17){
+if(this.gui_containers[_17]&&this.gui_containers[_17].jquery){
+this.gui_containers[_17].append(elm);
+}
+};
+this.register_command=function(_18,_19,_1a){
+this.command_handlers[_18]=_19;
+if(_1a){
+this.enable_command(_18,true);
+}
 };
 this.add_onload=function(f){
 this.onloads[this.onloads.length]=f;
@@ -60,9 +80,13 @@ if(!bw.dom||!bw.xmlhttp_test()){
 this.goto_url("error","_code=0x199");
 return;
 }
+for(var n in this.gui_containers){
+this.gui_containers[n]=$("#"+this.gui_containers[n]);
+}
 for(var n in this.gui_objects){
 this.gui_objects[n]=rcube_find_object(this.gui_objects[n]);
 }
+this.init_buttons();
 if(this.env.framed&&parent.rcmail&&parent.rcmail.set_busy){
 parent.rcmail.set_busy(false);
 }
@@ -89,21 +113,21 @@ p.msglist_select(o);
 this.message_list.addEventListener("dragstart",function(o){
 p.drag_start(o);
 });
-this.message_list.addEventListener("dragmove",function(o,e){
+this.message_list.addEventListener("dragmove",function(e){
 p.drag_move(e);
 });
-this.message_list.addEventListener("dragend",function(o){
-p.drag_active=false;
+this.message_list.addEventListener("dragend",function(e){
+p.drag_end(e);
 });
+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();
 }
@@ -116,7 +140,7 @@ if(this.env.search_text!=null&&document.getElementById("quicksearchbox")!=null){
 document.getElementById("quicksearchbox").value=this.env.search_text;
 }
 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","edit","viewsource","download","print","load-attachment","load-headers",true);
 if(this.env.next_uid){
 this.enable_command("nextmessage",true);
 this.enable_command("lastmessage",true);
@@ -125,6 +149,12 @@ if(this.env.prev_uid){
 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);
+}
 }
 if(this.env.trash_mailbox&&this.env.mailbox!=this.env.trash_mailbox){
 this.set_alttext("delete","movemessagetotrash");
@@ -133,12 +163,6 @@ if(this.env.action=="preview"&&this.env.framed&&parent.rcmail){
 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"){
 this.enable_command("add-attachment","send-attachment","remove-attachment","send",true);
 if(this.env.spellcheck){
@@ -146,7 +170,7 @@ this.env.spellcheck.spelling_state_observer=function(s){
 _1.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);
 }
 }
@@ -156,6 +180,7 @@ this.enable_command("savedraft",true);
 document.onmouseup=function(e){
 return p.doc_mouse_up(e);
 };
+this.init_messageform();
 }
 if(this.env.messagecount){
 this.enable_command("select-all","select-none","expunge",true);
@@ -164,9 +189,6 @@ if(this.purge_mailbox_test()){
 this.enable_command("purge",true);
 }
 this.set_page_buttons();
-if(this.env.action=="compose"){
-this.init_messageform();
-}
 if(this.env.action=="print"){
 window.print();
 }
@@ -176,17 +198,20 @@ this.gui_objects.folderlist=this.gui_objects.mailboxlist;
 this.http_request("getunread","");
 }
 if(this.env.mdn_request&&this.env.uid){
-var _1f="_uid="+this.env.uid+"&_mbox="+urlencode(this.env.mailbox);
+var _29="_uid="+this.env.uid+"&_mbox="+urlencode(this.env.mailbox);
 if(confirm(this.get_label("mdnrequest"))){
-this.http_post("sendmdn",_1f);
+this.http_post("sendmdn",_29);
 }else{
-this.http_post("mark",_1f+"&_flag=mdnsent");
+this.http_post("mark",_29+"&_flag=mdnsent");
 }
 }
 break;
 case "addressbook":
 if(this.gui_objects.contactslist){
 this.contact_list=new rcube_list_widget(this.gui_objects.contactslist,{multiselect:true,draggable:true,keyboard:true});
+this.contact_list.row_init=function(row){
+p.triggerEvent("insertrow",{cid:row.uid,row:row});
+};
 this.contact_list.addEventListener("keypress",function(o){
 p.contactlist_keypress(o);
 });
@@ -196,11 +221,11 @@ p.contactlist_select(o);
 this.contact_list.addEventListener("dragstart",function(o){
 p.drag_start(o);
 });
-this.contact_list.addEventListener("dragmove",function(o,e){
+this.contact_list.addEventListener("dragmove",function(e){
 p.drag_move(e);
 });
-this.contact_list.addEventListener("dragend",function(o){
-p.drag_active=false;
+this.contact_list.addEventListener("dragend",function(e){
+p.drag_end(e);
 });
 this.contact_list.init();
 if(this.env.cid){
@@ -216,6 +241,7 @@ return p.doc_mouse_up(e);
 }else{
 this.contact_list.focus();
 }
+this.gui_objects.folderlist=this.gui_objects.contactslist;
 }
 this.set_page_buttons();
 if(this.env.address_sources&&this.env.address_sources[this.env.source]&&!this.env.address_sources[this.env.source].readonly){
@@ -236,16 +262,18 @@ this.enable_command("list",true);
 break;
 case "settings":
 this.enable_command("preferences","identities","save","folders",true);
-if(this.env.action=="identities"||this.env.action=="edit-identity"||this.env.action=="add-identity"){
+if(this.env.action=="identities"){
 this.enable_command("add",this.env.identities_level<2);
-this.enable_command("delete","edit",true);
-}
+}else{
 if(this.env.action=="edit-identity"||this.env.action=="add-identity"){
-this.enable_command("save",true);
-}
+this.enable_command("add",this.env.identities_level<2);
+this.enable_command("save","delete","edit",true);
+}else{
 if(this.env.action=="folders"){
 this.enable_command("subscribe","unsubscribe","create-folder","rename-folder","delete-folder",true);
 }
+}
+}
 if(this.gui_objects.identitieslist){
 this.identity_list=new rcube_list_widget(this.gui_objects.identitieslist,{multiselect:false,draggable:false,keyboard:false});
 this.identity_list.addEventListener("select",function(o){
@@ -256,41 +284,46 @@ this.identity_list.focus();
 if(this.env.iid){
 this.identity_list.highlight_row(this.env.iid);
 }
-}
+}else{
+if(this.gui_objects.sectionslist){
+this.sections_list=new rcube_list_widget(this.gui_objects.sectionslist,{multiselect:false,draggable:false,keyboard:false});
+this.sections_list.addEventListener("select",function(o){
+p.section_select(o);
+});
+this.sections_list.init();
+this.sections_list.focus();
+this.sections_list.select_first();
+}else{
 if(this.gui_objects.subscriptionlist){
 this.init_subscription_list();
 }
+}
+}
 break;
 case "login":
-var _29=rcube_find_object("rcmloginuser");
-var _2a=rcube_find_object("rcmloginpwd");
-var _2b=rcube_find_object("rcmlogintz");
-if(_29){
-_29.onkeyup=function(e){
+var _34=$("#rcmloginuser");
+_34.bind("keyup",function(e){
 return rcmail.login_user_keyup(e);
-};
-}
-if(_29&&_29.value==""){
-_29.focus();
+});
+if(_34.val()==""){
+_34.focus();
 }else{
-if(_2a){
-_2a.focus();
-}
-}
-if(_2b){
-_2b.value=new Date().getTimezoneOffset()/-60;
+$("#rcmloginpwd").focus();
 }
+$("#rcmlogintz").val(new Date().getTimezoneOffset()/-60);
 this.enable_command("login",true);
 break;
 default:
 break;
 }
-this.enable_command("logout",true);
 this.loaded=true;
 if(this.pending_message){
 this.display_message(this.pending_message[0],this.pending_message[1]);
 }
-this.start_keepalive();
+if(this.gui_objects.folderlist){
+this.gui_containers.foldertray=$(this.gui_objects.folderlist);
+}
+this.triggerEvent("init",{task:this.task,action:this.env.action});
 for(var i=0;i<this.onloads.length;i++){
 if(typeof (this.onloads[i])=="string"){
 eval(this.onloads[i]);
@@ -300,6 +333,7 @@ this.onloads[i]();
 }
 }
 }
+this.start_keepalive();
 };
 this.start_keepalive=function(){
 if(this.env.keep_alive&&!this.env.framed&&this.task=="mail"&&this.gui_objects.mailboxlist){
@@ -323,7 +357,7 @@ row.replied=this.env.messages[uid].replied?true:false;
 row.flagged=this.env.messages[uid].flagged?true:false;
 row.forwarded=this.env.messages[uid].forwarded?true:false;
 }
-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;
 row.icon._row=row.obj;
@@ -332,12 +366,12 @@ p.command("toggle_status",this);
 };
 }
 if(!this.env.flagged_col&&this.env.coltypes){
-var _32;
-if((_32=find_in_array("flag",this.env.coltypes))>=0){
-this.set_env("flagged_col",_32+1);
+var _3b;
+if((_3b=find_in_array("flag",this.env.coltypes))>=0){
+this.set_env("flagged_col",_3b+1);
 }
 }
-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;
 row.flagged_icon._row=row.obj;
@@ -345,39 +379,31 @@ row.flagged_icon.onmousedown=function(e){
 p.command("toggle_flag",this);
 };
 }
+this.triggerEvent("insertrow",{uid:uid,row:row});
 };
 this.init_messageform=function(){
 if(!this.gui_objects.messageform){
 return false;
 }
-var _34=rcube_find_object("_from");
-var _35=rcube_find_object("_to");
-var _36=rcube_find_object("_cc");
-var _37=rcube_find_object("_bcc");
-var _38=rcube_find_object("_replyto");
-var _39=rcube_find_object("_subject");
-var _3a=rcube_find_object("_message");
-var _3b=rcube_find_object("_draft_saveid");
-if(_35){
-this.init_address_input_events(_35);
-}
-if(_36){
-this.init_address_input_events(_36);
-}
-if(_37){
-this.init_address_input_events(_37);
-}
-if(_34&&_34.type=="select-one"&&(!_3b||_3b.value=="")&&rcube_find_object("_is_html").value!="1"){
-this.change_identity(_34);
+var _3d=$("[name='_from']");
+var _3e=$("[name='_to']");
+var _3f=$("input[name='_subject']");
+var _40=$("[name='_message']").get(0);
+var _41=$("input[name='_is_html']").val()=="1";
+this.init_address_input_events(_3e);
+this.init_address_input_events($("[name='_cc']"));
+this.init_address_input_events($("[name='_bcc']"));
+if(_3d.attr("type")=="select-one"&&$("input[name='_draft_saveid']").val()==""&&!_41){
+this.change_identity(_3d[0]);
 }
-if(_35&&_35.value==""){
-_35.focus();
+if(_3e.val()==""){
+_3e.focus();
 }else{
-if(_39&&_39.value==""){
-_39.focus();
+if(_3f.val()==""){
+_3f.focus();
 }else{
-if(_3a){
-this.set_caret2start(_3a);
+if(_40&&!_41){
+_40.focus();
 }
 }
 }
@@ -385,47 +411,58 @@ this.compose_field_hash(true);
 this.auto_save_start();
 };
 this.init_address_input_events=function(obj){
-var _3d=function(e){
+var _43=function(e){
 return _1.ksearch_keypress(e,this);
 };
-if(obj.addEventListener){
-obj.addEventListener(bw.safari?"keydown":"keypress",_3d,false);
-}else{
-obj.onkeydown=_3d;
-}
-obj.setAttribute("autocomplete","off");
+obj.bind((bw.safari||bw.ie?"keydown":"keypress"),_43);
+obj.attr("autocomplete","off");
 };
-this.command=function(_3f,_40,obj){
+this.command=function(_45,_46,obj){
 if(obj&&obj.blur){
 obj.blur();
 }
 if(this.busy){
 return false;
 }
-if(!this.commands[_3f]){
+if(!this.commands[_45]){
 if(this.env.framed&&parent.rcmail&&parent.rcmail.command){
-parent.rcmail.command(_3f,_40);
+parent.rcmail.command(_45,_46);
 }
 return false;
 }
-if(this.task=="mail"&&this.env.action=="compose"&&(_3f=="list"||_3f=="mail"||_3f=="addressbook"||_3f=="settings")){
+if(this.task=="mail"&&this.env.action=="compose"&&(_45=="list"||_45=="mail"||_45=="addressbook"||_45=="settings")){
 if(this.cmp_hash!=this.compose_field_hash()&&!confirm(this.get_label("notsentwarning"))){
 return false;
 }
 }
-switch(_3f){
+if(typeof this.command_handlers[_45]=="function"){
+var ret=this.command_handlers[_45](_46,obj);
+return ret!==null?ret:(obj?false:true);
+}else{
+if(typeof this.command_handlers[_45]=="string"){
+var ret=window[this.command_handlers[_45]](_46,obj);
+return ret!==null?ret:(obj?false:true);
+}
+}
+var _49=this.triggerEvent("before"+_45,_46);
+if(typeof _49!="undefined"){
+if(_49===false){
+return false;
+}else{
+_46=_49;
+}
+}
+switch(_45){
 case "login":
 if(this.gui_objects.loginform){
 this.gui_objects.loginform.submit();
 }
 break;
-case "logout":
-this.goto_url("logout","",true);
-break;
 case "mail":
 case "addressbook":
 case "settings":
-this.switch_task(_3f);
+case "logout":
+this.switch_task(_45);
 break;
 case "permaurl":
 if(obj&&obj.href&&obj.target){
@@ -436,22 +473,29 @@ parent.location.href=this.env.permaurl;
 }
 }
 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;
 case "list":
 if(this.task=="mail"){
-if(this.env.search_request<0||(_40!=""&&(this.env.search_request&&_40!=this.env.mailbox))){
+if(this.env.search_request<0||(_46!=""&&(this.env.search_request&&_46!=this.env.mailbox))){
 this.reset_qsearch();
 }
-this.list_mailbox(_40);
+this.list_mailbox(_46);
 if(this.env.trash_mailbox){
 this.set_alttext("delete",this.env.mailbox!=this.env.trash_mailbox?"movemessagetotrash":"deletemessage");
 }
 }else{
 if(this.task=="addressbook"){
-if(this.env.search_request<0||(this.env.search_request&&_40!=this.env.source)){
+if(this.env.search_request<0||(this.env.search_request&&_46!=this.env.source)){
 this.reset_qsearch();
 }
-this.list_contacts(_40);
-this.enable_command("add",(this.env.address_sources&&!this.env.address_sources[_40].readonly));
+this.list_contacts(_46);
+this.enable_command("add",(this.env.address_sources&&!this.env.address_sources[_46].readonly));
 }
 }
 break;
@@ -459,29 +503,17 @@ case "load-headers":
 this.load_headers(obj);
 break;
 case "sort":
-var _42=_40.split("_");
-var _43=_42[0];
-var _44=_42[1]?_42[1].toUpperCase():null;
-var _45;
-if(_44==null){
-if(this.env.sort_col==_43){
-_44=this.env.sort_order=="ASC"?"DESC":"ASC";
+var _4b,_4c=_46;
+if(this.env.sort_col==_4c){
+_4b=this.env.sort_order=="ASC"?"DESC":"ASC";
 }else{
-_44=this.env.sort_order;
-}
+_4b="ASC";
 }
-if(this.env.sort_col==_43&&this.env.sort_order==_44){
-break;
-}
-if(_45=document.getElementById("rcm"+this.env.sort_col)){
-this.set_classname(_45,"sorted"+(this.env.sort_order.toUpperCase()),false);
-}
-if(_45=document.getElementById("rcm"+_43)){
-this.set_classname(_45,"sorted"+_44,true);
-}
-this.env.sort_col=_43;
-this.env.sort_order=_44;
-this.list_mailbox("","",_43+"_"+_44);
+$("#rcm"+this.env.sort_col).removeClass("sorted"+(this.env.sort_order.toUpperCase()));
+$("#rcm"+_4c).addClass("sorted"+_4b);
+this.env.sort_col=_4c;
+this.env.sort_order=_4b;
+this.list_mailbox("","",_4c+"_"+_4b);
 break;
 case "nextpage":
 this.list_page("next");
@@ -518,7 +550,7 @@ this.show_message(uid);
 }
 }else{
 if(this.task=="addressbook"){
-var cid=_40?_40:this.get_single_cid();
+var cid=_46?_46:this.get_single_cid();
 if(cid&&!(this.env.action=="show"&&cid==this.env.cid)){
 this.load_contact(cid,"show");
 }
@@ -540,30 +572,35 @@ var cid;
 if(this.task=="addressbook"&&(cid=this.get_single_cid())){
 this.load_contact(cid,"edit");
 }else{
-if(this.task=="settings"&&_40){
-this.load_identity(_40,"edit-identity");
+if(this.task=="settings"&&_46){
+this.load_identity(_46,"edit-identity");
+}else{
+if(this.task=="mail"&&(cid=this.get_single_uid())){
+var url=(this.env.mailbox==this.env.drafts_mailbox)?"_draft_uid=":"_uid=";
+this.goto_url("compose",url+cid+"&_mbox="+urlencode(this.env.mailbox),true);
+}
 }
 }
 break;
 case "save-identity":
 case "save":
 if(this.gui_objects.editform){
-var _48=rcube_find_object("_pagesize");
-var _49=rcube_find_object("_name");
-var _4a=rcube_find_object("_email");
-if(_48&&isNaN(parseInt(_48.value))){
+var _4f=$("input[name='_pagesize']");
+var _50=$("input[name='_name']");
+var _51=$("input[name='_email']");
+if(_4f.length&&isNaN(parseInt(_4f.val()))){
 alert(this.get_label("nopagesizewarning"));
-_48.focus();
+_4f.focus();
 break;
 }else{
-if(_49&&_49.value==""){
+if(_50.length&&_50.val()==""){
 alert(this.get_label("nonamewarning"));
-_49.focus();
+_50.focus();
 break;
 }else{
-if(_4a&&!rcube_check_email(_4a.value)){
+if(_51.length&&!rcube_check_email(_51.val())){
 alert(this.get_label("noemailwarning"));
-_4a.focus();
+_51.focus();
 break;
 }
 }
@@ -587,49 +624,49 @@ break;
 case "move":
 case "moveto":
 if(this.task=="mail"){
-this.move_messages(_40);
+this.move_messages(_46);
 }else{
 if(this.task=="addressbook"&&this.drag_active){
-this.copy_contact(null,_40);
+this.copy_contact(null,_46);
 }
 }
 break;
 case "mark":
-if(_40){
-this.mark_message(_40);
+if(_46){
+this.mark_message(_46);
 }
 break;
 case "toggle_status":
-if(_40&&!_40._row){
+if(_46&&!_46._row){
 break;
 }
 var uid;
-var _4b="read";
-if(_40._row.uid){
-uid=_40._row.uid;
+var _52="read";
+if(_46._row.uid){
+uid=_46._row.uid;
 if(this.message_list.rows[uid].deleted){
-_4b="undelete";
+_52="undelete";
 }else{
 if(!this.message_list.rows[uid].unread){
-_4b="unread";
+_52="unread";
 }
 }
 }
-this.mark_message(_4b,uid);
+this.mark_message(_52,uid);
 break;
 case "toggle_flag":
-if(_40&&!_40._row){
+if(_46&&!_46._row){
 break;
 }
 var uid;
-var _4b="flagged";
-if(_40._row.uid){
-uid=_40._row.uid;
+var _52="flagged";
+if(_46._row.uid){
+uid=_46._row.uid;
 if(this.message_list.rows[uid].flagged){
-_4b="unflagged";
+_52="unflagged";
 }
 }
-this.mark_message(_4b,uid);
+this.mark_message(_52,uid);
 break;
 case "always-load":
 if(this.env.uid&&this.env.sender){
@@ -645,12 +682,12 @@ this.show_message(this.env.uid,true,this.env.action=="preview");
 }
 break;
 case "load-attachment":
-var _4c="_mbox="+urlencode(this.env.mailbox)+"&_uid="+this.env.uid+"&_part="+_40.part;
-if(this.env.uid&&_40.mimetype&&find_in_array(_40.mimetype,this.mimetypes)>=0){
-if(_40.mimetype=="text/html"){
-_4c+="&_safe=1";
+var _53="_mbox="+urlencode(this.env.mailbox)+"&_uid="+this.env.uid+"&_part="+_46.part;
+if(this.env.uid&&_46.mimetype&&find_in_array(_46.mimetype,this.mimetypes)>=0){
+if(_46.mimetype=="text/html"){
+_53+="&_safe=1";
 }
-this.attachment_win=window.open(this.env.comm_path+"&_action=get&"+_4c+"&_frame=1","rcubemailattachment");
+this.attachment_win=window.open(this.env.comm_path+"&_action=get&"+_53+"&_frame=1","rcubemailattachment");
 if(this.attachment_win){
 window.setTimeout(function(){
 _1.attachment_win.focus();
@@ -658,10 +695,14 @@ _1.attachment_win.focus();
 break;
 }
 }
-this.goto_url("get",_4c+"&_download=1",false);
+this.goto_url("get",_53+"&_download=1",false);
 break;
 case "select-all":
-this.message_list.select_all(_40);
+if(_46=="invert"){
+this.message_list.invert_selection();
+}else{
+this.message_list.select_all(_46);
+}
 break;
 case "select-none":
 this.message_list.clear_selection();
@@ -699,30 +740,30 @@ if(uid=this.get_single_uid()){
 url+="&_draft_uid="+uid;
 }
 }else{
-if(_40){
-url+="&_to="+urlencode(_40);
+if(_46){
+url+="&_to="+urlencode(_46);
 }
 }
 }else{
 if(this.task=="addressbook"){
-if(_40&&_40.indexOf("@")>0){
+if(_46&&_46.indexOf("@")>0){
 url=this.get_task_url("mail",url);
-this.redirect(url+"&_to="+urlencode(_40));
+this.redirect(url+"&_to="+urlencode(_46));
 break;
 }
-var _4e=new Array();
-if(_40){
-_4e[_4e.length]=_40;
+var _54=new Array();
+if(_46){
+_54[_54.length]=_46;
 }else{
 if(this.contact_list){
-var _4f=this.contact_list.get_selection();
-for(var n=0;n<_4f.length;n++){
-_4e[_4e.length]=_4f[n];
+var _55=this.contact_list.get_selection();
+for(var n=0;n<_55.length;n++){
+_54[_54.length]=_55[n];
 }
 }
 }
-if(_4e.length){
-this.http_request("mailto","_cid="+urlencode(_4e.join(","))+"&_source="+urlencode(this.env.source),true);
+if(_54.length){
+this.http_request("mailto","_cid="+urlencode(_54.join(","))+"&_source="+urlencode(this.env.source),true);
 }
 break;
 }
@@ -731,11 +772,11 @@ url=url.replace(/&_framed=1/,"");
 this.redirect(url);
 break;
 case "spellcheck":
-if(window.tinyMCE&&tinyMCE.get("compose-body")){
+if(window.tinyMCE&&tinyMCE.get(this.env.composebody)){
 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");
 }
 }
@@ -749,10 +790,10 @@ if(!this.env.drafts_mailbox||this.cmp_hash==this.compose_field_hash()){
 break;
 }
 this.set_busy(true,"savingmessage");
-var _51=this.gui_objects.messageform;
-_51.target="savetarget";
-_51._draft.value="1";
-_51.submit();
+var _57=this.gui_objects.messageform;
+_57.target="savetarget";
+_57._draft.value="1";
+_57.submit();
 break;
 case "send":
 if(!this.gui_objects.messageform){
@@ -763,26 +804,26 @@ break;
 }
 self.clearTimeout(this.save_timer);
 this.set_busy(true,"sendingmessage");
-var _51=this.gui_objects.messageform;
-_51.target="savetarget";
-_51._draft.value="";
-_51.submit();
+var _57=this.gui_objects.messageform;
+_57.target="savetarget";
+_57._draft.value="";
+_57.submit();
 clearTimeout(this.request_timer);
 break;
 case "add-attachment":
 this.show_attachment_form(true);
 case "send-attachment":
 self.clearTimeout(this.save_timer);
-this.upload_file(_40);
+this.upload_file(_46);
 break;
 case "remove-attachment":
-this.remove_attachment(_40);
+this.remove_attachment(_46);
 break;
 case "reply-all":
 case "reply":
 var uid;
 if(uid=this.get_single_uid()){
-this.goto_url("compose","_reply_uid="+uid+"&_mbox="+urlencode(this.env.mailbox)+(_3f=="reply-all"?"&_all=1":""),true);
+this.goto_url("compose","_reply_uid="+uid+"&_mbox="+urlencode(this.env.mailbox)+(_45=="reply-all"?"&_all=1":""),true);
 }
 break;
 case "forward":
@@ -808,7 +849,7 @@ break;
 case "viewsource":
 var uid;
 if(uid=this.get_single_uid()){
-_1.sourcewin=window.open(this.env.comm_path+"&_action=viewsource&_uid="+this.env.uid+"&_mbox="+urlencode(this.env.mailbox));
+_1.sourcewin=window.open(this.env.comm_path+"&_action=viewsource&_uid="+uid+"&_mbox="+urlencode(this.env.mailbox));
 if(this.sourcewin){
 window.setTimeout(function(){
 _1.sourcewin.focus();
@@ -816,15 +857,21 @@ _1.sourcewin.focus();
 }
 }
 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":
-this.add_contact(_40);
+this.add_contact(_46);
 break;
 case "search":
-if(!_40&&this.gui_objects.qsearchbox){
-_40=this.gui_objects.qsearchbox.value;
+if(!_46&&this.gui_objects.qsearchbox){
+_46=this.gui_objects.qsearchbox.value;
 }
-if(_40){
-this.qsearch(_40);
+if(_46){
+this.qsearch(_46);
 break;
 }
 case "reset-search":
@@ -840,8 +887,8 @@ this.list_contacts(this.env.source);
 break;
 case "import":
 if(this.env.action=="import"&&this.gui_objects.importform){
-var _53=document.getElementById("rcmimportfile");
-if(_53&&!_53.value){
+var _59=document.getElementById("rcmimportfile");
+if(_59&&!_59.value){
 alert(this.get_label("selectimportfile"));
 break;
 }
@@ -854,16 +901,16 @@ this.goto_url("import");
 break;
 case "export":
 if(this.contact_list.rowcount>0){
-var _54=(this.env.source?"_source="+urlencode(this.env.source)+"&":"");
+var _5a=(this.env.source?"_source="+urlencode(this.env.source)+"&":"");
 if(this.env.search_request){
-_54+="_search="+this.env.search_request;
+_5a+="_search="+this.env.search_request;
 }
-this.goto_url("export",_54);
+this.goto_url("export",_5a);
 }
 break;
 case "collapse-folder":
-if(_40){
-this.collapse_folder(_40);
+if(_46){
+this.collapse_folder(_46);
 }
 break;
 case "preferences":
@@ -878,41 +925,42 @@ case "folders":
 this.goto_url("folders");
 break;
 case "subscribe":
-this.subscribe_folder(_40);
+this.subscribe_folder(_46);
 break;
 case "unsubscribe":
-this.unsubscribe_folder(_40);
+this.unsubscribe_folder(_46);
 break;
 case "create-folder":
-this.create_folder(_40);
+this.create_folder(_46);
 break;
 case "rename-folder":
-this.rename_folder(_40);
+this.rename_folder(_46);
 break;
 case "delete-folder":
-this.delete_folder(_40);
+this.delete_folder(_46);
 break;
 }
+this.triggerEvent("after"+_45,_46);
 return obj?false:true;
 };
 this.enable_command=function(){
-var _55=arguments;
-if(!_55.length){
+var _5b=arguments;
+if(!_5b.length){
 return -1;
 }
-var _56;
-var _57=_55[_55.length-1];
-for(var n=0;n<_55.length-1;n++){
-_56=_55[n];
-this.commands[_56]=_57;
-this.set_button(_56,(_57?"act":"pas"));
+var _5c;
+var _5d=_5b[_5b.length-1];
+for(var n=0;n<_5b.length-1;n++){
+_5c=_5b[n];
+this.commands[_5c]=_5d;
+this.set_button(_5c,(_5d?"act":"pas"));
 }
 return true;
 };
-this.set_busy=function(a,_5a){
-if(a&&_5a){
-var msg=this.get_label(_5a);
-if(msg==_5a){
+this.set_busy=function(a,_60){
+if(a&&_60){
+var msg=this.get_label(_60);
+if(msg==_60){
 msg="Loading...";
 }
 this.display_message(msg,"loading",true);
@@ -934,113 +982,191 @@ _1.request_timed_out();
 },this.env.request_timeout*1000);
 }
 };
-this.get_label=function(_5c){
-if(this.labels[_5c]){
-return this.labels[_5c];
+this.get_label=function(_62,_63){
+if(_63&&this.labels[_63+"."+_62]){
+return this.labels[_63+"."+_62];
 }else{
-return _5c;
+if(this.labels[_62]){
+return this.labels[_62];
+}else{
+return _62;
+}
 }
 };
-this.switch_task=function(_5d){
-if(this.task===_5d&&_5d!="mail"){
+this.gettext=this.get_label;
+this.switch_task=function(_64){
+if(this.task===_64&&_64!="mail"){
 return;
 }
-var url=this.get_task_url(_5d);
-if(_5d=="mail"){
+var url=this.get_task_url(_64);
+if(_64=="mail"){
 url+="&_mbox=INBOX";
 }
 this.redirect(url);
 };
-this.get_task_url=function(_5f,url){
+this.get_task_url=function(_66,url){
 if(!url){
 url=this.env.comm_path;
 }
-return url.replace(/_task=[a-z]+/,"_task="+_5f);
+return url.replace(/_task=[a-z]+/,"_task="+_66);
 };
 this.request_timed_out=function(){
 this.set_busy(false);
 this.display_message("Request timed out!","error");
 };
+this.reload=function(_68){
+if(this.env.framed&&parent.rcmail){
+parent.rcmail.reload(_68);
+}else{
+if(_68){
+window.setTimeout(function(){
+rcmail.reload();
+},_68);
+}else{
+if(window.location){
+location.href=this.env.comm_path;
+}
+}
+}
+};
 this.doc_mouse_up=function(e){
-var _62,li;
+var _6a,_6b,li;
 if(this.message_list){
+if(!rcube_mouse_is_over(e,this.message_list.list)){
 this.message_list.blur();
-_62=this.env.mailboxes;
+}
+_6b=this.message_list;
+_6a=this.env.mailboxes;
 }else{
 if(this.contact_list){
+if(!rcube_mouse_is_over(e,this.contact_list.list)){
 this.contact_list.blur();
-_62=this.env.address_sources;
+}
+_6b=this.contact_list;
+_6a=this.env.address_sources;
 }else{
 if(this.ksearch_value){
 this.ksearch_blur();
 }
 }
 }
-if(this.drag_active&&_62&&this.env.last_folder_target){
-this.set_classname(this.get_folder_li(this.env.last_folder_target),"droptarget",false);
-this.command("moveto",_62[this.env.last_folder_target].id);
+if(this.drag_active&&_6a&&this.env.last_folder_target){
+$(this.get_folder_li(this.env.last_folder_target)).removeClass("droptarget");
+this.command("moveto",_6a[this.env.last_folder_target].id);
 this.env.last_folder_target=null;
+_6b.draglayer.hide();
+}
+if(this.buttons_sel){
+for(var id in this.buttons_sel){
+if(typeof id!="function"){
+this.button_out(this.buttons_sel[id],id);
+}
+}
+this.buttons_sel={};
 }
 };
-this.drag_start=function(_64){
-var _65=this.task=="mail"?this.env.mailboxes:this.env.address_sources;
+this.drag_start=function(_6e){
+var _6f=this.task=="mail"?this.env.mailboxes:this.env.address_sources;
 this.drag_active=true;
 if(this.preview_timer){
 clearTimeout(this.preview_timer);
 }
-if(this.gui_objects.folderlist&&_65){
-var li,pos,_64,_68;
-_64=rcube_find_object(this.task=="mail"?"mailboxlist":"directorylist");
-pos=rcube_get_object_pos(_64);
-this.env.folderlist_coords={x1:pos.x,y1:pos.y,x2:pos.x+_64.offsetWidth,y2:pos.y+_64.offsetHeight};
+if(this.gui_objects.folderlist&&_6f){
+this.initialBodyScrollTop=bw.ie?0:window.pageYOffset;
+this.initialListScrollTop=this.gui_objects.folderlist.parentNode.scrollTop;
+var li,pos,_6e,_72;
+_6e=$(this.gui_objects.folderlist);
+pos=_6e.offset();
+this.env.folderlist_coords={x1:pos.left,y1:pos.top,x2:pos.left+_6e.width(),y2:pos.top+_6e.height()};
 this.env.folder_coords=new Array();
-for(var k in _65){
+for(var k in _6f){
 if(li=this.get_folder_li(k)){
-pos=rcube_get_object_pos(li.firstChild);
-if(_68=li.firstChild.offsetHeight){
-this.env.folder_coords[k]={x1:pos.x,y1:pos.y,x2:pos.x+li.firstChild.offsetWidth,y2:pos.y+_68};
+if(_72=li.firstChild.offsetHeight){
+pos=$(li.firstChild).offset();
+this.env.folder_coords[k]={x1:pos.left,y1:pos.top,x2:pos.left+li.firstChild.offsetWidth,y2:pos.top+_72,on:0};
 }
 }
 }
 }
 };
+this.drag_end=function(e){
+this.drag_active=false;
+this.env.last_folder_target=null;
+if(this.folder_auto_timer){
+window.clearTimeout(this.folder_auto_timer);
+this.folder_auto_timer=null;
+this.folder_auto_expand=null;
+}
+if(this.gui_objects.folderlist&&this.env.folder_coords){
+for(var k in this.env.folder_coords){
+if(this.env.folder_coords[k].on){
+$(this.get_folder_li(k)).removeClass("droptarget");
+}
+}
+}
+};
 this.drag_move=function(e){
 if(this.gui_objects.folderlist&&this.env.folder_coords){
-var li,pos,_6d;
-_6d=rcube_event.get_mouse_pos(e);
+var _77=bw.ie?-document.documentElement.scrollTop:this.initialBodyScrollTop;
+var _78=this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop;
+var _79=-_78-_77;
+var li,div,pos,_7d;
+_7d=rcube_event.get_mouse_pos(e);
 pos=this.env.folderlist_coords;
-if(_6d.x<pos.x1||_6d.x>=pos.x2||_6d.y<pos.y1||_6d.y>=pos.y2){
+_7d.y+=_79;
+if(_7d.x<pos.x1||_7d.x>=pos.x2||_7d.y<pos.y1||_7d.y>=pos.y2){
 if(this.env.last_folder_target){
-this.set_classname(this.get_folder_li(this.env.last_folder_target),"droptarget",false);
+$(this.get_folder_li(this.env.last_folder_target)).removeClass("droptarget");
+this.env.folder_coords[this.env.last_folder_target].on=0;
 this.env.last_folder_target=null;
 }
 return;
 }
 for(var k in this.env.folder_coords){
 pos=this.env.folder_coords[k];
-if(this.check_droptarget(k)&&((_6d.x>=pos.x1)&&(_6d.x<pos.x2)&&(_6d.y>=pos.y1)&&(_6d.y<pos.y2))){
-this.set_classname(this.get_folder_li(k),"droptarget",true);
+if(_7d.x>=pos.x1&&_7d.x<pos.x2&&_7d.y>=pos.y1&&_7d.y<pos.y2&&this.check_droptarget(k)){
+li=this.get_folder_li(k);
+div=$(li.getElementsByTagName("div")[0]);
+if(div.hasClass("collapsed")){
+if(this.folder_auto_timer){
+window.clearTimeout(this.folder_auto_timer);
+}
+this.folder_auto_expand=k;
+this.folder_auto_timer=window.setTimeout(function(){
+rcmail.command("collapse-folder",rcmail.folder_auto_expand);
+rcmail.drag_start(null);
+},1000);
+}else{
+if(this.folder_auto_timer){
+window.clearTimeout(this.folder_auto_timer);
+this.folder_auto_timer=null;
+this.folder_auto_expand=null;
+}
+}
+$(li).addClass("droptarget");
 this.env.last_folder_target=k;
+this.env.folder_coords[k].on=1;
 }else{
-this.set_classname(this.get_folder_li(k),"droptarget",false);
+if(pos.on){
+$(this.get_folder_li(k)).removeClass("droptarget");
+this.env.folder_coords[k].on=0;
+}
 }
 }
 }
 };
 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/))){
-var ul=li.getElementsByTagName("ul")[0];
-if(div.className.match(/collapsed/)){
-ul.style.display="";
-this.set_classname(div,"collapsed",false);
-this.set_classname(div,"expanded",true);
+if((li=this.get_folder_li(id))&&(div=$(li.getElementsByTagName("div")[0]))&&(div.hasClass("collapsed")||div.hasClass("expanded"))){
+var ul=$(li.getElementsByTagName("ul")[0]);
+if(div.hasClass("collapsed")){
+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)+"&");
 if(this.env.mailbox.indexOf(id+this.env.delimiter)==0){
 this.command("list",id);
@@ -1055,6 +1181,9 @@ this.set_unread_count_display(id,false);
 }
 };
 this.click_on_list=function(e){
+if(this.gui_objects.qsearchbox){
+this.gui_objects.qsearchbox.blur();
+}
 if(this.message_list){
 this.message_list.focus();
 }else{
@@ -1062,26 +1191,22 @@ if(this.contact_list){
 this.contact_list.focus();
 }
 }
-var _74;
-if(_74=this.get_folder_li()){
-this.set_classname(_74,"unfocused",true);
-}
 return rcube_event.get_button(e)==2?true:rcube_event.cancel(e);
 };
-this.msglist_select=function(_75){
+this.msglist_select=function(_84){
 if(this.preview_timer){
 clearTimeout(this.preview_timer);
 }
-var _76=_75.selection.length==1;
+var _85=_84.selection.length==1;
 if(this.env.mailbox==this.env.drafts_mailbox){
 this.enable_command("reply","reply-all","forward",false);
-this.enable_command("show",_76);
-this.enable_command("delete","moveto","mark",(_75.selection.length>0?true:false));
+this.enable_command("show","print","open","edit","download","viewsource",_85);
+this.enable_command("delete","moveto","mark",(_84.selection.length>0?true:false));
 }else{
-this.enable_command("show","reply","reply-all","forward","print",_76);
-this.enable_command("delete","moveto","mark",(_75.selection.length>0?true:false));
+this.enable_command("show","reply","reply-all","forward","print","edit","open","download","viewsource",_85);
+this.enable_command("delete","moveto","mark",(_84.selection.length>0?true:false));
 }
-if(_76&&this.env.contentframe&&!_75.multi_selecting){
+if(_85&&this.env.contentframe&&!_84.multi_selecting){
 this.preview_timer=window.setTimeout(function(){
 _1.msglist_get_preview();
 },200);
@@ -1091,11 +1216,11 @@ this.show_contentframe(false);
 }
 }
 };
-this.msglist_dbl_click=function(_77){
+this.msglist_dbl_click=function(_86){
 if(this.preview_timer){
 clearTimeout(this.preview_timer);
 }
-var uid=_77.get_single_selection();
+var uid=_86.get_single_selection();
 if(uid&&this.env.mailbox==this.env.drafts_mailbox){
 this.goto_url("compose","_draft_uid="+uid+"&_mbox="+urlencode(this.env.mailbox),true);
 }else{
@@ -1104,17 +1229,17 @@ this.show_message(uid,false,false);
 }
 }
 };
-this.msglist_keypress=function(_79){
-if(_79.key_pressed==_79.ENTER_KEY){
+this.msglist_keypress=function(_88){
+if(_88.key_pressed==_88.ENTER_KEY){
 this.command("show");
 }else{
-if(_79.key_pressed==_79.DELETE_KEY){
+if(_88.key_pressed==_88.DELETE_KEY){
 this.command("delete");
 }else{
-if(_79.key_pressed==_79.BACKSPACE_KEY){
+if(_88.key_pressed==_88.BACKSPACE_KEY){
 this.command("delete");
 }else{
-_79.shiftkey=false;
+_88.shiftkey=false;
 }
 }
 }
@@ -1142,30 +1267,30 @@ return (id!=this.env.folder);
 }
 }
 };
-this.show_message=function(id,_7d,_7e){
+this.show_message=function(id,_8c,_8d){
 if(!id){
 return;
 }
-var _7f="";
-var _80=_7e?"preview":"show";
-var _81=window;
-if(_7e&&this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_81=window.frames[this.env.contentframe];
-_7f="&_framed=1";
+var _8e="";
+var _8f=_8d?"preview":"show";
+var _90=window;
+if(_8d&&this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
+_90=window.frames[this.env.contentframe];
+_8e="&_framed=1";
 }
-if(_7d){
-_7f="&_safe=1";
+if(_8c){
+_8e="&_safe=1";
 }
 if(this.env.search_request){
-_7f+="&_search="+this.env.search_request;
+_8e+="&_search="+this.env.search_request;
 }
-var url="&_action="+_80+"&_uid="+id+"&_mbox="+urlencode(this.env.mailbox)+_7f;
-if(_80=="preview"&&String(_81.location.href).indexOf(url)>=0){
+var url="&_action="+_8f+"&_uid="+id+"&_mbox="+urlencode(this.env.mailbox)+_8e;
+if(_8f=="preview"&&String(_90.location.href).indexOf(url)>=0){
 this.show_contentframe(true);
 }else{
 this.set_busy(true,"loading");
-_81.location.href=this.env.comm_path+url;
-if(_80=="preview"&&this.message_list&&this.message_list.rows[id]&&this.message_list.rows[id].unread){
+_90.location.href=this.env.comm_path+url;
+if(_8f=="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;
@@ -1174,261 +1299,265 @@ this.set_unread_count(this.env.mailbox,this.env.unread_counts[this.env.mailbox],
 }
 }
 };
-this.show_contentframe=function(_83){
+this.show_contentframe=function(_92){
 var frm;
-if(this.env.contentframe&&(frm=rcube_find_object(this.env.contentframe))){
-if(!_83&&window.frames[this.env.contentframe]){
+if(this.env.contentframe&&(frm=$("#"+this.env.contentframe))&&frm.length){
+if(!_92&&window.frames[this.env.contentframe]){
 if(window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0){
 window.frames[this.env.contentframe].location.href=this.env.blankpage;
 }
 }else{
-if(!bw.safari){
-frm.style.display=_83?"block":"none";
+if(!bw.safari&&!bw.konq){
+frm[_92?"show":"hide"]();
 }
 }
 }
-if(!_83&&this.busy){
+if(!_92&&this.busy){
 this.set_busy(false);
 }
 };
-this.list_page=function(_85){
-if(_85=="next"){
-_85=this.env.current_page+1;
+this.list_page=function(_94){
+if(_94=="next"){
+_94=this.env.current_page+1;
 }
-if(_85=="last"){
-_85=this.env.pagecount;
+if(_94=="last"){
+_94=this.env.pagecount;
 }
-if(_85=="prev"&&this.env.current_page>1){
-_85=this.env.current_page-1;
+if(_94=="prev"&&this.env.current_page>1){
+_94=this.env.current_page-1;
 }
-if(_85=="first"&&this.env.current_page>1){
-_85=1;
+if(_94=="first"&&this.env.current_page>1){
+_94=1;
 }
-if(_85>0&&_85<=this.env.pagecount){
-this.env.current_page=_85;
+if(_94>0&&_94<=this.env.pagecount){
+this.env.current_page=_94;
 if(this.task=="mail"){
-this.list_mailbox(this.env.mailbox,_85);
+this.list_mailbox(this.env.mailbox,_94);
 }else{
 if(this.task=="addressbook"){
-this.list_contacts(this.env.source,_85);
+this.list_contacts(this.env.source,_94);
 }
 }
 }
 };
-this.filter_mailbox=function(_86){
-var _87;
+this.filter_mailbox=function(_95){
+var _96;
 if(this.gui_objects.qsearchbox){
-_87=this.gui_objects.qsearchbox.value;
+_96=this.gui_objects.qsearchbox.value;
 }
 this.message_list.clear();
 this.env.current_page=1;
 this.set_busy(true,"searching");
-this.http_request("search","_filter="+_86+(_87?"&_q="+urlencode(_87):"")+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):""),true);
+this.http_request("search","_filter="+_95+(_96?"&_q="+urlencode(_96):"")+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):""),true);
 };
-this.list_mailbox=function(_88,_89,_8a){
-this.last_selected=0;
-var _8b="";
-var _8c=window;
-if(!_88){
-_88=this.env.mailbox;
+this.list_mailbox=function(_97,_98,_99){
+var _9a="";
+var _9b=window;
+if(!_97){
+_97=this.env.mailbox;
 }
-if(_8a){
-_8b+="&_sort="+_8a;
+if(_99){
+_9a+="&_sort="+_99;
 }
 if(this.env.search_request){
-_8b+="&_search="+this.env.search_request;
-}
-if(!_89&&_88!=this.env.mailbox){
-_89=1;
-this.env.current_page=_89;
-if(this.message_list){
-this.message_list.clear_selection();
+_9a+="&_search="+this.env.search_request;
 }
+if(!_98&&this.env.mailbox!=_97){
+_98=1;
+this.env.current_page=_98;
 this.show_contentframe(false);
 }
-if(_88!=this.env.mailbox||(_88==this.env.mailbox&&!_89&&!_8a)){
-_8b+="&_refresh=1";
+if(_97!=this.env.mailbox||(_97==this.env.mailbox&&!_98&&!_99)){
+_9a+="&_refresh=1";
+}
+this.last_selected=0;
+if(this.message_list){
+this.message_list.clear_selection();
 }
-this.select_folder(_88,this.env.mailbox);
-this.env.mailbox=_88;
+this.select_folder(_97,this.env.mailbox);
+this.env.mailbox=_97;
 if(this.gui_objects.messagelist){
-this.list_mailbox_remote(_88,_89,_8b);
+this.list_mailbox_remote(_97,_98,_9a);
 return;
 }
 if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_8c=window.frames[this.env.contentframe];
-_8b+="&_framed=1";
+_9b=window.frames[this.env.contentframe];
+_9a+="&_framed=1";
 }
-if(_88){
+if(_97){
 this.set_busy(true,"loading");
-_8c.location.href=this.env.comm_path+"&_mbox="+urlencode(_88)+(_89?"&_page="+_89:"")+_8b;
+_9b.location.href=this.env.comm_path+"&_mbox="+urlencode(_97)+(_98?"&_page="+_98:"")+_9a;
 }
 };
-this.list_mailbox_remote=function(_8d,_8e,_8f){
+this.list_mailbox_remote=function(_9c,_9d,_9e){
 this.message_list.clear();
-var url="_mbox="+urlencode(_8d)+(_8e?"&_page="+_8e:"");
+var url="_mbox="+urlencode(_9c)+(_9d?"&_page="+_9d:"");
 this.set_busy(true,"loading");
-this.http_request("list",url+_8f,true);
+this.http_request("list",url+_9e,true);
 };
-this.expunge_mailbox=function(_91){
-var _92=false;
-var _93="";
-if(_91==this.env.mailbox){
-_92=true;
+this.expunge_mailbox=function(_a0){
+var _a1=false;
+var _a2="";
+if(_a0==this.env.mailbox){
+_a1=true;
 this.set_busy(true,"loading");
-_93="&_reload=1";
+_a2="&_reload=1";
 }
-var url="_mbox="+urlencode(_91);
-this.http_post("expunge",url+_93,_92);
+var url="_mbox="+urlencode(_a0);
+this.http_post("expunge",url+_a2,_a1);
 };
-this.purge_mailbox=function(_95){
-var _96=false;
-var _97="";
+this.purge_mailbox=function(_a4){
+var _a5=false;
+var _a6="";
 if(!confirm(this.get_label("purgefolderconfirm"))){
 return false;
 }
-if(_95==this.env.mailbox){
-_96=true;
+if(_a4==this.env.mailbox){
+_a5=true;
 this.set_busy(true,"loading");
-_97="&_reload=1";
+_a6="&_reload=1";
 }
-var url="_mbox="+urlencode(_95);
-this.http_post("purge",url+_97,_96);
+var url="_mbox="+urlencode(_a4);
+this.http_post("purge",url+_a6,_a5);
 return true;
 };
 this.purge_mailbox_test=function(){
 return (this.env.messagecount&&(this.env.mailbox==this.env.trash_mailbox||this.env.mailbox==this.env.junk_mailbox||this.env.mailbox.match("^"+RegExp.escape(this.env.trash_mailbox)+RegExp.escape(this.env.delimiter))||this.env.mailbox.match("^"+RegExp.escape(this.env.junk_mailbox)+RegExp.escape(this.env.delimiter))));
 };
 this.set_message_icon=function(uid){
-var _9a;
-var _9b=this.message_list.rows;
-if(!_9b[uid]){
+var _a9;
+var _aa=this.message_list.rows;
+if(!_aa[uid]){
 return false;
 }
-if(_9b[uid].deleted&&this.env.deletedicon){
-_9a=this.env.deletedicon;
+if(_aa[uid].deleted&&this.env.deletedicon){
+_a9=this.env.deletedicon;
 }else{
-if(_9b[uid].replied&&this.env.repliedicon){
-if(_9b[uid].forwarded&&this.env.forwardedrepliedicon){
-_9a=this.env.forwardedrepliedicon;
+if(_aa[uid].replied&&this.env.repliedicon){
+if(_aa[uid].forwarded&&this.env.forwardedrepliedicon){
+_a9=this.env.forwardedrepliedicon;
 }else{
-_9a=this.env.repliedicon;
+_a9=this.env.repliedicon;
 }
 }else{
-if(_9b[uid].forwarded&&this.env.forwardedicon){
-_9a=this.env.forwardedicon;
+if(_aa[uid].forwarded&&this.env.forwardedicon){
+_a9=this.env.forwardedicon;
 }else{
-if(_9b[uid].unread&&this.env.unreadicon){
-_9a=this.env.unreadicon;
+if(_aa[uid].unread&&this.env.unreadicon){
+_a9=this.env.unreadicon;
 }else{
 if(this.env.messageicon){
-_9a=this.env.messageicon;
+_a9=this.env.messageicon;
 }
 }
 }
 }
 }
-if(_9a&&_9b[uid].icon){
-_9b[uid].icon.src=_9a;
+if(_a9&&_aa[uid].icon){
+_aa[uid].icon.src=_a9;
 }
-_9a="";
-if(_9b[uid].flagged&&this.env.flaggedicon){
-_9a=this.env.flaggedicon;
+_a9="";
+if(_aa[uid].flagged&&this.env.flaggedicon){
+_a9=this.env.flaggedicon;
 }else{
-if(!_9b[uid].flagged&&this.env.unflaggedicon){
-_9a=this.env.unflaggedicon;
+if(!_aa[uid].flagged&&this.env.unflaggedicon){
+_a9=this.env.unflaggedicon;
 }
 }
-if(_9b[uid].flagged_icon&&_9a){
-_9b[uid].flagged_icon.src=_9a;
+if(_aa[uid].flagged_icon&&_a9){
+_aa[uid].flagged_icon.src=_a9;
 }
 };
-this.set_message_status=function(uid,_9d,_9e){
-var _9f=this.message_list.rows;
-if(!_9f[uid]){
+this.set_message_status=function(uid,_ac,_ad){
+var _ae=this.message_list.rows;
+if(!_ae[uid]){
 return false;
 }
-if(_9d=="unread"){
-_9f[uid].unread=_9e;
+if(_ac=="unread"){
+_ae[uid].unread=_ad;
 }else{
-if(_9d=="deleted"){
-_9f[uid].deleted=_9e;
+if(_ac=="deleted"){
+_ae[uid].deleted=_ad;
 }else{
-if(_9d=="replied"){
-_9f[uid].replied=_9e;
+if(_ac=="replied"){
+_ae[uid].replied=_ad;
 }else{
-if(_9d=="forwarded"){
-_9f[uid].forwarded=_9e;
+if(_ac=="forwarded"){
+_ae[uid].forwarded=_ad;
 }else{
-if(_9d=="flagged"){
-_9f[uid].flagged=_9e;
+if(_ac=="flagged"){
+_ae[uid].flagged=_ad;
 }
 }
 }
 }
 }
-this.env.messages[uid]=_9f[uid];
+this.env.messages[uid]=_ae[uid];
 };
-this.set_message=function(uid,_a1,_a2){
-var _a3=this.message_list.rows;
-if(!_a3[uid]){
+this.set_message=function(uid,_b0,_b1){
+var _b2=this.message_list.rows;
+if(!_b2[uid]){
 return false;
 }
-if(_a1){
-this.set_message_status(uid,_a1,_a2);
+if(_b0){
+this.set_message_status(uid,_b0,_b1);
 }
-if(_a3[uid].unread&&_a3[uid].classname.indexOf("unread")<0){
-_a3[uid].classname+=" unread";
-this.set_classname(_a3[uid].obj,"unread",true);
+var _b3=$(_b2[uid].obj);
+if(_b2[uid].unread&&_b2[uid].classname.indexOf("unread")<0){
+_b2[uid].classname+=" unread";
+_b3.addClass("unread");
 }else{
-if(!_a3[uid].unread&&_a3[uid].classname.indexOf("unread")>=0){
-_a3[uid].classname=_a3[uid].classname.replace(/\s*unread/,"");
-this.set_classname(_a3[uid].obj,"unread",false);
+if(!_b2[uid].unread&&_b2[uid].classname.indexOf("unread")>=0){
+_b2[uid].classname=_b2[uid].classname.replace(/\s*unread/,"");
+_b3.removeClass("unread");
 }
 }
-if(_a3[uid].deleted&&_a3[uid].classname.indexOf("deleted")<0){
-_a3[uid].classname+=" deleted";
-this.set_classname(_a3[uid].obj,"deleted",true);
+if(_b2[uid].deleted&&_b2[uid].classname.indexOf("deleted")<0){
+_b2[uid].classname+=" deleted";
+_b3.addClass("deleted");
 }else{
-if(!_a3[uid].deleted&&_a3[uid].classname.indexOf("deleted")>=0){
-_a3[uid].classname=_a3[uid].classname.replace(/\s*deleted/,"");
-this.set_classname(_a3[uid].obj,"deleted",false);
+if(!_b2[uid].deleted&&_b2[uid].classname.indexOf("deleted")>=0){
+_b2[uid].classname=_b2[uid].classname.replace(/\s*deleted/,"");
+_b3.removeClass("deleted");
 }
 }
-if(_a3[uid].flagged&&_a3[uid].classname.indexOf("flagged")<0){
-_a3[uid].classname+=" flagged";
-this.set_classname(_a3[uid].obj,"flagged",true);
+if(_b2[uid].flagged&&_b2[uid].classname.indexOf("flagged")<0){
+_b2[uid].classname+=" flagged";
+_b3.addClass("flagged");
 }else{
-if(!_a3[uid].flagged&&_a3[uid].classname.indexOf("flagged")>=0){
-_a3[uid].classname=_a3[uid].classname.replace(/\s*flagged/,"");
-this.set_classname(_a3[uid].obj,"flagged",false);
+if(!_b2[uid].flagged&&_b2[uid].classname.indexOf("flagged")>=0){
+_b2[uid].classname=_b2[uid].classname.replace(/\s*flagged/,"");
+_b3.removeClass("flagged");
 }
 }
 this.set_message_icon(uid);
 };
-this.move_messages=function(_a4){
-if(!_a4||_a4==this.env.mailbox||(!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length))){
+this.move_messages=function(_b4){
+if(!_b4||_b4==this.env.mailbox||(!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length))){
 return;
 }
-var _a5=false;
-var _a6="&_target_mbox="+urlencode(_a4)+"&_from="+(this.env.action?this.env.action:"");
+var _b5=false;
+var _b6="&_target_mbox="+urlencode(_b4)+"&_from="+(this.env.action?this.env.action:"");
 if(this.env.action=="show"){
-_a5=true;
+_b5=true;
 this.set_busy(true,"movingmessage");
 }else{
-if(!this.env.flag_for_deletion){
 this.show_contentframe(false);
 }
-}
-this.enable_command("reply","reply-all","forward","delete","mark","print",false);
-this._with_selected_messages("moveto",_a5,_a6,(this.env.flag_for_deletion?false:true));
+this.enable_command("reply","reply-all","forward","delete","mark","print","open","edit","viewsource","download",false);
+this._with_selected_messages("moveto",_b5,_b6);
 };
 this.delete_messages=function(){
-var _a7=this.message_list?this.message_list.get_selection():new Array();
-if(!this.env.uid&&!_a7.length){
+var _b7=this.message_list?this.message_list.get_selection():new Array();
+if(!this.env.uid&&!_b7.length){
 return;
 }
-if(this.env.trash_mailbox&&String(this.env.mailbox).toLowerCase()!=String(this.env.trash_mailbox).toLowerCase()){
+if(this.env.flag_for_deletion){
+this.mark_message("delete");
+}else{
+if(!this.env.trash_mailbox||String(this.env.mailbox).toLowerCase()==String(this.env.trash_mailbox).toLowerCase()){
+this.permanently_remove_messages();
+}else{
 if(this.message_list&&this.message_list.shiftkey){
 if(confirm(this.get_label("deletemessagesconfirm"))){
 this.permanently_remove_messages();
@@ -1436,24 +1565,6 @@ this.permanently_remove_messages();
 }else{
 this.move_messages(this.env.trash_mailbox);
 }
-}else{
-if(this.env.trash_mailbox&&String(this.env.mailbox).toLowerCase()==String(this.env.trash_mailbox).toLowerCase()){
-this.permanently_remove_messages();
-}else{
-if(!this.env.trash_mailbox&&this.env.flag_for_deletion){
-this.mark_message("delete");
-if(this.env.action=="show"){
-this.command("nextmessage","",this);
-}else{
-if(_a7.length==1){
-this.message_list.select_next();
-}
-}
-}else{
-if(!this.env.trash_mailbox){
-this.permanently_remove_messages();
-}
-}
 }
 }
 };
@@ -1462,208 +1573,232 @@ if(!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length
 return;
 }
 this.show_contentframe(false);
-this._with_selected_messages("delete",false,"&_from="+(this.env.action?this.env.action:""),true);
+this._with_selected_messages("delete",false,"&_from="+(this.env.action?this.env.action:""));
 };
-this._with_selected_messages=function(_a8,_a9,_aa,_ab){
-var _ac=new Array();
+this._with_selected_messages=function(_b8,_b9,_ba,_bb){
+var _bc=new Array();
 if(this.env.uid){
-_ac[0]=this.env.uid;
+_bc[0]=this.env.uid;
 }else{
-var _ad=this.message_list.get_selection();
-var _ae=this.message_list.rows;
+var _bd=this.message_list.get_selection();
+var _be=this.message_list.rows;
 var id;
-for(var n=0;n<_ad.length;n++){
-id=_ad[n];
-_ac[_ac.length]=id;
-if(_ab){
-this.message_list.remove_row(id,(n==_ad.length-1));
-}else{
-this.set_message_status(id,"deleted",true);
-if(this.env.read_when_deleted){
-this.set_message_status(id,"unread",false);
-}
-this.set_message(id);
+for(var n=0;n<_bd.length;n++){
+id=_bd[n];
+_bc[_bc.length]=id;
+this.message_list.remove_row(id,(this.env.display_next&&n==_bd.length-1));
 }
+if(!this.env.display_next){
+this.message_list.clear_selection();
 }
 }
 if(this.env.search_request){
-_aa+="&_search="+this.env.search_request;
+_ba+="&_search="+this.env.search_request;
+}
+if(this.env.display_next&&this.env.next_uid){
+_ba+="&_next_uid="+this.env.next_uid;
 }
-this.http_post(_a8,"_uid="+_ac.join(",")+"&_mbox="+urlencode(this.env.mailbox)+_aa,_a9);
+this.http_post(_b8,"_uid="+_bc.join(",")+"&_mbox="+urlencode(this.env.mailbox)+_ba,_b9);
 };
-this.mark_message=function(_b1,uid){
-var _b3=new Array();
-var _b4=new Array();
-var _b5=this.message_list?this.message_list.get_selection():new Array();
+this.mark_message=function(_c1,uid){
+var _c3=new Array();
+var _c4=new Array();
+var _c5=this.message_list?this.message_list.get_selection():new Array();
 if(uid){
-_b3[0]=uid;
+_c3[0]=uid;
 }else{
 if(this.env.uid){
-_b3[0]=this.env.uid;
+_c3[0]=this.env.uid;
 }else{
 if(this.message_list){
-for(var n=0;n<_b5.length;n++){
-_b3[_b3.length]=_b5[n];
+for(var n=0;n<_c5.length;n++){
+_c3[_c3.length]=_c5[n];
 }
 }
 }
 }
 if(!this.message_list){
-_b4=_b3;
+_c4=_c3;
 }else{
-for(var id,n=0;n<_b3.length;n++){
-id=_b3[n];
-if((_b1=="read"&&this.message_list.rows[id].unread)||(_b1=="unread"&&!this.message_list.rows[id].unread)||(_b1=="delete"&&!this.message_list.rows[id].deleted)||(_b1=="undelete"&&this.message_list.rows[id].deleted)||(_b1=="flagged"&&!this.message_list.rows[id].flagged)||(_b1=="unflagged"&&this.message_list.rows[id].flagged)){
-_b4[_b4.length]=id;
+for(var id,n=0;n<_c3.length;n++){
+id=_c3[n];
+if((_c1=="read"&&this.message_list.rows[id].unread)||(_c1=="unread"&&!this.message_list.rows[id].unread)||(_c1=="delete"&&!this.message_list.rows[id].deleted)||(_c1=="undelete"&&this.message_list.rows[id].deleted)||(_c1=="flagged"&&!this.message_list.rows[id].flagged)||(_c1=="unflagged"&&this.message_list.rows[id].flagged)){
+_c4[_c4.length]=id;
 }
 }
 }
-if(!_b4.length){
+if(!_c4.length){
 return;
 }
-switch(_b1){
+switch(_c1){
 case "read":
 case "unread":
-this.toggle_read_status(_b1,_b4);
+this.toggle_read_status(_c1,_c4);
 break;
 case "delete":
 case "undelete":
-this.toggle_delete_status(_b4);
+this.toggle_delete_status(_c4);
 break;
 case "flagged":
 case "unflagged":
-this.toggle_flagged_status(_b1,_b3);
+this.toggle_flagged_status(_c1,_c3);
 break;
 }
 };
-this.toggle_read_status=function(_b8,_b9){
-for(var i=0;i<_b9.length;i++){
-this.set_message(_b9[i],"unread",(_b8=="unread"?true:false));
+this.toggle_read_status=function(_c8,_c9){
+for(var i=0;i<_c9.length;i++){
+this.set_message(_c9[i],"unread",(_c8=="unread"?true:false));
 }
-this.http_post("mark","_uid="+_b9.join(",")+"&_flag="+_b8);
+this.http_post("mark","_uid="+_c9.join(",")+"&_flag="+_c8);
 };
-this.toggle_flagged_status=function(_bb,_bc){
-for(var i=0;i<_bc.length;i++){
-this.set_message(_bc[i],"flagged",(_bb=="flagged"?true:false));
+this.toggle_flagged_status=function(_cb,_cc){
+for(var i=0;i<_cc.length;i++){
+this.set_message(_cc[i],"flagged",(_cb=="flagged"?true:false));
 }
-this.http_post("mark","_uid="+_bc.join(",")+"&_flag="+_bb);
+this.http_post("mark","_uid="+_cc.join(",")+"&_flag="+_cb);
 };
-this.toggle_delete_status=function(_be){
-var _bf=this.message_list?this.message_list.rows:new Array();
-if(_be.length==1){
-if(!_bf.length||(_bf[_be[0]]&&!_bf[_be[0]].deleted)){
-this.flag_as_deleted(_be);
+this.toggle_delete_status=function(_ce){
+var _cf=this.message_list?this.message_list.rows:new Array();
+if(_ce.length==1){
+if(!_cf.length||(_cf[_ce[0]]&&!_cf[_ce[0]].deleted)){
+this.flag_as_deleted(_ce);
 }else{
-this.flag_as_undeleted(_be);
+this.flag_as_undeleted(_ce);
 }
 return true;
 }
-var _c0=true;
-for(var i=0;i<_be.length;i++){
-uid=_be[i];
-if(_bf[uid]){
-if(!_bf[uid].deleted){
-_c0=false;
+var _d0=true;
+for(var i=0;i<_ce.length;i++){
+uid=_ce[i];
+if(_cf[uid]){
+if(!_cf[uid].deleted){
+_d0=false;
 break;
 }
 }
 }
-if(_c0){
-this.flag_as_undeleted(_be);
+if(_d0){
+this.flag_as_undeleted(_ce);
 }else{
-this.flag_as_deleted(_be);
+this.flag_as_deleted(_ce);
 }
 return true;
 };
-this.flag_as_undeleted=function(_c2){
-for(var i=0;i<_c2.length;i++){
-this.set_message(_c2[i],"deleted",false);
+this.flag_as_undeleted=function(_d2){
+for(var i=0;i<_d2.length;i++){
+this.set_message(_d2[i],"deleted",false);
 }
-this.http_post("mark","_uid="+_c2.join(",")+"&_flag=undelete");
+this.http_post("mark","_uid="+_d2.join(",")+"&_flag=undelete");
 return true;
 };
-this.flag_as_deleted=function(_c4){
-var _c5="";
-var _c6=new Array();
-var _c7=this.message_list?this.message_list.rows:new Array();
-for(var i=0;i<_c4.length;i++){
-uid=_c4[i];
-if(_c7[uid]){
+this.flag_as_deleted=function(_d4){
+var _d5="";
+var _d6=new Array();
+var _d7=this.message_list?this.message_list.rows:new Array();
+for(var i=0;i<_d4.length;i++){
+uid=_d4[i];
+if(_d7[uid]){
+if(_d7[uid].unread){
+_d6[_d6.length]=uid;
+}
+if(this.env.skip_deleted){
+this.message_list.remove_row(uid,(this.env.display_next&&i==this.message_list.selection.length-1));
+}else{
 this.set_message(uid,"deleted",true);
-if(_c7[uid].unread){
-_c6[_c6.length]=uid;
 }
 }
 }
-if(_c6.length){
-_c5="&_ruid="+_c6.join(",");
+if(this.env.skip_deleted&&!this.env.display_next&&this.message_list){
+this.message_list.clear_selection();
+}
+_d5="&_from="+(this.env.action?this.env.action:"");
+if(_d6.length){
+_d5+="&_ruid="+_d6.join(",");
+}
+if(this.env.skip_deleted){
+if(this.env.search_request){
+_d5+="&_search="+this.env.search_request;
+}
+if(this.env.display_next&&this.env.next_uid){
+_d5+="&_next_uid="+this.env.next_uid;
+}
 }
-this.http_post("mark","_uid="+_c4.join(",")+"&_flag=delete"+_c5);
+this.http_post("mark","_uid="+_d4.join(",")+"&_flag=delete"+_d5);
 return true;
 };
-this.flag_deleted_as_read=function(_c9){
-var _ca;
-var _cb=this.message_list?this.message_list.rows:new Array();
-var str=String(_c9);
-var _cd=new Array();
-_cd=str.split(",");
-for(var uid,i=0;i<_cd.length;i++){
-uid=_cd[i];
-if(_cb[uid]){
+this.flag_deleted_as_read=function(_d9){
+var _da;
+var _db=this.message_list?this.message_list.rows:new Array();
+var str=String(_d9);
+var _dd=new Array();
+_dd=str.split(",");
+for(var uid,i=0;i<_dd.length;i++){
+uid=_dd[i];
+if(_db[uid]){
 this.set_message(uid,"unread",false);
 }
 }
 };
 this.login_user_keyup=function(e){
 var key=rcube_event.get_keycode(e);
-var elm;
-if((key==13)&&(elm=rcube_find_object("_pass"))){
-elm.focus();
-return false;
+var _e2=$("#rcmloginpwd");
+if(key==13&&_e2.length&&!_e2.val()){
+_e2.focus();
+return rcube_event.cancel(e);
 }
+return true;
 };
 this.check_compose_input=function(){
-var _d3=rcube_find_object("_to");
-var _d4=rcube_find_object("_cc");
-var _d5=rcube_find_object("_bcc");
-var _d6=rcube_find_object("_from");
-var _d7=rcube_find_object("_subject");
-var _d8=rcube_find_object("_message");
-if(_d6.type=="text"&&!rcube_check_email(_d6.value,true)){
+var _e3=$("[name='_to']");
+var _e4=$("[name='_cc']");
+var _e5=$("[name='_bcc']");
+var _e6=$("[name='_from']");
+var _e7=$("[name='_subject']");
+var _e8=$("[name='_message']");
+if(_e6.attr("type")=="text"&&!rcube_check_email(_e6.val(),true)){
 alert(this.get_label("nosenderwarning"));
-_d6.focus();
+_e6.focus();
 return false;
 }
-var _d9=_d3.value?_d3.value:(_d4.value?_d4.value:_d5.value);
-if(!rcube_check_email(_d9.replace(/^\s+/,"").replace(/[\s,;]+$/,""),true)){
+var _e9=_e3.val()?_e3.val():(_e4.val()?_e4.val():_e5.val());
+if(!rcube_check_email(_e9.replace(/^\s+/,"").replace(/[\s,;]+$/,""),true)){
 alert(this.get_label("norecipientwarning"));
-_d3.focus();
+_e3.focus();
+return false;
+}
+for(var key in this.env.attachments){
+if(typeof this.env.attachments[key]=="object"&&!this.env.attachments[key].complete){
+alert(this.get_label("notuploadedwarning"));
 return false;
 }
-if(_d7&&_d7.value==""){
-var _da=prompt(this.get_label("nosubjectwarning"),this.get_label("nosubject"));
-if(!_da&&_da!==""){
-_d7.focus();
+}
+if(_e7.val()==""){
+var _eb=prompt(this.get_label("nosubjectwarning"),this.get_label("nosubject"));
+if(!_eb&&_eb!==""){
+_e7.focus();
 return false;
 }else{
-_d7.value=_da?_da:this.get_label("nosubject");
+_e7.val((_eb?_eb:this.get_label("nosubject")));
 }
 }
-if((!window.tinyMCE||!tinyMCE.get("compose-body"))&&_d8.value==""&&!confirm(this.get_label("nobodywarning"))){
-_d8.focus();
+if((!window.tinyMCE||!tinyMCE.get(this.env.composebody))&&_e8.val()==""&&!confirm(this.get_label("nobodywarning"))){
+_e8.focus();
 return false;
 }else{
-if(window.tinyMCE&&tinyMCE.get("compose-body")&&!tinyMCE.get("compose-body").getContent()&&!confirm(this.get_label("nobodywarning"))){
-tinyMCE.get("compose-body").focus();
+if(window.tinyMCE&&tinyMCE.get(this.env.composebody)&&!tinyMCE.get(this.env.composebody).getContent()&&!confirm(this.get_label("nobodywarning"))){
+tinyMCE.get(this.env.composebody).focus();
 return false;
 }
 }
 this.stop_spellchecking();
+if(window.tinyMCE&&tinyMCE.get(this.env.composebody)){
+tinyMCE.triggerSave();
+}
 return true;
 };
 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");
 }
 };
@@ -1672,19 +1807,15 @@ if(this.env.spellcheck){
 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);
 };
 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(){
 if(this.env.draft_autosave){
@@ -1694,32 +1825,36 @@ _1.command("savedraft");
 }
 this.busy=false;
 };
-this.compose_field_hash=function(_df){
-var _e0=rcube_find_object("_to");
-var _e1=rcube_find_object("_cc");
-var _e2=rcube_find_object("_bcc");
-var _e3=rcube_find_object("_subject");
-var _e4,_e5;
+this.compose_field_hash=function(_ef){
+var _f0=$("[name='_to']").val();
+var _f1=$("[name='_cc']").val();
+var _f2=$("[name='_bcc']").val();
+var _f3=$("[name='_subject']").val();
 var str="";
-if(_e0&&_e0.value){
-str+=_e0.value+":";
+if(_f0){
+str+=_f0+":";
 }
-if(_e1&&_e1.value){
-str+=_e1.value+":";
+if(_f1){
+str+=_f1+":";
 }
-if(_e2&&_e2.value){
-str+=_e2.value+":";
+if(_f2){
+str+=_f2+":";
 }
-if(_e3&&_e3.value){
-str+=_e3.value+":";
+if(_f3){
+str+=_f3+":";
 }
-if(_e4=tinyMCE.get("compose-body")){
-str+=_e4.getContent();
+var _f5=tinyMCE.get(this.env.composebody);
+if(_f5){
+str+=_f5.getContent();
 }else{
-_e5=rcube_find_object("_message");
-str+=_e5.value;
+str+=$("[name='_message']").val();
+}
+if(this.env.attachments){
+for(var _f6 in this.env.attachments){
+str+=_f6;
+}
 }
-if(_df){
+if(_ef){
 this.cmp_hash=str;
 }
 return str;
@@ -1729,14 +1864,14 @@ if(!obj||!obj.options){
 return false;
 }
 var id=obj.options[obj.selectedIndex].value;
-var _e9=rcube_find_object("_message");
-var _ea=_e9?_e9.value:"";
-var _eb=(rcube_find_object("_is_html").value=="1");
-var sig,p;
+var _f9=$("[name='_message']");
+var _fa=_f9.val();
+var _fb=($("input[name='_is_html']").val()=="1");
+var sig,p,len;
 if(!this.env.identity){
 this.env.identity=id;
 }
-if(!_eb){
+if(!_fb){
 if(this.env.identity&&this.env.signatures&&this.env.signatures[this.env.identity]){
 if(this.env.signatures[this.env.identity]["is_html"]){
 sig=this.env.signatures[this.env.identity]["plain_text"];
@@ -1746,12 +1881,13 @@ sig=this.env.signatures[this.env.identity]["text"];
 if(sig.indexOf("-- ")!=0){
 sig="-- \n"+sig;
 }
-p=_ea.lastIndexOf(sig);
+p=_fa.lastIndexOf(sig);
 if(p>=0){
-_ea=_ea.substring(0,p-1)+_ea.substring(p+sig.length,_ea.length);
+_fa=_fa.substring(0,p-1)+_fa.substring(p+sig.length,_fa.length);
 }
 }
-_ea=_ea.replace(/[\r\n]+$/,"");
+_fa=_fa.replace(/[\r\n]+$/,"");
+len=_fa.length;
 if(this.env.signatures&&this.env.signatures[id]){
 sig=this.env.signatures[id]["text"];
 if(this.env.signatures[id]["is_html"]){
@@ -1760,35 +1896,48 @@ sig=this.env.signatures[id]["plain_text"];
 if(sig.indexOf("-- ")!=0){
 sig="-- \n"+sig;
 }
-_ea+="\n\n"+sig;
+_fa+="\n\n"+sig;
+if(len){
+len+=1;
+}
 }
 }else{
-var _ee=tinyMCE.get("compose-body");
+var _ff=tinyMCE.get(this.env.composebody);
 if(this.env.signatures){
-var _ef=_ee.dom.get("_rc_sig");
-var _f0="";
-var _f1=true;
-if(!_ef){
+var _100=_ff.dom.get("_rc_sig");
+var _101="";
+var _102=true;
+if(!_100){
 if(bw.ie){
-_ee.getBody().appendChild(_ee.getDoc().createElement("br"));
+_ff.getBody().appendChild(_ff.getDoc().createElement("br"));
 }
-_ef=_ee.getDoc().createElement("div");
-_ef.setAttribute("id","_rc_sig");
-_ee.getBody().appendChild(_ef);
+_100=_ff.getDoc().createElement("div");
+_100.setAttribute("id","_rc_sig");
+_ff.getBody().appendChild(_100);
 }
 if(this.env.signatures[id]){
-_f0=this.env.signatures[id]["text"];
-_f1=this.env.signatures[id]["is_html"];
+_101=this.env.signatures[id]["text"];
+_102=this.env.signatures[id]["is_html"];
+if(_101){
+if(_102&&this.env.signatures[id]["plain_text"].indexOf("-- ")!=0){
+_101="<p>-- </p>"+_101;
+}else{
+if(!_102&&_101.indexOf("-- ")!=0){
+_101="-- \n"+_101;
 }
-if(_f1){
-_ef.innerHTML=_f0;
+}
+}
+}
+if(_102){
+_100.innerHTML=_101;
 }else{
-_ef.innerHTML="<pre>"+_f0+"</pre>";
+_100.innerHTML="<pre>"+_101+"</pre>";
 }
 }
 }
-if(_e9){
-_e9.value=_ea;
+_f9.val(_fa);
+if(!_fb){
+this.set_caret_pos(_f9.get(0),len);
 }
 this.env.identity=id;
 return true;
@@ -1797,14 +1946,12 @@ this.show_attachment_form=function(a){
 if(!this.gui_objects.uploadbox){
 return false;
 }
-var elm,_f4;
+var elm,list;
 if(elm=this.gui_objects.uploadbox){
-if(a&&(_f4=this.gui_objects.attachmentlist)){
-var pos=rcube_get_object_pos(_f4);
-var _f6=pos.x;
-var top=pos.y+_f4.offsetHeight+10;
-elm.style.top=top+"px";
-elm.style.left=_f6+"px";
+if(a&&(list=this.gui_objects.attachmentlist)){
+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";
 }
@@ -1817,51 +1964,93 @@ catch(e){
 }
 return true;
 };
-this.upload_file=function(_f8){
-if(!_f8){
+this.upload_file=function(form){
+if(!form){
 return false;
 }
-var _f9=false;
-for(var n=0;n<_f8.elements.length;n++){
-if(_f8.elements[n].type=="file"&&_f8.elements[n].value){
-_f9=true;
+var send=false;
+for(var n=0;n<form.elements.length;n++){
+if(form.elements[n].type=="file"&&form.elements[n].value){
+send=true;
 break;
 }
 }
-if(_f9){
+if(send){
 var ts=new Date().getTime();
-var _fc="rcmupload"+ts;
+var _10b="rcmupload"+ts;
 if(document.all){
-var _fd="<iframe name=\""+_fc+"\" src=\"program/blank.gif\" style=\"width:0;height:0;visibility:hidden;\"></iframe>";
-document.body.insertAdjacentHTML("BeforeEnd",_fd);
-}else{
-var _fe=document.createElement("IFRAME");
-_fe.name=_fc;
-_fe.style.border="none";
-_fe.style.width=0;
-_fe.style.height=0;
-_fe.style.visibility="hidden";
-document.body.appendChild(_fe);
-}
-_f8.target=_fc;
-_f8.action=this.env.comm_path+"&_action=upload";
-_f8.setAttribute("enctype","multipart/form-data");
-_f8.submit();
-}
-this.gui_objects.attachmentform=_f8;
+var html="<iframe name=\""+_10b+"\" src=\"program/blank.gif\" style=\"width:0;height:0;visibility:hidden;\"></iframe>";
+document.body.insertAdjacentHTML("BeforeEnd",html);
+}else{
+var _10d=document.createElement("iframe");
+_10d.name=_10b;
+_10d.style.border="none";
+_10d.style.width=0;
+_10d.style.height=0;
+_10d.style.visibility="hidden";
+document.body.appendChild(_10d);
+}
+var fr=document.getElementsByName(_10b)[0];
+$(fr).bind("load",{ts:ts},function(e){
+var _110="";
+try{
+if(this.contentDocument){
+var d=this.contentDocument;
+}else{
+if(this.contentWindow){
+var d=this.contentWindow.document;
+}
+}
+_110=d.childNodes[0].innerHTML;
+}
+catch(e){
+}
+if(!String(_110).match(/add2attachment/)&&(!bw.opera||(rcmail.env.uploadframe&&rcmail.env.uploadframe==e.data.ts))){
+rcmail.display_message(rcmail.get_label("fileuploaderror"),"error");
+rcmail.remove_from_attachment_list(e.data.ts);
+}
+if(bw.opera){
+rcmail.env.uploadframe=e.data.ts;
+}
+});
+form.target=_10b;
+form.action=this.env.comm_path+"&_action=upload&_uploadid="+ts;
+form.setAttribute("enctype","multipart/form-data");
+form.submit();
+this.show_attachment_form(false);
+var _112=this.get_label("uploading");
+if(this.env.loadingicon){
+_112="<img src=\""+this.env.loadingicon+"\" alt=\"\" />"+_112;
+}
+if(this.env.cancelicon){
+_112="<a title=\""+this.get_label("cancel")+"\" onclick=\"return rcmail.cancel_attachment_upload('"+ts+"', '"+_10b+"');\" href=\"#cancelupload\"><img src=\""+this.env.cancelicon+"\" alt=\"\" /></a>"+_112;
+}
+this.add2attachment_list(ts,{name:"",html:_112,complete:false});
+}
+this.gui_objects.attachmentform=form;
 return true;
 };
-this.add2attachment_list=function(_ff,_100){
+this.add2attachment_list=function(name,att,_115){
 if(!this.gui_objects.attachmentlist){
 return false;
 }
-var li=document.createElement("LI");
-li.id=_ff;
-li.innerHTML=_100;
-this.gui_objects.attachmentlist.appendChild(li);
+var li=$("<li>").attr("id",name).html(att.html);
+var _117;
+if(_115&&(_117=document.getElementById(_115))){
+li.replaceAll(_117);
+}else{
+li.appendTo(this.gui_objects.attachmentlist);
+}
+if(_115&&this.env.attachments[_115]){
+delete this.env.attachments[_115];
+}
+this.env.attachments[name]=att;
 return true;
 };
 this.remove_from_attachment_list=function(name){
+if(this.env.attachments[name]){
+delete this.env.attachments[name];
+}
 if(!this.gui_objects.attachmentlist){
 return false;
 }
@@ -1873,21 +2062,37 @@ this.gui_objects.attachmentlist.removeChild(list[i]);
 }
 };
 this.remove_attachment=function(name){
-if(name){
+if(name&&this.env.attachments[name]){
 this.http_post("remove-attachment","_file="+urlencode(name));
 }
 return true;
 };
-this.add_contact=function(_105){
-if(_105){
-this.http_post("addcontact","_address="+_105);
+this.cancel_attachment_upload=function(name,_11c){
+if(!name||!_11c){
+return false;
+}
+this.remove_from_attachment_list(name);
+$("iframe[name='"+_11c+"']").remove();
+return false;
+};
+this.add_contact=function(_11d){
+if(_11d){
+this.http_post("addcontact","_address="+_11d);
 }
 return true;
 };
-this.qsearch=function(_106,_107){
-if(_106!=""){
+this.qsearch=function(_11e){
+if(_11e!=""){
+var _11f="";
 if(this.message_list){
 this.message_list.clear();
+if(this.env.search_mods){
+var _120=new Array();
+for(var n in this.env.search_mods){
+_120.push(n);
+}
+_11f+="&_headers="+_120.join(",");
+}
 }else{
 if(this.contact_list){
 this.contact_list.clear(true);
@@ -1895,11 +2100,11 @@ this.show_contentframe(false);
 }
 }
 if(this.gui_objects.search_filter){
-_107="&_filter="+this.gui_objects.search_filter.value;
+_11f+="&_filter="+this.gui_objects.search_filter.value;
 }
 this.env.current_page=1;
 this.set_busy(true,"searching");
-this.http_request("search","_q="+urlencode(_106)+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):"")+(this.env.source?"&_source="+urlencode(this.env.source):"")+(_107?_107:""),true);
+this.http_request("search","_q="+urlencode(_11e)+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):"")+(this.env.source?"&_source="+urlencode(this.env.source):"")+(_11f?_11f:""),true);
 }
 return true;
 };
@@ -1918,7 +2123,7 @@ this.ksearch_keypress=function(e,obj){
 if(this.ksearch_timer){
 clearTimeout(this.ksearch_timer);
 }
-var _10c;
+var _126;
 var key=rcube_event.get_keycode(e);
 var mod=rcube_event.get_modifier(e);
 switch(key){
@@ -1928,12 +2133,12 @@ if(!this.ksearch_pane){
 break;
 }
 var dir=key==38?1:0;
-_10c=document.getElementById("rcmksearchSelected");
-if(!_10c){
-_10c=this.ksearch_pane.ul.firstChild;
+_126=document.getElementById("rcmksearchSelected");
+if(!_126){
+_126=this.ksearch_pane.__ul.firstChild;
 }
-if(_10c){
-this.ksearch_select(dir?_10c.previousSibling:_10c.nextSibling);
+if(_126){
+this.ksearch_select(dir?_126.previousSibling:_126.nextSibling);
 }
 return rcube_event.cancel(e);
 case 9:
@@ -1950,6 +2155,11 @@ return rcube_event.cancel(e);
 case 27:
 this.ksearch_hide();
 break;
+case 37:
+case 39:
+if(mod!=SHIFT_KEY){
+return;
+}
 }
 this.ksearch_timer=window.setTimeout(function(){
 _1.ksearch_get_results();
@@ -1958,14 +2168,12 @@ this.ksearch_input=obj;
 return true;
 };
 this.ksearch_select=function(node){
-var _111=document.getElementById("rcmksearchSelected");
-if(_111&&node){
-_111.removeAttribute("id");
-this.set_classname(_111,"selected",false);
+var _12b=$("#rcmksearchSelected");
+if(_12b[0]&&node){
+_12b.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;
 }
 };
@@ -1973,101 +2181,88 @@ this.insert_recipient=function(id){
 if(!this.env.contacts[id]||!this.ksearch_input){
 return;
 }
-var _113=this.ksearch_input.value.toLowerCase();
+var _12d=this.ksearch_input.value;
 var cpos=this.get_caret_pos(this.ksearch_input);
-var p=_113.lastIndexOf(this.ksearch_value,cpos);
+var p=_12d.lastIndexOf(this.ksearch_value,cpos);
 var pre=this.ksearch_input.value.substring(0,p);
 var end=this.ksearch_input.value.substring(p+this.ksearch_value.length,this.ksearch_input.value.length);
-var _118=this.env.contacts[id]+", ";
-this.ksearch_input.value=pre+_118+end;
-cpos=p+_118.length;
+var _132=this.env.contacts[id]+", ";
+this.ksearch_input.value=pre+_132+end;
+cpos=p+_132.length;
 if(this.ksearch_input.setSelectionRange){
 this.ksearch_input.setSelectionRange(cpos,cpos);
 }
 };
 this.ksearch_get_results=function(){
-var _119=this.ksearch_input?this.ksearch_input.value:null;
-if(_119===null){
+var _133=this.ksearch_input?this.ksearch_input.value:null;
+if(_133===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();
 }
 var cpos=this.get_caret_pos(this.ksearch_input);
-var p=_119.lastIndexOf(",",cpos-1);
-var q=_119.substring(p+1,cpos);
-q=q.replace(/(^\s+|\s+$)/g,"").toLowerCase();
-if(!q.length||q==this.ksearch_value){
+var p=_133.lastIndexOf(",",cpos-1);
+var q=_133.substring(p+1,cpos);
+q=q.replace(/(^\s+|\s+$)/g,"");
+if(q==this.ksearch_value){
 return;
 }
+var _137=this.ksearch_value;
 this.ksearch_value=q;
+if(!q.length){
+return;
+}
+if(_137&&_137.length&&this.env.contacts&&!this.env.contacts.length&&q.indexOf(_137)==0){
+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(_11d){
-this.hide_message();
-this.env.contacts=_11d?_11d:[];
-var _11e=new Array();
-var c=0;
-for(var i=0;i<this.env.contacts.length;i++){
-_11e[c++]=i;
-if(c==15){
-break;
-}
+this.ksearch_query_results=function(_138,_139){
+if(this.ksearch_value&&_139!=this.ksearch_value){
+return;
 }
-this.ksearch_display_results(this.env.contacts,_11e,c);
+this.hide_message();
+this.env.contacts=_138?_138:[];
+this.ksearch_display_results(this.env.contacts);
 };
-this.ksearch_display_results=function(_121,_122,c){
-if(c&&_121.length&&this.ksearch_input){
+this.ksearch_display_results=function(_13a){
+if(_13a.length&&this.ksearch_input){
 var p,ul,li;
 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;
-}else{
-ul=this.ksearch_pane.ul;
+ul=$("<ul>");
+this.ksearch_pane=$("<div>").attr("id","rcmKSearchpane").css({position:"absolute","z-index":30000}).append(ul).appendTo(document.body);
+this.ksearch_pane.__ul=ul[0];
 }
+ul=this.ksearch_pane.__ul;
 ul.innerHTML="";
-for(i=0;i<_121.length;i++){
+for(i=0;i<_13a.length;i++){
 li=document.createElement("LI");
-li.innerHTML=_121[i].replace(new RegExp("("+this.ksearch_value+")","ig"),"##$1%%").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/##([^%]+)%%/g,"<b>$1</b>");
+li.innerHTML=_13a[i].replace(new RegExp("("+this.ksearch_value+")","ig"),"##$1%%").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/##([^%]+)%%/g,"<b>$1</b>");
 li.onmouseover=function(){
 _1.ksearch_select(this);
 };
 li.onmouseup=function(){
 _1.ksearch_click(this);
 };
-li._rcm_id=_122[i];
+li._rcm_id=i;
 ul.appendChild(li);
 }
-if(this.ksearch_selected!==null){
-p=find_in_array(this.ksearch_selected,_122);
-if(p>=0&&ul.childNodes){
-ul.childNodes[p].setAttribute("id","rcmksearchSelected");
-this.set_classname(ul.childNodes[p],"selected",true);
-}else{
-this.ksearch_selected=null;
-}
-}
-if(this.ksearch_selected===null){
-ul.firstChild.setAttribute("id","rcmksearchSelected");
-this.set_classname(ul.firstChild,"selected",true);
-this.ksearch_selected=_122[0];
-}
-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);
+$(ul.firstChild).attr("id","rcmksearchSelected").addClass("selected");
+this.ksearch_selected=0;
+var pos=$(this.ksearch_input).offset();
+this.ksearch_pane.css({left:pos.left+"px",top:(pos.top+this.ksearch_input.offsetHeight)+"px"}).show();
 }else{
 this.ksearch_hide();
 }
 };
 this.ksearch_click=function(node){
-this.insert_recipient(node._rcm_id);
-this.ksearch_hide();
-if(_1.ksearch_input){
+if(this.ksearch_input){
 this.ksearch_input.focus();
 }
+this.insert_recipient(node._rcm_id);
+this.ksearch_hide();
 };
 this.ksearch_blur=function(){
 if(this.ksearch_timer){
@@ -2080,7 +2275,7 @@ this.ksearch_hide();
 this.ksearch_hide=function(){
 this.ksearch_selected=null;
 if(this.ksearch_pane){
-this.ksearch_pane.show(0);
+this.ksearch_pane.hide();
 }
 };
 this.contactlist_keypress=function(list){
@@ -2092,7 +2287,7 @@ this.contactlist_select=function(list){
 if(this.preview_timer){
 clearTimeout(this.preview_timer);
 }
-var id,_12c,_1=this;
+var id,_143,_1=this;
 if(id=list.get_single_selection()){
 this.preview_timer=window.setTimeout(function(){
 _1.load_contact(id,"show");
@@ -2108,8 +2303,8 @@ this.enable_command("delete",list.selection.length&&this.env.address_sources&&!t
 return false;
 };
 this.list_contacts=function(src,page){
-var _12f="";
-var _130=window;
+var _146="";
+var _147=window;
 if(!src){
 src=this.env.source;
 }
@@ -2128,14 +2323,14 @@ this.list_contacts_remote(src,page);
 return;
 }
 if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_130=window.frames[this.env.contentframe];
-_12f="&_framed=1";
+_147=window.frames[this.env.contentframe];
+_146="&_framed=1";
 }
 if(this.env.search_request){
-_12f+="&_search="+this.env.search_request;
+_146+="&_search="+this.env.search_request;
 }
 this.set_busy(true,"loading");
-_130.location.href=this.env.comm_path+(src?"&_source="+urlencode(src):"")+(page?"&_page="+page:"")+_12f;
+_147.location.href=this.env.comm_path+(src?"&_source="+urlencode(src):"")+(page?"&_page="+page:"")+_146;
 };
 this.list_contacts_remote=function(src,page){
 this.contact_list.clear(true);
@@ -2149,21 +2344,21 @@ url+="&_search="+this.env.search_request;
 this.set_busy(true,"loading");
 this.http_request("list",url,true);
 };
-this.load_contact=function(cid,_135,_136){
-var _137="";
-var _138=window;
+this.load_contact=function(cid,_14c,_14d){
+var _14e="";
+var _14f=window;
 if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_137="&_framed=1";
-_138=window.frames[this.env.contentframe];
+_14e="&_framed=1";
+_14f=window.frames[this.env.contentframe];
 this.show_contentframe(true);
 }else{
-if(_136){
+if(_14d){
 return false;
 }
 }
-if(_135&&(cid||_135=="add")&&!this.drag_active){
+if(_14c&&(cid||_14c=="add")&&!this.drag_active){
 this.set_busy(true);
-_138.location.href=this.env.comm_path+"&_action="+_135+"&_source="+urlencode(this.env.source)+"&_cid="+urlencode(cid)+_137;
+_14f.location.href=this.env.comm_path+"&_action="+_14c+"&_source="+urlencode(this.env.source)+"&_cid="+urlencode(cid)+_14e;
 }
 return true;
 };
@@ -2176,43 +2371,72 @@ this.http_post("copy","_cid="+urlencode(cid)+"&_source="+urlencode(this.env.sour
 }
 };
 this.delete_contacts=function(){
-var _13b=this.contact_list.get_selection();
-if(!(_13b.length||this.env.cid)||!confirm(this.get_label("deletecontactconfirm"))){
+var _152=this.contact_list.get_selection();
+if(!(_152.length||this.env.cid)||!confirm(this.get_label("deletecontactconfirm"))){
 return;
 }
-var _13c=new Array();
+var _153=new Array();
 var qs="";
 if(this.env.cid){
-_13c[_13c.length]=this.env.cid;
+_153[_153.length]=this.env.cid;
 }else{
 var id;
-for(var n=0;n<_13b.length;n++){
-id=_13b[n];
-_13c[_13c.length]=id;
-this.contact_list.remove_row(id,(n==_13b.length-1));
+for(var n=0;n<_152.length;n++){
+id=_152[n];
+_153[_153.length]=id;
+this.contact_list.remove_row(id,(n==_152.length-1));
 }
-if(_13b.length==1){
+if(_152.length==1){
 this.show_contentframe(false);
 }
 }
 if(this.env.search_request){
 qs+="&_search="+this.env.search_request;
 }
-this.http_post("delete","_cid="+urlencode(_13c.join(","))+"&_source="+urlencode(this.env.source)+"&_from="+(this.env.action?this.env.action:"")+qs);
+this.http_post("delete","_cid="+urlencode(_153.join(","))+"&_source="+urlencode(this.env.source)+"&_from="+(this.env.action?this.env.action:"")+qs);
 return true;
 };
-this.update_contact_row=function(cid,_141){
+this.update_contact_row=function(cid,_158,_159){
 var row;
 if(this.contact_list.rows[cid]&&(row=this.contact_list.rows[cid].obj)){
-for(var c=0;c<_141.length;c++){
+for(var c=0;c<_158.length;c++){
 if(row.cells[c]){
-row.cells[c].innerHTML=_141[c];
+$(row.cells[c]).html(_158[c]);
 }
 }
+if(_159){
+row.id="rcmrow"+_159;
+this.contact_list.remove_row(cid);
+this.contact_list.init_row(row);
+this.contact_list.selection[0]=_159;
+row.style.display="";
+}
 return true;
 }
 return false;
 };
+this.add_contact_row=function(cid,cols,_15e){
+if(!this.gui_objects.contactslist||!this.gui_objects.contactslist.tBodies[0]){
+return false;
+}
+var _15f=this.gui_objects.contactslist.tBodies[0];
+var _160=_15f.rows.length;
+var even=_160%2;
+var row=document.createElement("tr");
+row.id="rcmrow"+cid;
+row.className="contact "+(even?"even":"odd");
+if(this.contact_list.in_selection(cid)){
+row.className+=" selected";
+}
+for(var c in cols){
+col=document.createElement("td");
+col.className=String(c).toLowerCase();
+col.innerHTML=cols[c];
+row.appendChild(col);
+}
+this.contact_list.insert_row(row);
+this.enable_command("export",(this.contact_list.rowcount>0));
+};
 this.init_subscription_list=function(){
 var p=this;
 this.subscription_list=new rcube_list_widget(this.gui_objects.subscriptionlist,{multiselect:false,draggable:true,keyboard:false,toggleselect:true});
@@ -2226,15 +2450,15 @@ this.subscription_list.addEventListener("dragend",function(o){
 p.subscription_move_folder(o);
 });
 this.subscription_list.row_init=function(row){
-var _149=row.obj.getElementsByTagName("A");
-if(_149[0]){
-_149[0].onclick=function(){
+var _169=row.obj.getElementsByTagName("a");
+if(_169[0]){
+_169[0].onclick=function(){
 p.rename_folder(row.id);
 return false;
 };
 }
-if(_149[1]){
-_149[1].onclick=function(){
+if(_169[1]){
+_169[1].onclick=function(){
 p.delete_folder(row.id);
 return false;
 };
@@ -2248,85 +2472,99 @@ p.unfocus_subscription(row.id);
 };
 this.subscription_list.init();
 };
+this.section_select=function(list){
+var id=list.get_single_selection();
+if(id){
+var _16c="";
+var _16d=window;
+this.set_busy(true);
+if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
+_16c="&_framed=1";
+_16d=window.frames[this.env.contentframe];
+}
+_16d.location.href=this.env.comm_path+"&_action=edit-prefs&_section="+id+_16c;
+}
+return true;
+};
 this.identity_select=function(list){
 var id;
 if(id=list.get_single_selection()){
 this.load_identity(id,"edit-identity");
 }
 };
-this.load_identity=function(id,_14d){
-if(_14d=="edit-identity"&&(!id||id==this.env.iid)){
+this.load_identity=function(id,_171){
+if(_171=="edit-identity"&&(!id||id==this.env.iid)){
 return false;
 }
-var _14e="";
-var _14f=window;
+var _172="";
+var _173=window;
 if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_14e="&_framed=1";
-_14f=window.frames[this.env.contentframe];
+_172="&_framed=1";
+_173=window.frames[this.env.contentframe];
 document.getElementById(this.env.contentframe).style.visibility="inherit";
 }
-if(_14d&&(id||_14d=="add-identity")){
+if(_171&&(id||_171=="add-identity")){
 this.set_busy(true);
-_14f.location.href=this.env.comm_path+"&_action="+_14d+"&_iid="+id+_14e;
+_173.location.href=this.env.comm_path+"&_action="+_171+"&_iid="+id+_172;
 }
 return true;
 };
 this.delete_identity=function(id){
-var _151=this.identity_list.get_selection();
-if(!(_151.length||this.env.iid)){
+var _175=this.identity_list.get_selection();
+if(!(_175.length||this.env.iid)){
 return;
 }
 if(!id){
-id=this.env.iid?this.env.iid:_151[0];
+id=this.env.iid?this.env.iid:_175[0];
 }
-this.goto_url("delete-identity","_iid="+id,true);
+this.goto_url("delete-identity","_iid="+id+"&_token="+this.env.request_token,true);
 return true;
 };
 this.focus_subscription=function(id){
-var row,_154;
+var row,_178;
 var 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]&&(_154=this.env.subscriptionrows[id][0])){
-if(this.check_droptarget(_154)&&!this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2]&&(_154!=this.env.folder.replace(reg,""))&&(!_154.match(new RegExp("^"+RegExp.escape(this.env.folder+this.env.delimiter))))){
-this.set_env("dstfolder",_154);
-this.set_classname(row,"droptarget",true);
+if(this.env.subscriptionrows[id]&&(_178=this.env.subscriptionrows[id][0])){
+if(this.check_droptarget(_178)&&!this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2]&&(_178!=this.env.folder.replace(reg,""))&&(!_178.match(new RegExp("^"+RegExp.escape(this.env.folder+this.env.delimiter))))){
+this.set_env("dstfolder",_178);
+$(row).addClass("droptarget");
 }
 }else{
 if(this.env.folder.match(new RegExp(RegExp.escape(this.env.delimiter)))){
 this.set_env("dstfolder",this.env.delimiter);
-this.set_classname(this.subscription_list.frame,"droptarget",true);
+$(this.subscription_list.frame).addClass("droptarget");
 }
 }
 }
 };
 this.unfocus_subscription=function(id){
-var row;
+var row=$("#"+id);
 this.set_env("dstfolder",null);
-if(this.env.subscriptionrows[id]&&(row=document.getElementById(id))){
-this.set_classname(row,"droptarget",false);
+if(this.env.subscriptionrows[id]&&row[0]){
+row.removeClass("droptarget");
 }else{
-this.set_classname(this.subscription_list.frame,"droptarget",false);
+$(this.subscription_list.frame).removeClass("droptarget");
 }
 };
 this.subscription_select=function(list){
-var id,_15a;
-if((id=list.get_single_selection())&&this.env.subscriptionrows["rcmrow"+id]&&(_15a=this.env.subscriptionrows["rcmrow"+id][0])){
-this.set_env("folder",_15a);
+var id,_17e;
+if((id=list.get_single_selection())&&this.env.subscriptionrows["rcmrow"+id]&&(_17e=this.env.subscriptionrows["rcmrow"+id][0])){
+this.set_env("folder",_17e);
 }else{
 this.set_env("folder",null);
 }
 if(this.gui_objects.createfolderhint){
-this.gui_objects.createfolderhint.innerHTML=this.env.folder?this.get_label("addsubfolderhint"):"";
+$(this.gui_objects.createfolderhint).html(this.env.folder?this.get_label("addsubfolderhint"):"");
 }
 };
 this.subscription_move_folder=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,""))){
 var reg=new RegExp("[^"+RegExp.escape(this.env.delimiter)+"]*["+RegExp.escape(this.env.delimiter)+"]","g");
-var _15d=this.env.folder.replace(reg,"");
-var _15e=this.env.dstfolder==this.env.delimiter?_15d:this.env.dstfolder+this.env.delimiter+_15d;
+var _181=this.env.folder.replace(reg,"");
+var _182=this.env.dstfolder==this.env.delimiter?_181:this.env.dstfolder+this.env.delimiter+_181;
 this.set_busy(true,"foldermoving");
-this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.folder)+"&_folder_newname="+urlencode(_15e),true);
+this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.folder)+"&_folder_newname="+urlencode(_182),true);
 }
 this.drag_active=false;
 this.unfocus_subscription(this.get_folder_row_id(this.env.dstfolder));
@@ -2363,9 +2601,9 @@ return;
 }
 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=document.createElement("input");
+this.name_input.type="text";
 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,"");
 this.name_input.onkeypress=function(e){
@@ -2384,24 +2622,24 @@ return false;
 this.reset_folder_rename=function(){
 var cell=this.name_input?this.name_input.parentNode:null;
 if(cell&&this.edit_folder&&this.env.subscriptionrows[this.edit_folder]){
-cell.innerHTML=this.env.subscriptionrows[this.edit_folder][1];
+$(cell).html(this.env.subscriptionrows[this.edit_folder][1]);
 }
 this.edit_folder=null;
 };
 this.name_input_keypress=function(e){
 var key=rcube_event.get_keycode(e);
 if(key==13){
-var _16a=this.name_input?this.name_input.value:null;
-if(this.edit_folder&&_16a){
-if(_16a.indexOf(this.env.delimiter)>=0){
+var _18e=this.name_input?this.name_input.value:null;
+if(this.edit_folder&&_18e){
+if(_18e.indexOf(this.env.delimiter)>=0){
 alert(this.get_label("forbiddencharacter")+" ("+this.env.delimiter+")");
 return false;
 }
 if(this.name_input.__parent){
-_16a=this.name_input.__parent+this.env.delimiter+_16a;
+_18e=this.name_input.__parent+this.env.delimiter+_18e;
 }
 this.set_busy(true,"folderrenaming");
-this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.subscriptionrows[this.edit_folder][0])+"&_folder_newname="+urlencode(_16a),true);
+this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.subscriptionrows[this.edit_folder][0])+"&_folder_newname="+urlencode(_18e),true);
 }
 }else{
 if(key==27){
@@ -2410,60 +2648,58 @@ this.reset_folder_rename();
 }
 };
 this.delete_folder=function(id){
-var _16c=this.env.subscriptionrows[id][0];
+var _190=this.env.subscriptionrows[id][0];
 if(this.edit_folder){
 this.reset_folder_rename();
 }
-if(_16c&&confirm(this.get_label("deletefolderconfirm"))){
+if(_190&&confirm(this.get_label("deletefolderconfirm"))){
 this.set_busy(true,"folderdeleting");
-this.http_post("delete-folder","_mboxes="+urlencode(_16c),true);
+this.http_post("delete-folder","_mboxes="+urlencode(_190),true);
 this.set_env("folder",null);
-if(this.gui_objects.createfolderhint){
-this.gui_objects.createfolderhint.innerHTML="";
-}
+$(this.gui_objects.createfolderhint).html("");
 }
 };
-this.add_folder_row=function(name,_16e,_16f,_170){
+this.add_folder_row=function(name,_192,_193,_194){
 if(!this.gui_objects.subscriptionlist){
 return false;
 }
-for(var _171 in this.env.subscriptionrows){
-if(this.env.subscriptionrows[_171]!=null&&!this.env.subscriptionrows[_171][2]){
+for(var _195 in this.env.subscriptionrows){
+if(this.env.subscriptionrows[_195]!=null&&!this.env.subscriptionrows[_195][2]){
 break;
 }
 }
-var _172,form;
-var _174=this.gui_objects.subscriptionlist.tBodies[0];
-var id="rcmrow"+(_174.childNodes.length+1);
-var _176=this.subscription_list.get_single_selection();
-if(_16f&&_16f.id){
-id=_16f.id;
-_171=_16f.id;
+var _196,form;
+var _198=this.gui_objects.subscriptionlist.tBodies[0];
+var id="rcmrow"+(_198.childNodes.length+1);
+var _19a=this.subscription_list.get_single_selection();
+if(_193&&_193.id){
+id=_193.id;
+_195=_193.id;
 }
-if(!id||!(_172=document.getElementById(_171))){
+if(!id||!(_196=document.getElementById(_195))){
 this.goto_url("folders");
 }else{
-var row=this.clone_table_row(_172);
+var row=this.clone_table_row(_196);
 row.id=id;
-if(_170&&(_170=this.get_folder_row_id(_170))){
-_174.insertBefore(row,document.getElementById(_170));
+if(_194&&(_194=this.get_folder_row_id(_194))){
+_198.insertBefore(row,document.getElementById(_194));
 }else{
-_174.appendChild(row);
+_198.appendChild(row);
 }
-if(_16f){
-_174.removeChild(_16f);
+if(_193){
+_198.removeChild(_193);
 }
 }
-this.env.subscriptionrows[row.id]=[name,_16e,0];
-row.cells[0].innerHTML=_16e;
-if(!_16f){
+this.env.subscriptionrows[row.id]=[name,_192,0];
+row.cells[0].innerHTML=_192;
+if(!_193){
 row.cells[1].innerHTML="*";
 }
-if(!_16f&&row.cells[2]&&row.cells[2].firstChild.tagName=="INPUT"){
+if(!_193&&row.cells[2]&&row.cells[2].firstChild.tagName.toLowerCase()=="input"){
 row.cells[2].firstChild.value=name;
 row.cells[2].firstChild.checked=true;
 }
-if(!_16f&&(form=this.gui_objects.editform)){
+if(!_193&&(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);
 }
@@ -2472,39 +2708,39 @@ form.elements["_folder_name"].value="";
 }
 }
 this.init_subscription_list();
-if(_176&&document.getElementById("rcmrow"+_176)){
-this.subscription_list.select_row(_176);
+if(_19a&&document.getElementById("rcmrow"+_19a)){
+this.subscription_list.select_row(_19a);
 }
 if(document.getElementById(id).scrollIntoView){
 document.getElementById(id).scrollIntoView();
 }
 };
-this.replace_folder_row=function(_178,_179,_17a,_17b){
-var id=this.get_folder_row_id(_178);
+this.replace_folder_row=function(_19c,_19d,_19e,_19f){
+var id=this.get_folder_row_id(_19c);
 var row=document.getElementById(id);
-this.add_folder_row(_179,_17a,row,_17b);
+this.add_folder_row(_19d,_19e,row,_19f);
 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==_178){
-elm.options[i].text=_17a;
-elm.options[i].value=_179;
+if(elm.options[i].value==_19c){
+elm.options[i].text=_19e;
+elm.options[i].value=_19d;
 break;
 }
 }
 form.elements["_folder_newname"].value="";
 }
 };
-this.remove_folder_row=function(_181){
+this.remove_folder_row=function(_1a5){
 var row;
-var id=this.get_folder_row_id(_181);
+var id=this.get_folder_row_id(_1a5);
 if(id&&(row=document.getElementById(id))){
 row.style.display="none";
 }
 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==_181){
+if(form.elements["_folder_oldname"].options[i].value==_1a5){
 form.elements["_folder_oldname"].options[i]=null;
 break;
 }
@@ -2514,19 +2750,19 @@ if(form&&form.elements["_folder_newname"]){
 form.elements["_folder_newname"].value="";
 }
 };
-this.subscribe_folder=function(_186){
-if(_186){
-this.http_post("subscribe","_mbox="+urlencode(_186));
+this.subscribe_folder=function(_1aa){
+if(_1aa){
+this.http_post("subscribe","_mbox="+urlencode(_1aa));
 }
 };
-this.unsubscribe_folder=function(_187){
-if(_187){
-this.http_post("unsubscribe","_mbox="+urlencode(_187));
+this.unsubscribe_folder=function(_1ab){
+if(_1ab){
+this.http_post("unsubscribe","_mbox="+urlencode(_1ab));
 }
 };
-this.get_folder_row_id=function(_188){
+this.get_folder_row_id=function(_1ac){
 for(var id in this.env.subscriptionrows){
-if(this.env.subscriptionrows[id]&&this.env.subscriptionrows[id][0]==_188){
+if(this.env.subscriptionrows[id]&&this.env.subscriptionrows[id][0]==_1ac){
 break;
 }
 }
@@ -2534,10 +2770,10 @@ return id;
 };
 this.clone_table_row=function(row){
 var cell,td;
-var _18d=document.createElement("TR");
+var _1b1=document.createElement("tr");
 for(var n=0;n<row.cells.length;n++){
 cell=row.cells[n];
-td=document.createElement("TD");
+td=document.createElement("td");
 if(cell.className){
 td.className=cell.className;
 }
@@ -2545,9 +2781,9 @@ if(cell.align){
 td.setAttribute("align",cell.align);
 }
 td.innerHTML=cell.innerHTML;
-_18d.appendChild(td);
+_1b1.appendChild(td);
 }
-return _18d;
+return _1b1;
 };
 this.set_page_buttons=function(){
 this.enable_command("nextpage",(this.env.pagecount>this.env.current_page));
@@ -2555,121 +2791,167 @@ this.enable_command("lastpage",(this.env.pagecount>this.env.current_page));
 this.enable_command("previouspage",(this.env.current_page>1));
 this.enable_command("firstpage",(this.env.current_page>1));
 };
-this.set_button=function(_18f,_190){
-var _191=this.buttons[_18f];
-var _192,obj;
-if(!_191||!_191.length){
+this.init_buttons=function(){
+for(var cmd in this.buttons){
+if(typeof cmd!="string"){
+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 _1b7=false;
+if(prop.type=="image"){
+elm=elm.parentNode;
+_1b7=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(_1b7){
+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(_1b7){
+new Image().src=prop.over;
+}
+}
+}
+}
+};
+this.set_button=function(_1bc,_1bd){
+var _1be=this.buttons[_1bc];
+var _1bf,obj;
+if(!_1be||!_1be.length){
 return false;
 }
-for(var n=0;n<_191.length;n++){
-_192=_191[n];
-obj=document.getElementById(_192.id);
-if(obj&&_192.type=="image"&&!_192.status){
-_192.pas=obj._original_src?obj._original_src:obj.src;
+for(var n=0;n<_1be.length;n++){
+_1bf=_1be[n];
+obj=document.getElementById(_1bf.id);
+if(obj&&_1bf.type=="image"&&!_1bf.status){
+_1bf.pas=obj._original_src?obj._original_src:obj.src;
 if(obj.runtimeStyle&&obj.runtimeStyle.filter&&obj.runtimeStyle.filter.match(/src=['"]([^'"]+)['"]/)){
-_192.pas=RegExp.$1;
+_1bf.pas=RegExp.$1;
 }
 }else{
-if(obj&&!_192.status){
-_192.pas=String(obj.className);
+if(obj&&!_1bf.status){
+_1bf.pas=String(obj.className);
 }
 }
-if(obj&&_192.type=="image"&&_192[_190]){
-_192.status=_190;
-obj.src=_192[_190];
+if(obj&&_1bf.type=="image"&&_1bf[_1bd]){
+_1bf.status=_1bd;
+obj.src=_1bf[_1bd];
 }else{
-if(obj&&typeof (_192[_190])!="undefined"){
-_192.status=_190;
-obj.className=_192[_190];
+if(obj&&typeof (_1bf[_1bd])!="undefined"){
+_1bf.status=_1bd;
+obj.className=_1bf[_1bd];
 }
 }
-if(obj&&_192.type=="input"){
-_192.status=_190;
-obj.disabled=!_190;
+if(obj&&_1bf.type=="input"){
+_1bf.status=_1bd;
+obj.disabled=!_1bd;
 }
 }
 };
-this.set_alttext=function(_195,_196){
-if(!this.buttons[_195]||!this.buttons[_195].length){
+this.set_alttext=function(_1c2,_1c3){
+if(!this.buttons[_1c2]||!this.buttons[_1c2].length){
 return;
 }
-var _197,obj,link;
-for(var n=0;n<this.buttons[_195].length;n++){
-_197=this.buttons[_195][n];
-obj=document.getElementById(_197.id);
-if(_197.type=="image"&&obj){
-obj.setAttribute("alt",this.get_label(_196));
-if((link=obj.parentNode)&&link.tagName=="A"){
-link.setAttribute("title",this.get_label(_196));
+var _1c4,obj,link;
+for(var n=0;n<this.buttons[_1c2].length;n++){
+_1c4=this.buttons[_1c2][n];
+obj=document.getElementById(_1c4.id);
+if(_1c4.type=="image"&&obj){
+obj.setAttribute("alt",this.get_label(_1c3));
+if((link=obj.parentNode)&&link.tagName.toLowerCase()=="a"){
+link.setAttribute("title",this.get_label(_1c3));
 }
 }else{
 if(obj){
-obj.setAttribute("title",this.get_label(_196));
+obj.setAttribute("title",this.get_label(_1c3));
 }
 }
 }
 };
-this.button_over=function(_19b,id){
-var _19d=this.buttons[_19b];
-var _19e,img;
-if(!_19d||!_19d.length){
+this.button_over=function(_1c8,id){
+var _1ca=this.buttons[_1c8];
+var _1cb,elm;
+if(!_1ca||!_1ca.length){
 return false;
 }
-for(var n=0;n<_19d.length;n++){
-_19e=_19d[n];
-if(_19e.id==id&&_19e.status=="act"){
-img=document.getElementById(_19e.id);
-if(img&&_19e.over){
-img.src=_19e.over;
+for(var n=0;n<_1ca.length;n++){
+_1cb=_1ca[n];
+if(_1cb.id==id&&_1cb.status=="act"){
+elm=document.getElementById(_1cb.id);
+if(elm&&_1cb.over){
+if(_1cb.type=="image"){
+elm.src=_1cb.over;
+}else{
+elm.className=_1cb.over;
+}
 }
 }
 }
 };
-this.button_sel=function(_1a1,id){
-var _1a3=this.buttons[_1a1];
-var _1a4,img;
-if(!_1a3||!_1a3.length){
+this.button_sel=function(_1ce,id){
+var _1d0=this.buttons[_1ce];
+var _1d1,elm;
+if(!_1d0||!_1d0.length){
 return;
 }
-for(var n=0;n<_1a3.length;n++){
-_1a4=_1a3[n];
-if(_1a4.id==id&&_1a4.status=="act"){
-img=document.getElementById(_1a4.id);
-if(img&&_1a4.sel){
-img.src=_1a4.sel;
+for(var n=0;n<_1d0.length;n++){
+_1d1=_1d0[n];
+if(_1d1.id==id&&_1d1.status=="act"){
+elm=document.getElementById(_1d1.id);
+if(elm&&_1d1.sel){
+if(_1d1.type=="image"){
+elm.src=_1d1.sel;
+}else{
+elm.className=_1d1.sel;
+}
 }
+this.buttons_sel[id]=_1ce;
 }
 }
 };
-this.button_out=function(_1a7,id){
-var _1a9=this.buttons[_1a7];
-var _1aa,img;
-if(!_1a9||!_1a9.length){
+this.button_out=function(_1d4,id){
+var _1d6=this.buttons[_1d4];
+var _1d7,elm;
+if(!_1d6||!_1d6.length){
 return;
 }
-for(var n=0;n<_1a9.length;n++){
-_1aa=_1a9[n];
-if(_1aa.id==id&&_1aa.status=="act"){
-img=document.getElementById(_1aa.id);
-if(img&&_1aa.act){
-img.src=_1aa.act;
-}
+for(var n=0;n<_1d6.length;n++){
+_1d7=_1d6[n];
+if(_1d7.id==id&&_1d7.status=="act"){
+elm=document.getElementById(_1d7.id);
+if(elm&&_1d7.act){
+if(_1d7.type=="image"){
+elm.src=_1d7.act;
+}else{
+elm.className=_1d7.act;
 }
 }
-};
-this.set_classname=function(obj,_1ae,set){
-var reg=new RegExp("s*"+_1ae,"i");
-if(!set&&obj.className.match(reg)){
-obj.className=obj.className.replace(reg,"");
-}else{
-if(set&&!obj.className.match(reg)){
-obj.className+=" "+_1ae;
 }
 }
 };
-this.set_pagetitle=function(_1b1){
-if(_1b1&&document.title){
-document.title=_1b1;
+this.set_pagetitle=function(_1da){
+if(_1da&&document.title){
+document.title=_1da;
 }
 };
 this.display_message=function(msg,type,hold){
@@ -2690,55 +2972,51 @@ var cont=msg;
 if(type){
 cont="<div class=\""+type+"\">"+cont+"</div>";
 }
-var _1b6=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(){
-_1b6.hide_message();
+obj.bind("mousedown",function(){
+_1.hide_message();
 return true;
-};
+});
 }
 if(!hold){
 this.message_timer=window.setTimeout(function(){
-_1.hide_message();
+_1.hide_message(true);
 },this.message_time);
 }
 };
-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")]();
 }
 };
 this.select_folder=function(name,old){
 if(this.gui_objects.folderlist){
-var _1b9,_1ba;
-if((_1b9=this.get_folder_li(old))){
-this.set_classname(_1b9,"selected",false);
-this.set_classname(_1b9,"unfocused",false);
+var _1e3,_1e4;
+if((_1e3=this.get_folder_li(old))){
+$(_1e3).removeClass("selected").removeClass("unfocused");
 }
-if((_1ba=this.get_folder_li(name))){
-this.set_classname(_1ba,"unfocused",false);
-this.set_classname(_1ba,"selected",true);
+if((_1e4=this.get_folder_li(name))){
+$(_1e4).removeClass("unfocused").addClass("selected");
 }
+this.triggerEvent("selectfolder",{folder:name,old:old});
 }
 };
 this.get_folder_li=function(name){
 if(this.gui_objects.folderlist){
-name=String(name).replace(this.identifier_expr,"");
+name=String(name).replace(this.identifier_expr,"_");
 return document.getElementById("rcmli"+name);
 }
 return null;
 };
-this.set_message_coltypes=function(_1bc){
-this.coltypes=_1bc;
+this.set_message_coltypes=function(_1e6){
+this.coltypes=_1e6;
 var cell,col;
-var _1bf=this.gui_objects.messagelist?this.gui_objects.messagelist.tHead:null;
-for(var n=0;_1bf&&n<this.coltypes.length;n++){
+var _1e9=this.gui_objects.messagelist?this.gui_objects.messagelist.tHead:null;
+for(var n=0;_1e9&&n<this.coltypes.length;n++){
 col=this.coltypes[n];
-if((cell=_1bf.rows[0].cells[n+1])&&(col=="from"||col=="to")){
-if(cell.firstChild&&cell.firstChild.tagName=="A"){
+if((cell=_1e9.rows[0].cells[n+1])&&(col=="from"||col=="to")){
+if(cell.firstChild&&cell.firstChild.tagName.toLowerCase()=="a"){
 cell.firstChild.innerHTML=this.get_label(this.coltypes[n]);
 cell.firstChild.onclick=function(){
 return rcmail.command("sort",this.__col,this);
@@ -2755,138 +3033,151 @@ this.message_list.subject_col=n+1;
 }
 }
 };
-this.add_message_row=function(uid,cols,_1c3,_1c4,_1c5){
+this.add_message_row=function(uid,cols,_1ed,_1ee,_1ef){
 if(!this.gui_objects.messagelist||!this.message_list){
 return false;
 }
-var _1c6=this.gui_objects.messagelist.tBodies[0];
-var _1c7=_1c6.rows.length;
-var even=_1c7%2;
-this.env.messages[uid]={deleted:_1c3.deleted?1:0,replied:_1c3.replied?1:0,unread:_1c3.unread?1:0,forwarded:_1c3.forwarded?1:0,flagged:_1c3.flagged?1:0};
-var row=document.createElement("TR");
-row.id="rcmrow"+uid;
-row.className="message"+(even?" even":" odd")+(_1c3.unread?" unread":"")+(_1c3.deleted?" deleted":"")+(_1c3.flagged?" flagged":"");
-if(this.message_list.in_selection(uid)){
-row.className+=" selected";
+if(this.message_list.background){
+var _1f0=this.message_list.background;
+}else{
+var _1f0=this.gui_objects.messagelist.tBodies[0];
 }
+var _1f1=_1f0.rows.length;
+var even=_1f1%2;
+this.env.messages[uid]={deleted:_1ed.deleted?1:0,replied:_1ed.replied?1:0,unread:_1ed.unread?1:0,forwarded:_1ed.forwarded?1:0,flagged:_1ed.flagged?1:0};
+var _1f3="message"+(even?" even":" odd")+(_1ed.unread?" unread":"")+(_1ed.deleted?" deleted":"")+(_1ed.flagged?" flagged":"")+(this.message_list.in_selection(uid)?" selected":"");
+var row=document.createElement("tr");
+row.id="rcmrow"+uid;
+row.className=_1f3;
 var icon=this.env.messageicon;
-if(_1c3.deleted&&this.env.deletedicon){
+if(_1ed.deleted&&this.env.deletedicon){
 icon=this.env.deletedicon;
 }else{
-if(_1c3.replied&&this.env.repliedicon){
-if(_1c3.forwarded&&this.env.forwardedrepliedicon){
+if(_1ed.replied&&this.env.repliedicon){
+if(_1ed.forwarded&&this.env.forwardedrepliedicon){
 icon=this.env.forwardedrepliedicon;
 }else{
 icon=this.env.repliedicon;
 }
 }else{
-if(_1c3.forwarded&&this.env.forwardedicon){
+if(_1ed.forwarded&&this.env.forwardedicon){
 icon=this.env.forwardedicon;
 }else{
-if(_1c3.unread&&this.env.unreadicon){
+if(_1ed.unread&&this.env.unreadicon){
 icon=this.env.unreadicon;
 }
 }
 }
 }
-var col=document.createElement("TD");
+var col=document.createElement("td");
 col.className="icon";
 col.innerHTML=icon?"<img src=\""+icon+"\" alt=\"\" />":"";
 row.appendChild(col);
 for(var n=0;n<this.coltypes.length;n++){
 var c=this.coltypes[n];
-col=document.createElement("TD");
+col=document.createElement("td");
 col.className=String(c).toLowerCase();
 if(c=="flag"){
-if(_1c3.flagged&&this.env.flaggedicon){
+if(_1ed.flagged&&this.env.flaggedicon){
 col.innerHTML="<img src=\""+this.env.flaggedicon+"\" alt=\"\" />";
 }else{
-if(!_1c3.flagged&&this.env.unflaggedicon){
+if(!_1ed.flagged&&this.env.unflaggedicon){
 col.innerHTML="<img src=\""+this.env.unflaggedicon+"\" alt=\"\" />";
 }
 }
 }else{
 if(c=="attachment"){
-col.innerHTML=_1c4&&this.env.attachmenticon?"<img src=\""+this.env.attachmenticon+"\" alt=\"\" />":"&nbsp;";
+col.innerHTML=(_1ee&&this.env.attachmenticon?"<img src=\""+this.env.attachmenticon+"\" alt=\"\" />":"&nbsp;");
 }else{
 col.innerHTML=cols[c];
 }
 }
 row.appendChild(col);
 }
-this.message_list.insert_row(row,_1c5);
-if(_1c5&&this.env.pagesize&&this.message_list.rowcount>this.env.pagesize){
+this.message_list.insert_row(row,_1ef);
+if(_1ef&&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);
 }
 };
-this.set_rowcount=function(text){
-if(this.gui_objects.countdisplay){
-this.gui_objects.countdisplay.innerHTML=text;
+this.offline_message_list=function(flag){
+if(this.message_list){
+this.message_list.set_background_mode(flag);
 }
+};
+this.set_rowcount=function(text){
+$(this.gui_objects.countdisplay).html(text);
 this.set_page_buttons();
 };
-this.set_mailboxname=function(_1cf){
-if(this.gui_objects.mailboxname&&_1cf){
-this.gui_objects.mailboxname.innerHTML=_1cf;
+this.set_mailboxname=function(_1fb){
+if(this.gui_objects.mailboxname&&_1fb){
+this.gui_objects.mailboxname.innerHTML=_1fb;
 }
 };
-this.set_quota=function(_1d0){
-if(this.gui_objects.quotadisplay&&_1d0){
-this.gui_objects.quotadisplay.innerHTML=_1d0;
+this.set_quota=function(_1fc){
+if(_1fc&&this.gui_objects.quotadisplay){
+if(typeof (_1fc)=="object"){
+this.percent_indicator(this.gui_objects.quotadisplay,_1fc);
+}else{
+$(this.gui_objects.quotadisplay).html(_1fc);
+}
 }
 };
-this.set_unread_count=function(mbox,_1d2,_1d3){
+this.set_unread_count=function(mbox,_1fe,_1ff){
 if(!this.gui_objects.mailboxlist){
 return false;
 }
-this.env.unread_counts[mbox]=_1d2;
-this.set_unread_count_display(mbox,_1d3);
+this.env.unread_counts[mbox]=_1fe;
+this.set_unread_count_display(mbox,_1ff);
 };
-this.set_unread_count_display=function(mbox,_1d5){
-var reg,_1d7,item,_1d9,_1da,div;
+this.set_unread_count_display=function(mbox,_201){
+var reg,_203,item,_205,_206,div;
 if(item=this.get_folder_li(mbox)){
-_1d9=this.env.unread_counts[mbox]?this.env.unread_counts[mbox]:0;
-_1d7=item.getElementsByTagName("a")[0];
+_205=this.env.unread_counts[mbox]?this.env.unread_counts[mbox]:0;
+_203=item.getElementsByTagName("a")[0];
 reg=/\s+\([0-9]+\)$/i;
-_1da=0;
+_206=0;
 if((div=item.getElementsByTagName("div")[0])&&div.className.match(/collapsed/)){
 for(var k in this.env.unread_counts){
 if(k.indexOf(mbox+this.env.delimiter)==0){
-_1da+=this.env.unread_counts[k];
+_206+=this.env.unread_counts[k];
 }
 }
 }
-if(_1d9&&_1d7.innerHTML.match(reg)){
-_1d7.innerHTML=_1d7.innerHTML.replace(reg," ("+_1d9+")");
+if(_205&&_203.innerHTML.match(reg)){
+_203.innerHTML=_203.innerHTML.replace(reg," ("+_205+")");
 }else{
-if(_1d9){
-_1d7.innerHTML+=" ("+_1d9+")";
+if(_205){
+_203.innerHTML+=" ("+_205+")";
 }else{
-_1d7.innerHTML=_1d7.innerHTML.replace(reg,"");
+_203.innerHTML=_203.innerHTML.replace(reg,"");
 }
 }
 reg=new RegExp(RegExp.escape(this.env.delimiter)+"[^"+RegExp.escape(this.env.delimiter)+"]+$");
 if(mbox.match(reg)){
 this.set_unread_count_display(mbox.replace(reg,""),false);
 }
-this.set_classname(item,"unread",(_1d9+_1da)>0?true:false);
+if((_205+_206)>0){
+$(item).addClass("unread");
+}else{
+$(item).removeClass("unread");
+}
 }
 reg=/^\([0-9]+\)\s+/i;
-if(_1d5&&document.title){
-var _1dd=String(document.title);
-var _1de="";
-if(_1d9&&_1dd.match(reg)){
-_1de=_1dd.replace(reg,"("+_1d9+") ");
+if(_201&&document.title){
+var _209=String(document.title);
+var _20a="";
+if(_205&&_209.match(reg)){
+_20a=_209.replace(reg,"("+_205+") ");
 }else{
-if(_1d9){
-_1de="("+_1d9+") "+_1dd;
+if(_205){
+_20a="("+_205+") "+_209;
 }else{
-_1de=_1dd.replace(reg,"");
+_20a=_209.replace(reg,"");
 }
 }
-this.set_pagetitle(_1de);
+this.set_pagetitle(_20a);
 }
 };
 this.new_message_focus=function(){
@@ -2896,39 +3187,15 @@ window.parent.focus();
 window.focus();
 }
 };
-this.add_contact_row=function(cid,cols,_1e1){
-if(!this.gui_objects.contactslist||!this.gui_objects.contactslist.tBodies[0]){
-return false;
-}
-var _1e2=this.gui_objects.contactslist.tBodies[0];
-var _1e3=_1e2.rows.length;
-var even=_1e3%2;
-var row=document.createElement("TR");
-row.id="rcmrow"+cid;
-row.className="contact "+(even?"even":"odd");
-if(this.contact_list.in_selection(cid)){
-row.className+=" selected";
-}
-for(var c in cols){
-col=document.createElement("TD");
-col.className=String(c).toLowerCase();
-col.innerHTML=cols[c];
-row.appendChild(col);
-}
-this.contact_list.insert_row(row);
-this.enable_command("export",(this.contact_list.rowcount>0));
-};
-this.toggle_prefer_html=function(_1e7){
-var _1e8;
-if(_1e8=document.getElementById("rcmfd_addrbook_show_images")){
-_1e8.disabled=!_1e7.checked;
+this.toggle_prefer_html=function(_20b){
+var _20c;
+if(_20c=document.getElementById("rcmfd_addrbook_show_images")){
+_20c.disabled=!_20b.checked;
 }
 };
-this.set_headers=function(_1e9){
-if(this.gui_objects.all_headers_row&&this.gui_objects.all_headers_box&&_1e9){
-var box=this.gui_objects.all_headers_box;
-box.innerHTML=_1e9;
-box.style.display="block";
+this.set_headers=function(_20d){
+if(this.gui_objects.all_headers_row&&this.gui_objects.all_headers_box&&_20d){
+$(this.gui_objects.all_headers_box).html(_20d).show();
 if(this.env.framed&&parent.rcmail){
 parent.rcmail.set_busy(false);
 }else{
@@ -2940,9 +3207,8 @@ this.load_headers=function(elem){
 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);
 };
@@ -2955,29 +3221,67 @@ this.hide_headers=function(elem){
 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);
 };
 };
-this.html2plain=function(_1ed,id){
-var _1ef=new rcube_http_request();
+this.percent_indicator=function(obj,data){
+if(!data||!obj){
+return false;
+}
+var _212=80;
+var _213=55;
+var _214=data.width?data.width:this.env.indicator_width?this.env.indicator_width:100;
+var _215=data.height?data.height:this.env.indicator_height?this.env.indicator_height:14;
+var _216=data.percent?Math.abs(parseInt(data.percent)):0;
+var _217=parseInt(_216/100*_214);
+var pos=$(obj).position();
+this.env.indicator_width=_214;
+this.env.indicator_height=_215;
+if(_217>_214){
+_217=_214;
+_216=100;
+}
+var main=$("<div>");
+main.css({position:"absolute",top:pos.top,left:pos.left,width:_214+"px",height:_215+"px",zIndex:100,lineHeight:_215+"px"}).attr("title",data.title).addClass("quota_text").html(_216+"%");
+var bar1=$("<div>");
+bar1.css({position:"absolute",top:pos.top+1,left:pos.left+1,width:_217+"px",height:_215+"px",zIndex:99});
+var bar2=$("<div>");
+bar2.css({position:"absolute",top:pos.top+1,left:pos.left+1,width:_214+"px",height:_215+"px",zIndex:98}).addClass("quota_bg");
+if(_216>=_212){
+main.addClass(" quota_text_high");
+bar1.addClass("quota_high");
+}else{
+if(_216>=_213){
+main.addClass(" quota_text_mid");
+bar1.addClass("quota_mid");
+}else{
+main.addClass(" quota_text_normal");
+bar1.addClass("quota_low");
+}
+}
+obj.innerHTML="";
+$(obj).append(bar1).append(bar2).append(main);
+};
+this.html2plain=function(_21c,id){
 var url=this.env.bin_path+"html2text.php";
-var _1f1=this;
+var _21f=this;
 this.set_busy(true,"converting");
-_1ef.onerror=function(o){
-_1f1.http_error(o);
-};
-_1ef.oncomplete=function(o){
-_1f1.set_text_value(o,id);
-};
-_1ef.POST(url,_1ed,"application/octet-stream");
-};
-this.set_text_value=function(_1f4,id){
+console.log("HTTP POST: "+url);
+$.ajax({type:"POST",url:url,data:_21c,contentType:"application/octet-stream",error:function(o){
+_21f.http_error(o);
+},success:function(data){
+_21f.set_busy(false);
+$(document.getElementById(id)).val(data);
+console.log(data);
+}});
+};
+this.plain2html=function(_222,id){
+this.set_busy(true,"converting");
+$(document.getElementById(id)).val("<pre>"+_222+"</pre>");
 this.set_busy(false);
-document.getElementById(id).value=_1f4.get_text();
 };
 this.redirect=function(url,lock){
 if(lock||lock===null){
@@ -2989,80 +3293,56 @@ parent.location.href=url;
 location.href=url;
 }
 };
-this.goto_url=function(_1f8,_1f9,lock){
-var _1fb=_1f9?"&"+_1f9:"";
-this.redirect(this.env.comm_path+"&_action="+_1f8+_1fb,lock);
+this.goto_url=function(_226,_227,lock){
+var _229=_227?"&"+_227:"";
+this.redirect(this.env.comm_path+"&_action="+_226+_229,lock);
 };
-this.http_sockets=new Array();
-this.get_request_obj=function(){
-for(var n=0;n<this.http_sockets.length;n++){
-if(!this.http_sockets[n].busy){
-return this.http_sockets[n];
-}
-}
-var i=this.http_sockets.length;
-this.http_sockets[i]=new rcube_http_request();
-return this.http_sockets[i];
+this.http_request=function(_22a,_22b,lock){
+_22b+=(_22b?"&":"")+"_remote=1";
+var url=this.env.comm_path+"&_action="+_22a+"&"+_22b;
+console.log("HTTP POST: "+url);
+jQuery.get(url,{_unlock:(lock?1:0)},function(data){
+_1.http_response(data);
+},"json");
 };
-this.http_request=function(_1fe,_1ff,lock){
-var _201=this.get_request_obj();
-_1ff+=(_1ff?"&":"")+"_remote=1";
-if(bw.safari){
-_1ff+="&_ts="+(new Date().getTime());
-}
-if(_201){
-if(lock){
-this.set_busy(true);
+this.http_post=function(_22f,_230,lock){
+var url=this.env.comm_path+"&_action="+_22f;
+if(_230&&typeof (_230)=="object"){
+_230._remote=1;
+_230._unlock=(lock?1:0);
+}else{
+_230+=(_230?"&":"")+"_remote=1"+(lock?"&_unlock=1":"");
 }
-var rcm=this;
-_201.__lock=lock?true:false;
-_201.__action=_1fe;
-_201.onerror=function(o){
-_1.http_error(o);
+console.log("HTTP POST: "+url);
+jQuery.post(url,_230,function(data){
+_1.http_response(data);
+},"json");
 };
-_201.oncomplete=function(o){
-_1.http_response(o);
-};
-_201.GET(this.env.comm_path+"&_action="+_1fe+"&"+_1ff);
+this.http_response=function(_234){
+var _235="";
+if(_234.unlock){
+this.set_busy(false);
 }
-};
-this.http_post=function(_205,_206,lock){
-var _208;
-if(_206&&typeof (_206)=="object"){
-_206._remote=1;
-}else{
-_206+=(_206?"&":"")+"_remote=1";
+if(_234.env){
+this.set_env(_234.env);
 }
-if(_208=this.get_request_obj()){
-if(lock){
-this.set_busy(true);
+if(typeof _234.texts=="object"){
+for(var name in _234.texts){
+if(typeof _234.texts[name]=="string"){
+this.add_label(name,_234.texts[name]);
 }
-var rcm=this;
-_208.__lock=lock?true:false;
-_208.__action=_205;
-_208.onerror=function(o){
-rcm.http_error(o);
-};
-_208.oncomplete=function(o){
-rcm.http_response(o);
-};
-_208.POST(this.env.comm_path+"&_action="+_205,_206);
 }
-};
-this.http_response=function(_20c){
-var _20d=_20c.get_header("Content-Type");
-if(_20d){
-_20d=String(_20d).toLowerCase();
-var _20e=_20d.split(";");
-_20d=_20e[0];
 }
-if(_20c.__lock){
-this.set_busy(false);
+if(_234.exec){
+console.log(_234.exec);
+eval(_234.exec);
 }
-if(_20c.get_text()&&(_20d=="text/javascript"||_20d=="application/x-javascript")){
-eval(_20c.get_text());
+if(_234.callbacks&&_234.callbacks.length){
+for(var i=0;i<_234.callbacks.length;i++){
+this.triggerEvent(_234.callbacks[i][0],_234.callbacks[i][1]);
 }
-switch(_20c.__action){
+}
+switch(_234.action){
 case "delete":
 if(this.task=="addressbook"){
 var uid=this.contact_list.get_selection();
@@ -3072,7 +3352,7 @@ this.enable_command("export",(this.contact_list&&this.contact_list.rowcount>0));
 }
 case "moveto":
 if(this.env.action=="show"){
-this.command("list");
+this.enable_command("reply","reply-all","forward","delete","mark","print","open","edit","viewsource","download",true);
 }else{
 if(this.message_list){
 this.message_list.init();
@@ -3085,47 +3365,62 @@ if(!this.env.messagecount&&this.task=="mail"){
 if(this.env.contentframe){
 this.show_contentframe(false);
 }
-this.enable_command("show","reply","reply-all","forward","moveto","delete","mark","viewsource","print","load-attachment","purge","expunge","select-all","select-none","sort",false);
+this.enable_command("show","reply","reply-all","forward","moveto","delete","mark","viewsource","open","edit","download","print","load-attachment","purge","expunge","select-all","select-none","sort",false);
 }
 break;
 case "check-recent":
 case "getunread":
 case "list":
 if(this.task=="mail"){
-if(this.message_list&&_20c.__action=="list"){
+if(this.message_list&&_234.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());
+if(_234.action=="list"){
+this.triggerEvent("listupdate",{folder:this.env.mailbox,rowcount:this.message_list.rowcount});
+}
 }else{
 if(this.task=="addressbook"){
 this.enable_command("export",(this.contact_list&&this.contact_list.rowcount>0));
+if(_234.action=="list"){
+this.triggerEvent("listupdate",{folder:this.env.source,rowcount:this.contact_list.rowcount});
+}
 }
 }
 break;
 }
-_20c.reset();
 };
-this.http_error=function(_210){
-if(_210.__lock){
+this.http_error=function(_239,_23a,err){
+var _23c=_239.statusText;
 this.set_busy(false);
+_239.abort();
+if(_23c){
+this.display_message(this.get_label("servererror")+" ("+_23c+")","error");
 }
-_210.reset();
-_210.__lock=false;
-this.display_message("Unknown Server Error!","error");
 };
 this.send_keep_alive=function(){
 var d=new Date();
 this.http_request("keep-alive","_t="+d.getTime());
 };
-this.check_for_recent=function(_212){
+this.check_for_recent=function(_23e){
 if(this.busy){
 return;
 }
-if(_212){
+if(_23e){
 this.set_busy(true,"checkingmail");
 }
-this.http_request("check-recent",(this.env.search_request?"_search="+this.env.search_request+"&":"")+"_t="+(new Date().getTime()),true);
+var _23f="_t="+(new Date().getTime());
+if(this.gui_objects.messagelist){
+_23f+="&_list=1";
+}
+if(this.gui_objects.quotadisplay){
+_23f+="&_quota=1";
+}
+if(this.env.search_request){
+_23f+="&_search="+this.env.search_request;
+}
+this.http_request("check-recent",_23f,true);
 };
 this.get_single_uid=function(){
 return this.env.uid?this.env.uid:(this.message_list?this.message_list.get_single_selection():null);
@@ -3138,17 +3433,17 @@ if(typeof (obj.selectionEnd)!="undefined"){
 return obj.selectionEnd;
 }else{
 if(document.selection&&document.selection.createRange){
-var _214=document.selection.createRange();
-if(_214.parentElement()!=obj){
+var _241=document.selection.createRange();
+if(_241.parentElement()!=obj){
 return 0;
 }
-var gm=_214.duplicate();
+var gm=_241.duplicate();
 if(obj.tagName=="TEXTAREA"){
 gm.moveToElementText(obj);
 }else{
 gm.expand("textedit");
 }
-gm.setEndPoint("EndToStart",_214);
+gm.setEndPoint("EndToStart",_241);
 var p=gm.text.length;
 return p<=obj.value.length?p:-1;
 }else{
@@ -3156,17 +3451,18 @@ return obj.value.length;
 }
 }
 };
-this.set_caret2start=function(obj){
-if(obj.createTextRange){
-var _218=obj.createTextRange();
-_218.collapse(true);
-_218.select();
-}else{
+this.set_caret_pos=function(obj,pos){
 if(obj.setSelectionRange){
-obj.setSelectionRange(0,0);
+obj.setSelectionRange(pos,pos);
+}else{
+if(obj.createTextRange){
+var _246=obj.createTextRange();
+_246.collapse(true);
+_246.moveEnd("character",pos);
+_246.moveStart("character",pos);
+_246.select();
 }
 }
-obj.focus();
 };
 this.lock_form=function(form,lock){
 if(!form||!form.elements){
@@ -3182,129 +3478,7 @@ form.elements[n].disabled=lock;
 }
 };
 };
-function rcube_http_request(){
-this.url="";
-this.busy=false;
-this.xmlhttp=null;
-this.reset=function(){
-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;
-};
-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{
-}
-}
-};
-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,_221){
-if(typeof (_221)=="undefined"){
-_221="application/x-www-form-urlencoded";
-}
-this.build();
-if(!this.xmlhttp){
-this.onerror(this);
-return false;
-}
-var _222=body;
-if(typeof (body)=="object"){
-_222="";
-for(var p in body){
-_222+=(_222?"&":"")+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",_221);
-this.xmlhttp.setRequestHeader("X-RoundCube-Referer",bw.get_cookie("roundcube_sessid"));
-this.xmlhttp.send(_222);
-};
-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;
-}
-}
-}
-}
-}
-};
-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();
-};
-function call_init(o){
-window.setTimeout("if (window['"+o+"'] && window['"+o+"'].init) { "+o+".init(); }",bw.win?500:200);
-};
+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;