]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/Emails/javascript/EmailUI.js
Release 6.1.4
[Github/sugarcrm.git] / modules / Emails / javascript / EmailUI.js
1 /*********************************************************************************
2  * SugarCRM is a customer relationship management program developed by
3  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Affero General Public License version 3 as published by the
7  * Free Software Foundation with the addition of the following permission added
8  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
9  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
10  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
11  * 
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
15  * details.
16  * 
17  * You should have received a copy of the GNU Affero General Public License along with
18  * this program; if not, see http://www.gnu.org/licenses or write to the Free
19  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA.
21  * 
22  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
23  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
24  * 
25  * The interactive user interfaces in modified source and object code versions
26  * of this program must display Appropriate Legal Notices, as required under
27  * Section 5 of the GNU Affero General Public License version 3.
28  * 
29  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
30  * these Appropriate Legal Notices must retain the display of the "Powered by
31  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
32  * technical reasons, the Appropriate Legal Notices must display the words
33  * "Powered by SugarCRM".
34  ********************************************************************************/
35
36
37 (function() {
38         var sw = YAHOO.SUGAR,
39                 Event = YAHOO.util.Event,
40                 Connect = YAHOO.util.Connect,
41             Dom = YAHOO.util.Dom
42             SE = SUGAR.email2;
43
44 ///////////////////////////////////////////////////////////////////////////////
45 ////    EMAIL ACCOUNTS
46 SE.accounts = {
47     outboundDialog : null,
48     inboundAccountEditDialog : null,
49     inboundAccountsSettingsTable : null,
50     outboundAccountsSettingsTable : null,
51     testOutboundDialog : null,
52     errorStyle : 'input-error',
53     normalStyle : '',
54     newAddedOutboundId : '',
55
56     /**
57      * makes async call to retrieve an outbound instance for editting
58      */
59      //EXT111
60     editOutbound : function(obi) {
61
62             AjaxObject.startRequest(AjaxObject.accounts.callbackEditOutbound, urlStandard + "&emailUIAction=editOutbound&outbound_email=" + obi);
63         
64     },
65     deleteOutbound : function(obi) {
66
67         if(obi.match(/^(add|line|sendmail)+/)) {
68             alert('Invalid Operation');
69         } else {
70                 overlay(app_strings.LBL_EMAIL_DELETING_OUTBOUND, app_strings.LBL_EMAIL_ONE_MOMENT);
71             AjaxObject.startRequest(AjaxObject.accounts.callbackDeleteOutbound, urlStandard + "&emailUIAction=deleteOutbound&outbound_email=" + obi);
72         }
73     },
74     //EXT111
75     getReplyAddress : function() {
76         var primary = '';
77
78         for(var i=0; i<SE.userPrefs.current_user.emailAddresses.length; i++) {
79             var addy = SE.userPrefs.current_user.emailAddresses[i];
80
81             if(addy.primary_address == "1") {
82                 primary = addy.email_address;
83             }
84
85             if(addy.reply_to == "1") {
86                 return addy.email_address;
87             }
88         }
89
90         return primary;
91     },
92
93     /**
94      * Called on "Accounts" tab activation event
95      */
96     lazyLoad : function() {
97                 
98         this._setupInboundAccountTable();
99         this._setupOutboundAccountTable();      
100
101     },
102     
103     _setupInboundAccountTable: function()
104     {
105         //Setup the inbound mail settings
106         if(!this.inboundAccountsSettingsTable)
107         {
108                   this.customImageFormatter = function(elLiner, oRecord, oColumn, oData) { 
109                                         var clckEvent = oColumn.key;
110                                         var imgSrc = "";
111                                         var is_group = oRecord.getData("is_group");
112                                         if(!is_group)
113                                         {
114                                         if(oColumn.key == 'edit')
115                                         {
116                                                 clckEvent = "SUGAR.email2.accounts.getIeAccount('"+ oRecord.getData('id') +"')";
117                                                 imgSrc = 'index.php?entryPoint=getImage&amp;themeName=Sugar&amp;imageName='+oColumn.key+'_inline.gif';
118                                         }
119                                         else if(oColumn.key == 'delete')
120                                         {
121                                                 clckEvent = "SUGAR.email2.accounts.deleteIeAccount('"+ oRecord.getData('id') +"','" + oRecord.getData('group_id') +"')";
122                                                 imgSrc = 'index.php?entryPoint=getImage&amp;themeName=Sugar&amp;imageName='+oColumn.key+'_inline.gif';
123                                         }
124                                 elLiner.innerHTML = '<img onclick="'+clckEvent+'" src="'+imgSrc+'" align="absmiddle" border="0"/>';
125                                         }
126                    }; 
127                    
128                    this.showBoolean = function(el, oRecord, oColumn, oData)
129                    {
130                        var is_group = oRecord.getData("is_group");
131                        var bChecked = oData;
132                        bChecked = (bChecked) ? " checked" : "";
133                        if(!is_group)
134                        {
135                        el.innerHTML = "<input type=\"radio\"" + bChecked +
136                            " name=\"col" + oColumn.getId() + "-radio\"" +
137                            " class=\"yui-dt-radio\">";
138                        }
139                    };
140
141
142                 YAHOO.widget.DataTable.Formatter.customImage = this.customImageFormatter;                
143                 YAHOO.widget.DataTable.Formatter.showBoolean = this.showBoolean;
144                 
145                 var typeHoverHelp = '&nbsp;<div id="rollover"><a href="#" class="rollover">'+
146                                     '<img border="0" src="themes/default/images/helpInline.gif">' +
147                                     '<div style="text-align:left"><span>' + mod_strings.LBL_EMAIL_INBOUND_TYPE_HELP + '</span></div></a></div>';
148                 
149                 
150                 this.ieColumnDefs = [{key:'name',label:app_strings.LBL_EMAIL_SETTINGS_NAME }, {key:'server_url',label:ie_mod_strings.LBL_SERVER_URL},
151                                       {key:'is_active',label:ie_mod_strings.LBL_STATUS_ACTIVE,formatter:"checkbox",className:'yui-cstm-cntrd-liner'}, 
152                                       {key:'is_default',label:app_strings.LBL_EMAIL_ACCOUNTS_SMTPDEFAULT,formatter:"showBoolean",className:'yui-cstm-cntrd-liner'},     
153                                       {key:'type',label:mod_strings.LBL_LIST_TYPE + typeHoverHelp },
154                                       {key:'edit',label:mod_strings.LBL_BUTTON_EDIT,formatter:"customImage",className:'yui-cstm-cntrd-liner'},
155                                       {key:'delete',label:app_strings.LBL_EMAIL_DELETE,formatter:"customImage",className:'yui-cstm-cntrd-liner'}];
156                 var query = "index.php?module=Emails&action=EmailUIAjax&to_pdf=true&emailUIAction=rebuildShowAccount";
157                 this.ieDataSource = new YAHOO.util.DataSource(query);
158                         this.ieDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; 
159                         this.ieDataSource.responseSchema = {
160                                 resultsList: "account_list",
161                                 fields: [{key:'id'},{key:'name'},'is_active',{key:'server_url'},'is_group','group_id','is_default','has_groupfolder','type']
162                         };
163                 this.inboundAccountsSettingsTable = new YAHOO.widget.DataTable("inboundAccountsTable", this.ieColumnDefs, this.ieDataSource);
164                         this.inboundAccountsSettingsTable.subscribe("checkboxClickEvent", function(oArgs){ 
165                         
166                     var elCheckbox = oArgs.target; 
167                     var oColumn = this.getColumn(elCheckbox);
168                         if(oColumn.key == 'is_active')
169                         {
170                                 var oRecord = this.getRecord(elCheckbox); 
171                                 oRecord.setData("is_active",elCheckbox.checked);
172                                 var t_id = oRecord.getData('id');
173                         var isGroupFolder = oRecord.getData('has_groupfolder');
174                         
175                         if(isGroupFolder)
176                             SUGAR.email2.folders.updateSubscriptions();
177                         else
178                         SUGAR.email2.folders.setFolderSelection();
179                         
180                         }
181                 });
182                         var lastDefaultSelectedId = "";
183                 this.inboundAccountsSettingsTable.subscribe("radioClickEvent", function(oArgs){ 
184                     
185                     var elRadio = oArgs.target; 
186                     var oColumn = this.getColumn(elRadio);
187                         if(oColumn.key == 'is_default')
188                         {
189                                 var oRecord = this.getRecord(elRadio);
190                                 var t_id = oRecord.getData('id');
191                                 var t_isGroup = oRecord.getData('is_group');
192                                 if(t_id != lastDefaultSelectedId && !t_isGroup)
193                                 {
194                                                 SUGAR.default_inbound_accnt_id = t_id; //Set in the global space for access during compose                                      
195                                         lastDefaultSelectedId = t_id;
196                                         AjaxObject.startRequest(callbackDefaultOutboundSave, urlStandard + "&emailUIAction=saveDefaultOutbound&id="+ t_id);                                     
197                                 }
198                                 else if(t_isGroup)
199                                    YAHOO.util.Event.preventDefault(oArgs.event); //Do not allow users to select group mailboxes as a default.
200                  
201                         }
202                 });
203                 
204                         this.inboundAccountsSettingsTable.subscribe("rowMouseoverEvent", this.inboundAccountsSettingsTable.onEventHighlightRow); 
205                         this.inboundAccountsSettingsTable.subscribe("rowMouseoutEvent", this.inboundAccountsSettingsTable.onEventUnhighlightRow); 
206         }
207     },
208      _setupOutboundAccountTable: function()
209     {
210         if(!this.outboundAccountsSettingsTable)
211         {            
212                 this.obImageFormatter = function(elLiner, oRecord, oColumn, oData) { 
213                                         var clckEvent = oColumn.key;
214                                         var imgSrc = "";
215                                         var isEditable = oRecord.getData("is_editable");
216                                         var type = oRecord.getData("type");
217                                         if(isEditable)
218                                         {
219                                         if(oColumn.key == 'edit')
220                                         {
221                                                 clckEvent = "SUGAR.email2.accounts.editOutbound('"+ oRecord.getData('id') +"')";
222                                                 imgSrc = 'index.php?entryPoint=getImage&amp;themeName=Sugar&amp;imageName='+oColumn.key+'_inline.gif';
223                                         }
224                                         else if(oColumn.key == 'delete' && type == 'user')
225                                         {
226                                                 clckEvent = "SUGAR.email2.accounts.deleteOutbound('"+ oRecord.getData('id')+"')";
227                                                 imgSrc = 'index.php?entryPoint=getImage&amp;themeName=Sugar&amp;imageName='+oColumn.key+'_inline.gif';
228                                         }
229                                         if(imgSrc != '')
230                                     elLiner.innerHTML = '<img onclick="'+clckEvent+'" src="'+imgSrc+'" align="absmiddle" border="0"/>';
231                                         }
232                 }; 
233                 
234                 //Custom formatter to display any error messages.
235                         this.messageDisplay = function(elLiner, oRecord, oColumn, oData) { 
236                             
237                     if(SUGAR.email2.composeLayout.outboundAccountErrors == null)
238                                             SUGAR.email2.composeLayout.outboundAccountErrors = {};
239                                             
240                         var id = oRecord.getData('id');
241                                         var message = oRecord.getData("errors");
242                                         if(message != '')
243                                         {
244                                     elLiner.innerHTML = '<span class="required">' + message + '</span>';
245                                         //Add the id and message for all outbound accounts.
246                                         SUGAR.email2.composeLayout.outboundAccountErrors[id] = message;
247                                         }
248                                         else
249                                         {
250                                             if(typeof(SUGAR.email2.composeLayout.outboundAccountErrors[id]) != 'undefined' )
251                                             delete SUGAR.email2.composeLayout.outboundAccountErrors[id];
252                                         }
253                 }; 
254                 YAHOO.widget.DataTable.Formatter.actionsImage = this.obImageFormatter;
255                 YAHOO.widget.DataTable.Formatter.messageDisplay = this.messageDisplay;
256                 
257                 this.obAccntsColumnDefs = [{key:'name',label:app_strings.LBL_EMAIL_ACCOUNTS_NAME }, {key:'mail_smtpserver',label:app_strings.LBL_EMAIL_ACCOUNTS_SMTPSERVER},
258                                                                    {key:'edit',label:mod_strings.LBL_BUTTON_EDIT,formatter:"actionsImage",className:'yui-cstm-cntrd-liner'},
259                                                                    {key:'delete', label:app_strings.LBL_EMAIL_DELETE,formatter:"actionsImage",className:'yui-cstm-cntrd-liner'},  
260                                                                    {key:'messages',label:'', formatter:"messageDisplay",className:'yui-cstm-cntrd-liner'}];
261                                                                    
262                 var query = "index.php?module=Emails&action=EmailUIAjax&to_pdf=true&emailUIAction=retrieveAllOutbound";
263                 this.obDataSource = new YAHOO.util.DataSource(query);
264                         this.obDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; 
265                         this.obDataSource.responseSchema = {
266                                 
267                                 resultsList: "outbound_account_list",
268                                 fields: ['id','name','is_editable','mail_smtpserver','type','errors']
269                         };
270                         
271                 this.outboundAccountsSettingsTable = new YAHOO.widget.DataTable("outboundAccountsTable", this.obAccntsColumnDefs, this.obDataSource);
272                         
273                 
274                         this.outboundAccountsSettingsTable.subscribe("rowMouseoverEvent", this.outboundAccountsSettingsTable.onEventHighlightRow); 
275                         this.outboundAccountsSettingsTable.subscribe("rowMouseoutEvent", this.outboundAccountsSettingsTable.onEventUnhighlightRow); 
276                 this.outboundAccountsSettingsTable.subscribe("postRenderEvent",this.rebuildMailerOptions);
277         }
278     },
279     /**
280      * Displays a modal diaglogue to edit outbound account settings
281      */
282     showEditInboundAccountDialogue : function(clear) {
283  
284         if(!this.inboundAccountEditDialog) {
285                 var EAD = this.inboundAccountEditDialog = new YAHOO.widget.Dialog("editAccountDialogue", {
286                 modal:true,
287                                 visible:true,
288                 fixedcenter:true,
289                 constraintoviewport: true,
290                 width   : "600px",
291                 shadow  : true
292             });
293                         EAD.showEvent.subscribe(function() {
294                 var el = this.element;
295                 var viewH = YAHOO.util.Dom.getViewportHeight();
296                 if (this.header && el && viewH - 50 < el.clientHeight) {
297                     var body = this.header.nextElementSibling;
298                                         body.style.overflow = "auto";
299                     body.style.height = (viewH - 50) + "px";
300                 }
301             }, EAD);
302             EAD.setHeader(mod_strings.LBL_EMAIL_ACCOUNTS_INBOUND);
303                         Dom.removeClass("editAccountDialogue", "yui-hidden");
304
305         } // end lazy load
306
307         if(clear == undefined || clear == true) 
308         {
309                 SE.accounts.clearInboundAccountEditScreen();
310                 //Set default protocol to IMAP when creating new records
311                 document.forms['ieAccount'].elements['protocol'].value = "imap";
312                 SE.accounts.setPortDefault();           
313         }
314         
315         //Check if we should display username/password fields for outbound account if errors were detected.
316         this.checkOutBoundSelection();
317             
318         this.inboundAccountEditDialog.render();
319         this.inboundAccountEditDialog.show();
320     },
321     
322     /**
323     *  Set all fields on the outbound edit form to either enabled/disabled
324     *  except for the username/password.
325     *
326     */
327     toggleOutboundAccountDisabledFields: function(disable)
328     {
329         var fields = ['mail_name', 'mail_smtpserver','mail_smtpport','mail_smtpauth_req'];
330         for(var i=0;i<fields.length;i++)
331         {
332             document.getElementById(fields[i]).disabled = disable;
333         }
334         if(disable)
335             Dom.addClass("mail_smtpssl_row", "yui-hidden");
336         else
337             Dom.removeClass('mail_smtpssl_row', "yui-hidden");
338                 
339     },
340     /**
341     * Refresh the inbound accounts table.
342     */
343     refreshInboundAccountTable : function()
344     {   
345             this.inboundAccountsSettingsTable.getDataSource().sendRequest('',
346                 { 
347                         success: this.inboundAccountsSettingsTable.onDataReturnInitializeTable,
348                                 scope: this.inboundAccountsSettingsTable }
349                         );
350     },
351     /**
352     * Refresh the outbound accounts table.
353     */
354     refreshOuboundAccountTable : function()
355     {   
356             this.outboundAccountsSettingsTable.getDataSource().sendRequest('',
357                 { 
358                         success: this.outboundAccountsSettingsTable.onDataReturnInitializeTable,
359                                 scope: this.outboundAccountsSettingsTable }
360                         );
361     },
362     /**
363      * Displays a modal diaglogue to add a SMTP server
364      */
365     showAddSmtp : function() {
366         // lazy load dialogue
367         if(!this.outboundDialog) {
368                 this.outboundDialog = new YAHOO.widget.Dialog("outboundDialog", {
369                 modal:true,
370                                 visible:true,
371                 fixedcenter:true,
372                 constraintoviewport: true,
373                 width   : "750px",
374                 shadow  : true
375             });
376             this.outboundDialog.setHeader(app_strings.LBL_EMAIL_ACCOUNTS_OUTBOUND);
377             this.outboundDialog.hideEvent.subscribe(function(){
378                 //If add was used to bring this dialog up, and we are hiding without creating one, then set it back to the first option
379                 var out = Dom.get("outbound_email");
380                 if (out && out.value == "SYSTEM_ADD")
381                 {
382                         out.value = out.options[0].value;
383                 }
384                 //Check if we should display username/password for system account.
385                 SE.accounts.checkOutBoundSelection();
386                 return true;
387             });
388             
389             Dom.removeClass("outboundDialog", "yui-hidden");
390         } // end lazy load
391         
392         // clear out form
393         var form = document.getElementById('outboundEmailForm');
394         for(i=0; i<form.elements.length; i++) {
395             if(form.elements[i].name == 'mail_smtpport') {
396                 form.elements[i].value = 25;
397             } else if(form.elements[i].type != 'button' && form.elements[i].type != 'checkbox') {
398                 form.elements[i].value = '';
399             } else if(form.elements[i].type == 'checkbox') {
400                 form.elements[i].checked = false;
401             }
402         }
403         //Render the SMTP buttons
404         if ( !SUGAR.smtpButtonGroup ) {
405             SUGAR.smtpButtonGroup = new YAHOO.widget.ButtonGroup("smtpButtonGroup");
406             SUGAR.smtpButtonGroup.subscribe('checkedButtonChange', function(e)
407             {
408                 SUGAR.email2.accounts.changeEmailScreenDisplay(e.newValue.get('value'));
409                 document.getElementById('smtp_settings').style.display = '';
410                 form.mail_smtptype.value = e.newValue.get('value');
411             });
412             YAHOO.widget.Button.addHiddenFieldsToForm(form);
413         }
414         //Hide Username/Password
415         SUGAR.email2.accounts.smtp_authenticate_field_display();
416         //Unset readonly fields
417         SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(false);
418         SUGAR.email2.accounts.changeEmailScreenDisplay('other');
419                 this.outboundDialog.render();
420         this.outboundDialog.show();
421     },
422
423     /**
424      * Accounts' Advanced Settings view toggle
425      */
426     toggleAdv : function() {
427         var adv = document.getElementById("ie_adv");
428         if(adv.style.display == 'none') {
429             adv.style.display = "";
430         } else {
431             adv.style.display = 'none';
432         }
433     },
434     
435         smtp_authenticate_field_display : function() {
436                 var smtpauth_req = document.getElementById("mail_smtpauth_req");
437                 document.getElementById("smtp_auth1").style.display = smtpauth_req.checked ? "" : "none";
438                 document.getElementById("smtp_auth2").style.display = smtpauth_req.checked ? "" : "none";
439         },
440
441     /**
442      * Changes the display used in the outbound email SMTP dialog to match the 
443      */
444     changeEmailScreenDisplay : function(smtptype, isSystemAccount)
445     {
446         document.getElementById("smtpButtonGroupTD").style.display = '';
447         document.getElementById("chooseEmailProviderTD").style.display = '';
448         document.getElementById("mailsettings1").style.display = '';
449         document.getElementById("mailsettings2").style.display = '';
450         document.getElementById("mail_smtppass_label").innerHTML = mod_strings.LBL_MAIL_SMTPPASS;
451         document.getElementById("mail_smtpport_label").innerHTML = mod_strings.LBL_MAIL_SMTPPORT;
452         document.getElementById("mail_smtpserver_label").innerHTML = mod_strings.LBL_MAIL_SMTPSERVER;
453         document.getElementById("mail_smtpuser_label").innerHTML = mod_strings.LBL_MAIL_SMTPUSER;
454         
455         switch (smtptype) {
456         case "yahoomail":
457             document.getElementById("mail_smtpserver").value = 'plus.smtp.mail.yahoo.com';
458             document.getElementById("mail_smtpport").value = '465';
459             document.getElementById("mail_smtpauth_req").checked = true;
460             var ssl = document.getElementById("mail_smtpssl");
461             for(var j=0;j<ssl.options.length;j++) {
462                 if(ssl.options[j].text == 'SSL') {
463                     ssl.options[j].selected = true;
464                     break;
465                 }
466             }
467             document.getElementById("mailsettings1").style.display = 'none';
468             document.getElementById("mailsettings2").style.display = 'none';
469             document.getElementById("mail_smtppass_label").innerHTML = 
470             document.getElementById("mail_smtppass_label").innerHTML = mod_strings.LBL_YAHOOMAIL_SMTPPASS;
471             document.getElementById("mail_smtpuser_label").innerHTML = mod_strings.LBL_YAHOOMAIL_SMTPUSER;
472             break;
473         case "gmail":
474             document.getElementById("mail_smtpserver").value = 'smtp.gmail.com';
475             document.getElementById("mail_smtpport").value = '587';
476             document.getElementById("mail_smtpauth_req").checked = true;
477             var ssl = document.getElementById("mail_smtpssl");
478             for(var j=0;j<ssl.options.length;j++) {
479                 if(ssl.options[j].text == 'TLS') {
480                     ssl.options[j].selected = true;
481                     break;
482                 }
483             }
484             document.getElementById("mailsettings1").style.display = 'none';
485             document.getElementById("mailsettings2").style.display = 'none';
486             document.getElementById("mail_smtppass_label").innerHTML = mod_strings.LBL_GMAIL_SMTPPASS;
487             document.getElementById("mail_smtpuser_label").innerHTML = mod_strings.LBL_GMAIL_SMTPUSER;
488             break;
489         case "exchange":
490             if ( document.getElementById("mail_smtpserver").value == 'plus.smtp.mail.yahoo.com' 
491                     || document.getElementById("mail_smtpserver").value == 'smtp.gmail.com' ) {
492                 document.getElementById("mail_smtpserver").value = '';
493             }
494             document.getElementById("mail_smtpport").value = '25';
495             document.getElementById("mail_smtpauth_req").checked = true;
496             document.getElementById("mailsettings1").style.display = '';
497             document.getElementById("mailsettings2").style.display = '';
498             document.getElementById("mail_smtppass_label").innerHTML = mod_strings.LBL_EXCHANGE_SMTPPASS;
499             document.getElementById("mail_smtpport_label").innerHTML = mod_strings.LBL_EXCHANGE_SMTPPORT;
500             document.getElementById("mail_smtpserver_label").innerHTML = mod_strings.LBL_EXCHANGE_SMTPSERVER;
501             document.getElementById("mail_smtpuser_label").innerHTML = mod_strings.LBL_EXCHANGE_SMTPUSER;
502             break;
503         }
504         if ( (typeof isSystemAccount != 'undefined') && isSystemAccount )
505         {
506             document.getElementById("smtpButtonGroupTD").style.display = 'none';
507             document.getElementById("chooseEmailProviderTD").style.display = 'none';
508             document.getElementById("mailsettings2").style.display = 'none';
509         }
510         
511         SUGAR.email2.accounts.smtp_authenticate_field_display();
512     },
513
514     /**
515     * Fill the gmail default values for inbound accounts.
516     */
517     fillInboundGmailDefaults: function () {
518         
519         document.forms['ieAccount'].elements['server_url'].value = "imap.gmail.com";
520         document.forms['ieAccount'].elements['ssl'].checked = true;
521         document.forms['ieAccount'].elements['protocol'].value = "imap";
522         SUGAR.email2.accounts.setPortDefault();
523     },
524     /**
525      * Sets Port field to selected protocol and SSL settings defaults
526      */
527     setPortDefault : function() {
528         var prot = document.getElementById('protocol');
529         var ssl  = document.getElementById('ssl');
530         var port = document.getElementById('port');
531         var stdPorts= new Array("110", "143", "993", "995");
532         var stdBool    = new Boolean(false);
533         var mailboxdiv = document.getElementById("mailboxdiv");
534         var trashFolderdiv = document.getElementById("trashFolderdiv");
535         var sentFolderdiv = document.getElementById("sentFolderdiv");
536                 var monitoredFolder = document.getElementById("subscribeFolderButton");
537         if(port.value == '') {
538             stdBool.value = true;
539         } else {
540             for(i=0; i<stdPorts.length; i++) {
541                 if(stdPorts[i] == port.value) {
542                     stdBool.value = true;
543                 }
544             }
545         }
546
547         if(stdBool.value == true) {
548             if(prot.value == 'imap' && ssl.checked == false) { // IMAP
549                 port.value = "143";
550             } else if(prot.value == 'imap' && ssl.checked == true) { // IMAP-SSL
551                 port.value = '993';
552             } else if(prot.value == 'pop3' && ssl.checked == false) { // POP3
553                 port.value = '110';
554             } else if(prot.value == 'pop3' && ssl.checked == true) { // POP3-SSL
555                 port.value = '995';
556             }
557         }
558         
559         if (prot.value == 'imap') {
560                 mailboxdiv.style.display = "";
561                 trashFolderdiv.style.display = "";
562                 sentFolderdiv.style.display = "";
563                 monitoredFolder.style.display = "";
564                 if (document.getElementById('mailbox').value == "") {
565                         document.getElementById('mailbox').value = "INBOX";
566                 }
567         } else {
568                 mailboxdiv.style.display = "none";
569                 trashFolderdiv.style.display = "none";
570                 sentFolderdiv.style.display = "none";
571                         monitoredFolder.style.display = "none";
572                 document.getElementById('mailbox').value = "";
573         } // else
574     },
575
576     /**
577      * Draws/removes red boxes around required fields.
578      */
579     ieAccountError : function(style) {
580         document.getElementById('server_url').className = style;
581         document.getElementById('email_user').className = style;
582         document.getElementById('email_password').className = style;
583         document.getElementById('protocol').className = style;
584         document.getElementById('port').className = style;
585     },
586     
587     checkOutBoundSelection: function() {
588         var select = Dom.get('outbound_email');
589         if (!select || select.selectedIndex == -1) { return; }
590         
591         var v = select.options[select.selectedIndex].value;
592         
593         if(v == '')
594         {
595                 select.options[select.selectedIndex].selected = false;
596                 v = select.options[0].value;
597         }
598         else if (v == 'SYSTEM_ADD')
599                 SUGAR.email2.accounts.showAddSmtp();
600                 
601         var foundError = false;
602         var errorAccounts = SUGAR.email2.composeLayout.outboundAccountErrors;
603                 for(i in errorAccounts)
604                 {
605                     if(v == i)
606                     {
607                         foundError = true;
608                         break;
609                     }
610                 }
611                 
612                 //Should username/password fields for outbound account.
613                 if(foundError)
614                     this.toggleInboundOutboundFields(true);
615                 else
616                     this.toggleInboundOutboundFields(false);
617                     
618         
619         
620     },
621     toggleInboundOutboundFields : function (display)
622     {
623         if(display)
624         {
625             Dom.removeClass("inboundAccountRequiredUsername", "yui-hidden");
626                     Dom.removeClass("inboundAccountRequiredPassword", "yui-hidden");
627         }
628         else
629         {
630             Dom.addClass("inboundAccountRequiredUsername", "yui-hidden");
631                     Dom.addClass("inboundAccountRequiredPassword", "yui-hidden");
632         }  
633     },
634     /**
635      * rebuilds the select options for mailer options
636      */
637     rebuildMailerOptions : function() {
638         var select = document.forms['ieAccount'].elements['outbound_email'];
639         SE.util.emptySelectOptions(select);
640                 
641         //Get the available sugar mailers 
642         var a_outbound = SE.accounts.outboundAccountsSettingsTable.getRecordSet().getRecords();
643  
644         for(i=0;i<a_outbound.length;i++)
645         {
646                 var t_record = a_outbound[i];
647                 var key = t_record.getData('id');
648                 var display = t_record.getData('name') + ' - ' + t_record.getData('mail_smtpserver');
649                 
650                 var opt = new Option(display, key);
651                 select.options.add(opt);
652                 if (key == SE.accounts.newAddedOutboundId) {
653                         select.options.selectedIndex = i;
654                 }
655         }
656
657         select.options.add(new Option('',''));
658         select.options.add(new Option(mod_strings.LBL_ADD_OUTBOUND_ACCOUNT,'SYSTEM_ADD'));
659         //Hide/Show username password fields if necessary.
660         SE.accounts.checkOutBoundSelection();
661     },
662     /**
663      * Empties all the fields in the accounts edit view
664      */
665     clearInboundAccountEditScreen:function() {
666         
667         document.getElementById('ie_id').value = '';
668         document.getElementById('ie_name').value = '';
669         document.getElementById('ie_from_name').value = SE.userPrefs.current_user.full_name;
670         document.getElementById('ie_from_addr').value = this.getReplyAddress();
671         document.getElementById('reply_to_addr').value = '';
672         document.getElementById('server_url').value = '';
673         document.getElementById('email_user').value = '';
674         document.getElementById('email_password').value = '';
675         document.getElementById('port').value = '';
676         document.getElementById('inbound_mail_smtpuser').value = '';
677         document.getElementById('inbound_mail_smtppass').value = '';
678         document.ieAccount.protocol.options[0].selected = true;
679         // handle SSL
680         document.getElementById('ssl').checked = false;
681         
682     },
683
684     /**
685      * Populates an account's fields in Settings->Accounts
686      */
687     fillIeAccount:function(jsonstr) {
688         var o = JSON.parse(jsonstr);
689
690         document.getElementById('ie_id').value = o.id;
691         document.getElementById('ie_name').value = o.name;
692         if (o.stored_options != null) {
693                 document.getElementById('ie_from_name').value = o.stored_options.from_name == 'undefined' ? '' : o.stored_options.from_name;    
694                 document.getElementById('ie_from_addr').value = o.stored_options.from_addr == 'undefined' ? '' : o.stored_options.from_addr;    
695                 document.getElementById('reply_to_addr').value = typeof(o.stored_options.reply_to_addr) == 'undefined' ? '' : o.stored_options.reply_to_addr;   
696                 if (o.stored_options.trashFolder != null) {
697                         document.getElementById('trashFolder').value = o.stored_options.trashFolder;
698                 }
699                 if (o.stored_options.sentFolder != null) {
700                         document.getElementById('sentFolder').value = o.stored_options.sentFolder;
701                 }
702         }
703         document.getElementById('server_url').value = o.server_url;
704         document.getElementById('email_user').value = o.email_user;
705         document.getElementById('email_password').value = o.email_password;
706         document.getElementById('port').value = o.port;
707         document.getElementById('group_id').value = o.group_id;
708         document.getElementById('mailbox').value = o.mailbox;
709
710
711         var i = 0;
712
713         // handle SSL
714         if(typeof(o.service[2]) != 'undefined') {
715             document.getElementById('ssl').checked = true;
716         }
717
718         // handle protocol
719         if(document.getElementById('protocol').value != o.protocol) {
720             var prot = document.getElementById('protocol');
721             for(i=0; i<prot.options.length; i++) {
722                 if(prot.options[i].value == o.service[3]) {
723                     prot.options[i].selected = true;
724                     this.setPortDefault();
725                 }
726             }
727         }
728  // handle SMTP selection
729         if(o.stored_options != null && typeof(o.stored_options.outbound_email) != 'undefined') {
730             var opts = document.getElementById('outbound_email').options;
731             for(i=0; i<opts.length; i++) {
732                 if(opts[i].value == o.stored_options.outbound_email) {
733                     opts[i].selected = true;
734                 }
735             }
736         }
737     },
738
739     deleteIeAccount : function(IeAccountID,IeGroupID) {
740         if(confirm(app_strings.LBL_EMAIL_IE_DELETE_CONFIRM)) 
741         {
742             overlay(app_strings.LBL_EMAIL_IE_DELETE, app_strings.LBL_EMAIL_ONE_MOMENT);
743
744             AjaxObject.target = 'frameFlex';
745             AjaxObject.startRequest(callbackAccountDelete, urlStandard + '&emailUIAction=deleteIeAccount&ie_id='+IeAccountID+'&group_id='+IeGroupID);
746             SUGAR.email2.accounts.refreshInboundAccountTable();
747          }                
748      },
749         
750        // Null check for Outbound Settings.
751     checkOutboundSettings: function() {
752         var errorMessage = '';
753         var isError = false;
754         if (typeof document.forms['outboundEmailForm'] != 'undefined') {
755             var mailName = document.getElementById('mail_name').value;
756             var smtpServer = document.getElementById('mail_smtpserver').value;
757             var smtpPort = document.getElementById('mail_smtpport').value;
758             
759             var mailsmtpauthreq = document.getElementById('mail_smtpauth_req');
760             if(trim(mailName) == '') {
761                 isError = true;
762                 errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_NAME + "<br/>";
763             }            
764             if(trim(smtpServer) == '') {
765                 isError = true;
766                 errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPSERVER + "<br/>";
767             }
768             if(trim(smtpPort) == '') {
769                 isError = true;
770                 errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPPORT + "<br/>";
771             }
772             if(mailsmtpauthreq.checked) {
773                 if(trim(document.getElementById('mail_smtpuser').value) == '') {
774                     isError = true;
775                     errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPUSER + "<br/>";
776                 }
777                 if(trim(document.getElementById('mail_smtppass').value) == '') {
778                     isError = true;
779                     errorMessage += app_strings.LBL_EMAIL_ACCOUNTS_SMTPPASS + "<br/>";
780                 }                
781             }
782         } 
783         if(isError) {
784             overlay(mod_strings.ERR_MISSING_REQUIRED_FIELDS, errorMessage, 'alert');
785             return false;    
786         } else {
787             return true;
788         }
789     },    
790     
791     testOutboundSettings: function() {
792         var errorMessage = '';
793         var isError = false;
794         var fromAddress = document.getElementById("outboundtest_from_address").value;
795         if (trim(fromAddress) == "") {
796             errorMessage += app_strings.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR + "<br/>";
797             overlay(mod_strings.ERR_MISSING_REQUIRED_FIELDS, errorMessage, 'alert');
798             return false;    
799
800         }
801         else if (!isValidEmail(fromAddress)) {
802             errorMessage += app_strings.LBL_EMAIL_SETTINGS_FROM_TO_EMAIL_ADDR + "<br/>";
803             overlay(mod_strings.ERR_INVALID_REQUIRED_FIELDS, errorMessage, 'alert');
804             return false;    
805         }
806         
807         //Hide the dialogue and show an in progress indicator.
808         SE.accounts.testOutboundDialog.hide();
809         overlay(app_strings.LBL_EMAIL_PERFORMING_TASK, app_strings.LBL_EMAIL_ONE_MOMENT, 'plain');
810         
811         //If the outbound mail type is a system override we need to re-enable the post fields otherwise
812         //nothing is sent in the request.
813         var outboundType = document.forms['outboundEmailForm'].elements['type'].value;
814         SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(false);
815             
816         YAHOO.util.Connect.setForm(document.getElementById("outboundEmailForm"));
817         if(outboundType == 'system-override')
818             SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(true);
819             
820         var data = "&emailUIAction=testOutbound&outboundtest_from_address=" +  fromAddress;
821         AjaxObject.startRequest(callbackOutboundTest, urlStandard + data);
822         
823     },
824     
825     testOutboundSettingsDialog: function() {
826         //Ensure that all settings are correct before proceeding to send test email.
827         if(!SE.accounts.checkOutboundSettings())
828             return;    
829     
830         // lazy load dialogue
831         if(!SE.accounts.testOutboundDialog) {
832                 SE.accounts.testOutboundDialog = new YAHOO.widget.Dialog("testOutboundDialog", {
833                 modal:true,
834                                 visible:true,
835                 fixedcenter:true,
836                 constraintoviewport: true,
837                 width   : 600,
838                 shadow  : true
839             });
840             SE.accounts.testOutboundDialog.setHeader(app_strings.LBL_EMAIL_TEST_OUTBOUND_SETTINGS);
841             Dom.removeClass("testOutboundDialog", "yui-hidden");
842         } // end lazy load
843         SE.accounts.testOutboundDialog.render();
844         SE.accounts.testOutboundDialog.show();
845     },
846     
847     /**
848      * Saves Outbound email settings
849      */
850     saveOutboundSettings : function() {
851         if(SE.accounts.checkOutboundSettings()) {
852             //Enable the form fields for the post.
853             SUGAR.email2.accounts.toggleOutboundAccountDisabledFields(false);
854             YAHOO.util.Connect.setForm(document.getElementById("outboundEmailForm"));
855             AjaxObject.startRequest(callbackOutboundSave, urlStandard + "&emailUIAction=saveOutbound");
856         } else {
857             return false;
858         }
859     },
860
861     saveIeAccount : function() {
862         
863         //Before saving check if there are any error messages associated with the outbound account.
864         var outboundID = document.getElementById('outbound_email').value;
865
866         if( SE.accounts.checkIeCreds({'valiateTrash': true,'validateFromAddr': true,'validateOutbound' :true,
867             'validateSMTPCreds':true}) ) 
868         {
869             document.getElementById('saveButton').disabled = true;
870
871             overlay(app_strings.LBL_EMAIL_IE_SAVE, app_strings.LBL_EMAIL_ONE_MOMENT);
872
873             var formObject = document.getElementById('ieAccount');
874             YAHOO.util.Connect.setForm(formObject);
875
876             AjaxObject._reset();
877             AjaxObject.target = 'frameFlex';
878             AjaxObject.startRequest(callbackAccount, urlStandard + '&emailUIAction=saveIeAccount');
879         }
880     },
881
882     testSettings : function() {
883         form = document.getElementById('ieAccount');
884
885         if(SE.accounts.checkIeCreds()) {
886             ie_test_open_popup_with_submit("InboundEmail", "Popup", "Popup", 400, 300, trim(form.server_url.value), form.protocol.value, trim(form.port.value), trim(form.email_user.value), Rot13.write(form.email_password.value), trim(form.mailbox.value), form.ssl.checked, true, "ieAccount");
887         }
888     },
889
890     getFoldersListForInboundAccountForEmail2 : function() {
891         form = document.getElementById('ieAccount');
892         if(SE.accounts.checkIeCreds()) {
893                 var mailBoxValue = form.mailbox.value;
894                 if (form.searchField.value.length > 0) {
895                         mailBoxValue = "";
896                 } // if
897             getFoldersListForInboundAccount("InboundEmail", "ShowInboundFoldersList", "Popup", 400, 300, form.server_url.value, form.protocol.value, form.port.value, form.email_user.value, Rot13.write(form.email_password.value), mailBoxValue, form.ssl.checked, true, form.searchField.value );
898         } // if
899         
900     },
901     
902     checkIeCreds : function(validateRules) {
903         if(typeof(validateRules) == 'undefined')    
904             validateRules = {};
905             
906         var errors = new Array();
907         var out = new String();
908
909         var ie_name = Dom.get('ie_name').value;
910         var fromAddress = Dom.get('ie_from_addr').value;
911         var server_url = Dom.get('server_url').value;
912         var email_user = Dom.get('email_user').value;
913         var email_password = Dom.get('email_password').value;
914         var protocol = Dom.get('protocol').value;
915         var port = Dom.get('port').value;
916         var oe = Dom.get('outbound_email');
917         var oe_value = typeof(oe.options[oe.selectedIndex]) == 'undefined' ? "" : oe.options[oe.selectedIndex].value;
918         
919         var outboundUserName = Dom.get('inbound_mail_smtpuser').value;
920         var outboundPass = Dom.get('inbound_mail_smtppass').value;
921         
922         //If the username and password were provided then ignore the error messge
923         
924         var outboundCredentialsFound = false;
925         
926         if(outboundUserName != "" && outboundPass != "")
927             outboundCredentialsFound = true;
928         
929         var validateSMTPCreds = (typeof(validateRules.validateSMTPCreds) != 'undefined' && validateRules.validateSMTPCreds);
930                 
931         if ( SE.composeLayout.outboundAccountErrors != null && SE.composeLayout.outboundAccountErrors[oe_value] != null 
932              && validateSMTPCreds)
933         {
934             if(trim(outboundUserName) == "") {
935                 errors.push(app_strings.LBL_EMAIL_ACCOUNTS_SMTPUSER);
936             }
937             if(trim(outboundPass) == "") {
938                 errors.push(app_strings.LBL_EMAIL_ACCOUNTS_SMTPPASS);
939             }
940         }
941
942         if(trim(ie_name) == "") {
943             errors.push(app_strings.LBL_EMAIL_ERROR_NAME);
944         }
945         
946         if ( typeof(validateRules.validateFromAddr) != 'undefined' && validateRules.validateFromAddr)
947         {            
948             if(trim(fromAddress) == "" || !isValidEmail(fromAddress) ) {
949                 errors.push(app_strings.LBL_EMAIL_ERROR_FROM_ADDRESS);
950             }
951         }
952         
953         
954         if( (typeof(validateRules.validateOutbound) != 'undefined' && validateRules.validateOutbound) && ( trim(oe_value) == ""
955              || trim(oe_value) == "SYSTEM_ADD") ) {
956             errors.push(app_strings.LBL_EMAIL_ERROR_NO_OUTBOUND);
957         }
958         if(trim(server_url) == "") {
959             errors.push(app_strings.LBL_EMAIL_ERROR_SERVER);
960         }
961         if(trim(email_user) == "") {
962             errors.push(app_strings.LBL_EMAIL_ERROR_USER);
963         }
964         if(trim(email_password) == "") {
965             errors.push(app_strings.LBL_EMAIL_ERROR_PASSWORD);
966         }
967         if(protocol == "") {
968             errors.push(app_strings.LBL_EMAIL_ERROR_PROTOCOL);
969         }
970         if (protocol == 'imap') {
971                 var mailbox = document.getElementById('mailbox').value;
972                 if (trim(mailbox) == "") {
973                         errors.push(app_strings.LBL_EMAIL_ERROR_MONITORED_FOLDER);
974                 } // if
975                 if (typeof(validateRules.valiateTrash) != 'undefined' && validateRules.valiateTrash) {
976                         var trashFolder = document.getElementById('trashFolder').value;
977                         if (trim(trashFolder) == "") {
978                                 errors.push(app_strings.LBL_EMAIL_ERROR_TRASH_FOLDER);
979                         } // if
980                         } // if
981         }
982         if(port == "") {
983             errors.push(app_strings.LBL_EMAIL_ERROR_PORT);
984         }
985
986         if(errors.length > 0) {
987             out = app_strings.LBL_EMAIL_ERROR_DESC;
988             for(i=0; i<errors.length; i++) {
989                 if(out != "") {
990                     out += "\n";
991                 }
992                 out += errors[i];
993             }
994
995             alert(out);
996             return false;
997         } else {
998
999             return true;
1000         }
1001     },
1002
1003     getIeAccount : function(ieId) {
1004         if(ieId == '')
1005             return;
1006
1007         overlay(app_strings.LBL_EMAIL_SETTINGS_RETRIEVING_ACCOUNT, app_strings.LBL_EMAIL_ONE_MOMENT);
1008                 var query = "&emailUIAction=getIeAccount&ieId=" + ieId;
1009
1010         AjaxObject.startRequest(callbackIeAccountRetrieve, urlStandard + query);
1011     },
1012
1013     /**
1014      * Iterates through TreeView nodes to apply styles dependent nature of node
1015      */
1016     renderTree:function() {
1017         SE.util.cascadeNodes(SE.tree.getRoot(), SE.accounts.setNodeStyle);
1018         SE.tree.render();
1019     },
1020     
1021     //Sets the style for any nodes that need it.
1022     setNodeStyle : function(node) {
1023         if (!node.data.origText) {
1024             node.data.origText = node.data.text;
1025         }
1026         //Set unread
1027         if (typeof(node.data.unseen) != 'undefined') {
1028                 if (node.data.unseen > 0) {
1029                                 node.setUpLabel('<b>' + node.data.origText + '(' + node.data.unseen + ')<b>');
1030                         }
1031                         else {
1032                                 node.setUpLabel(node.data.origText);
1033                         }
1034         } else {
1035                 node.setUpLabel('<span>' + node.data.origText + '</span>');
1036         }
1037         SE.accounts.setupDDTarget(node);
1038     },
1039     
1040     setupDDTarget : function(node) {
1041         if (node.ddTarget) {
1042                 node.ddTarget.removeFromGroup();
1043                 delete node.ddTarget;
1044         }
1045         var id = node.getElId();
1046         var num = id.substring(4);
1047         if (node.data.origText != SUGAR.language.get("Emails", "LNK_MY_INBOX") &&
1048                         node.data.origText != SUGAR.language.get("Emails", "LNK_MY_DRAFTS") &&  
1049                         node.data.origText != SUGAR.language.get("Emails", "LNK_SENT_EMAIL_LIST")) {
1050                 
1051                 node.ddTarget = new SUGAR.email2.folders.folderDD("ygtvcontentel" + num);
1052         }
1053         else if (node.data.origText == SUGAR.language.get("Emails", "LNK_MY_INBOX")){
1054                 node.ddTarget = new YAHOO.util.DDTarget("ygtvcontentel" + num);
1055         }
1056     },
1057
1058     /**
1059      * Async call to rebuild the folder list.  After a folder delete or account delete
1060      */
1061     rebuildFolderList : function() {
1062         overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT);
1063         AjaxObject.startRequest(callbackFolders, urlStandard + '&emailUIAction=rebuildFolders');
1064     },
1065     
1066     /**
1067      * Returns the number of remote accounts the user has active.
1068      */
1069     getAccountCount : function() {
1070         var tree = SE.tree;
1071         var count = 0;
1072         for(i=0; i<tree._nodes.length; i++) {
1073             var node = tree._nodes[i];
1074
1075             if(typeof(node) != 'undefined' && node.data.ieId) {
1076                 count++;
1077             }
1078         }
1079         return count;
1080     }
1081 };
1082 ////    END ACCOUNTS
1083 ///////////////////////////////////////////////////////////////////////////////
1084
1085
1086
1087
1088 ///////////////////////////////////////////////////////////////////////////////
1089 ////    CONTEXT MENU CALLS
1090 SE.contextMenus = {
1091     
1092     assignToDialogue : null,
1093     /**
1094      * Archives from context menu
1095      * @param Array uids
1096      * @param string ieId
1097      * @param string folder
1098      */
1099     _archiveToSugar : function(uids, ieId, folder) {
1100         var ser = '';
1101
1102         for(var i=0; i<uids.length; i++) { // using 1 index b/c getSelectedRowIds doubles the first row's id
1103             if(ser != "") ser += app_strings.LBL_EMAIL_DELIMITER;
1104             ser += uids[i];
1105         }
1106         AjaxObject.startRequest(callbackImportOneEmail, urlStandard + '&emailUIAction=getImportForm&uid=' + ser + "&ieId=" + ieId + "&mbox=" + folder);
1107     },
1108
1109     /**
1110      * Archives from context menu
1111      */
1112     archiveToSugar : function(menuItem) {
1113         SE.contextMenus.emailListContextMenu.hide();
1114         
1115         var rows = SE.grid.getSelectedRows();
1116         var uids = [];
1117         /* iterate through available rows JIC a row is deleted - use first available */
1118         for(var i=0; i<rows.length; i++) {
1119             uids[i] = SE.grid.getRecord(rows[0]).getData().uid;
1120         }
1121         var data = SE.grid.getRecord(rows[0]).getData();
1122         SE.contextMenus._archiveToSugar(uids, data.ieId, data.mbox);
1123     },
1124     
1125     /**
1126      * Popup the printable version and start system's print function.
1127      */
1128     viewPrintable : function(menuItem) {
1129         var rows = SE.grid.getSelectedRows();
1130         var data = SE.grid.getRecord(rows[0]).getData();
1131         SE.detailView.viewPrintable(data.ieId, data.uid, data.mbox);
1132     },
1133
1134     /**
1135      * Marks email flagged on mail server
1136      */
1137     markRead : function(type, contextMenuId) {
1138         SE.contextMenus.markEmail('read');
1139     },
1140
1141     /**
1142      * Assign this emails to people based on assignment rules
1143      */
1144     assignEmailsTo : function(type, contextMenuId) {
1145         if(!SE.contextMenus.assignToDialogue)
1146         {
1147                 SE.contextMenus.assignToDialogue = new YAHOO.widget.Dialog("assignToDiv", {
1148                 modal:true,
1149                                 visible:false,
1150                 fixedcenter:true,
1151                 constraintoviewport: true,
1152                 width   : "600px",
1153                 shadow  : true
1154             });
1155             SE.contextMenus.assignToDialogue.setHeader(app_strings.LBL_EMAIL_ASSIGN_TO);
1156             enableQS(true);
1157         }
1158        
1159         Dom.removeClass("assignToDiv", "yui-hidden");
1160         SE.contextMenus.assignToDialogue.render();
1161         SE.contextMenus.assignToDialogue.show();
1162     },
1163     
1164     /**
1165      * Marks email flagged on mail server
1166      */
1167     markFlagged : function(contextMenuId) {
1168         SE.contextMenus.markEmail('flagged');
1169     },
1170
1171     /**
1172      * Marks email unflagged on mail server
1173      */
1174     markUnflagged : function(contextMenuId) {
1175         SE.contextMenus.markEmail('unflagged');
1176     },
1177
1178     /**
1179      * Marks email unread on mail server
1180      */
1181     markUnread : function() {
1182         SE.contextMenus.markEmail('unread');
1183     },
1184
1185     /**
1186      * Deletes an email from context menu
1187      */
1188     markDeleted : function() {
1189         if(confirm(app_strings.LBL_EMAIL_DELETE_CONFIRM)) {
1190                 document.getElementById('_blank').innerHTML = "";
1191                 SE.contextMenus.markEmail('deleted');
1192         }
1193     },
1194
1195     /**
1196      * generic call API to apply a flag to emails on the server and on sugar
1197      * @param string type "read" | "unread" | "flagged" | "deleted"
1198      */
1199     markEmail : function(type) {
1200         SE.contextMenus.emailListContextMenu.hide();
1201         
1202         //var dm = SE.grid.getStore();
1203         //var uids = SE.grid.getSelectedRowIds();
1204         //var indexes = SE.grid.getSelectedRowIndexes();
1205         var rows = SE.grid.getSelectedRows();
1206         if (rows.length == 0)
1207                 rows = [SE.contextMenus.currentRow];
1208         var ser = [ ];
1209         
1210         for(var i=0; i<rows.length; i++) {
1211             ser.push(SE.grid.getRecord(rows[i]).getData().uid);
1212         }
1213
1214         ser = YAHOO.lang.JSON.stringify(ser);
1215             
1216         var ieId = SE.grid.getRecord(rows[0]).getData().ieId;
1217         var folder = SE.grid.getRecord(rows[0]).getData().mbox;
1218
1219
1220         var count = 0;
1221         
1222         
1223         if(type == 'read' || type == 'deleted') {
1224             // mark read
1225             for(var j=0; j<rows.length; j++) {
1226                 if(SE.grid.getRecord(rows[j]).getData().seen == '0') { 
1227                     count = count + 1;
1228                     SE.grid.getRecord(rows[j]).setData("seen", "1");
1229                 }
1230             }
1231            //bug# 40257 - adding if condition to check the ieId (Id of a sugar mail box) , which would be null for search email results
1232             if(ieId){
1233             var node = SE.folders.getNodeFromIeIdAndMailbox(ieId, folder);
1234             var unseenCount = node.data.unseen;
1235             if (isNaN(unseenCount)) {
1236                 unseenCount = 0;
1237             }
1238             var finalCount = parseInt(unseenCount) - count;
1239             node.data.unseen = finalCount;
1240
1241             SE.accounts.renderTree();
1242             }
1243         } else if(type == 'unread') {
1244             // mark unread
1245             for(var j=0; j<rows.length; j++) {
1246                 if(SE.grid.getRecord(rows[j]).getData().seen == '1') { // index [9] is the seen flag
1247                     count = count + 1;
1248                 }
1249             }
1250
1251             var node = SE.folders.getNodeFromIeIdAndMailbox(ieId, folder);
1252             var unseenCount = node.data.unseen;
1253             if (isNaN(unseenCount)) {
1254                 unseenCount = 0;
1255             }
1256             var finalCount = parseInt(unseenCount) + count;
1257             node.data.unseen = finalCount;
1258             SE.accounts.renderTree();
1259         }
1260
1261         if (type == 'unread') {
1262                 for(var i=0; i<rows.length; i++) {
1263                     SE.cache[folder + SE.grid.getRecord(rows[i]).getData().uid] = null;
1264                 } // for
1265         }
1266                 
1267                 overlay(app_strings.LBL_EMAIL_PERFORMING_TASK, app_strings.LBL_EMAIL_ONE_MOMENT);
1268         AjaxObject.startRequest(callbackContextmenus.markUnread, urlStandard + '&emailUIAction=markEmail&type=' + type + '&uids=' + ser + "&ieId=" + ieId + "&folder=" + folder);
1269     },
1270
1271     /**
1272      * refreshes the ListView to show changes to cache
1273      */
1274     markEmailCleanup : function() {
1275         SE.accounts.renderTree();
1276         hideOverlay();
1277         SE.listView.refreshGrid();
1278     },
1279
1280         showAssignmentDialog : function() {
1281                 if (SE.contextMenus.assignmentDialog == null) {
1282                         AjaxObject.startRequest(callbackAssignmentDialog, urlStandard + '&emailUIAction=getAssignmentDialogContent');
1283                 } else {
1284                         SE.contextMenus.assignmentDialog.show();
1285                 } // else
1286         },
1287         
1288         /**
1289      * shows the import dialog with only relate visible.
1290      */
1291     relateTo : function() {
1292         SE.contextMenus.emailListContextMenu.hide();
1293         
1294         var rows = SE.grid.getSelectedRows();
1295         var data = SE.grid.getRecord(rows[0]).getData();
1296         var ieId = data.ieId;
1297         var folder = data.mbox;
1298         var uids = [];
1299         /* iterate through available rows JIC a row is deleted - use first available */
1300         for(var i=0; i<rows.length; i++) {
1301             uids[i] = SE.grid.getRecord(rows[i]).getData().uid;
1302         }
1303         var ser = JSON.stringifyNoSecurity(uids);
1304         
1305         AjaxObject.startRequest(callbackRelateEmail, urlStandard + '&emailUIAction=getRelateForm&uid=' + ser + "&ieId=" + ieId + "&mbox=" + folder);
1306     },
1307
1308         /**
1309      * shows the import dialog with only relate visible.
1310      */
1311     showDetailView : function() {
1312         SE.contextMenus.emailListContextMenu.hide();
1313         var rows = SE.grid.getSelectedRows();
1314         if (rows.length > 1) {
1315                 alert(app_strings.LBL_EMAIL_SELECT_ONE_RECORD);
1316                 return;
1317         }
1318         var ieId = SE.grid.getRecord(rows[0]).getData().ieId;
1319         var folder = SE.grid.getRecord(rows[0]).getData().mbox;
1320         /* iterate through available rows JIC a row is deleted - use first available */
1321         var uid = SE.grid.getRecord(rows[0]).getData().uid;
1322         SE.contextMenus.showEmailDetailViewInPopup(ieId, uid, folder);
1323     },
1324     
1325     /**
1326      *
1327      */
1328     showEmailDetailViewInPopup : function(ieId,uid, folder) {
1329         overlay(app_strings.LBL_EMAIL_RETRIEVING_RECORD, app_strings.LBL_EMAIL_ONE_MOMENT);
1330         AjaxObject.startRequest(callbackEmailDetailView, urlStandard + '&emailUIAction=getEmail2DetailView&uid=' + uid + "&ieId=" + ieId + "&mbox=" + folder + "&record=" + uid);
1331     },
1332     
1333     /**
1334      * Opens multiple messages from ListView context click
1335      */
1336     openMultiple : function() {
1337         SE.contextMenus.emailListContextMenu.hide();
1338
1339         var rows = SE.grid.getSelectedRows();
1340         var uids = SE.listView.getUidsFromSelection();
1341
1342         if(uids.length > 0) {
1343             var mbox = SE.grid.getRecord(rows[0]).getData().mbox;
1344             var ieId = SE.grid.getRecord(rows[0]).getData().ieId;
1345             SE.detailView.populateDetailViewMultiple(uids, mbox, ieId, true);
1346         }
1347     },
1348
1349     /**
1350      * Replies/forwards email
1351      */
1352     replyForwardEmailContext : function() {
1353         SE.contextMenus.emailListContextMenu.hide();
1354
1355         var indexes = SE.grid.getSelectedRows();
1356         //var dm = SE.grid.getDataModel();
1357         var type = this.id;
1358
1359         for(var i=0; i<indexes.length; i++) {
1360             var row = SE.grid.getRecord(indexes[i]).getData();
1361             SE.composeLayout.c0_replyForwardEmail(row.ieId, row.uid, row.mbox, type);
1362         }
1363     },
1364     
1365     //show menu functions
1366     showEmailsListMenu : function(grid, row) {
1367
1368        var data = row.getData();
1369        var draft = (data.type == "draft");
1370        var menu = SE.contextMenus.emailListContextMenu;
1371        var folderNode;
1372
1373        if (SE.tree) 
1374        {       
1375                if (data.mbox == 'sugar::Emails') 
1376                    folderNode = SE.folders.getNodeFromIeIdAndMailbox('folder', data.ieId);
1377                else 
1378                    folderNode = SE.folders.getNodeFromIeIdAndMailbox(data.ieId, data.mbox);
1379                    
1380                if (  folderNode != null && typeof(folderNode) != "undefined"  && typeof(folderNode.data) != "undefined" 
1381                    && ((folderNode.data.is_group != null) && (folderNode.data.is_group == 'true')) 
1382                   ||  (folderNode != null && folderNode.data.isGroup != null && folderNode.data.isGroup == "true"))
1383                        menu.getItem(menu.itemsMapping.assignTo).cfg.setProperty("disabled", false); //Assign emails item
1384                else 
1385                    menu.getItem(menu.itemsMapping.assignTo).cfg.setProperty("disabled", true); //Assign emails item 
1386        } 
1387        else 
1388            menu.getItem(menu.itemsMapping.assignTo).cfg.setProperty("disabled", true);
1389       
1390        menu.getItem(menu.itemsMapping.archive).cfg.setProperty("disabled", draft);
1391        menu.getItem(menu.itemsMapping.reply).cfg.setProperty("disabled", draft);
1392        menu.getItem(menu.itemsMapping.replyAll).cfg.setProperty("disabled", draft);
1393        menu.getItem(menu.itemsMapping.forward).cfg.setProperty("disabled", draft);
1394        menu.getItem(menu.itemsMapping.mark).cfg.setProperty("disabled", draft);
1395
1396                                   
1397        if (data.mbox == "sugar::Emails") 
1398        {
1399            //Allow users to reassign imported emails
1400            menu.getItem(menu.itemsMapping.assignTo).cfg.setProperty("disabled", false);
1401            menu.getItem(menu.itemsMapping.archive).cfg.setProperty("disabled", true);
1402            menu.getItem(menu.itemsMapping.viewRelationships).cfg.setProperty("disabled", false);
1403            menu.getItem(menu.itemsMapping.relateTo).cfg.setProperty("disabled", false);
1404        } 
1405        else 
1406        {
1407            menu.getItem(menu.itemsMapping.viewRelationships).cfg.setProperty("disabled", true);
1408            menu.getItem(menu.itemsMapping.relateTo).cfg.setProperty("disabled", true);
1409        }
1410     },
1411     
1412     showFolderMenu : function(grid, rowIndex, event) {
1413        event.stopEvent();
1414        var coords = event.getXY();
1415        SE.contextMenus.emailListContextMenu.showAt([coords[0], coords[1]]);
1416     }
1417 };
1418
1419 SE.contextMenus.dv = {
1420     archiveToSugar : function(contextMenuId) {
1421
1422         SE.contextMenus._archiveToSugar(uids, ieId, folder);
1423     },
1424
1425     replyForwardEmailContext : function(all) {
1426         SE.contextMenus.detailViewContextMenu.hide();
1427     }
1428
1429 };
1430
1431
1432
1433
1434
1435 ////    END SE.contextMenus
1436 ///////////////////////////////////////////////////////////////////////////////
1437
1438
1439
1440 ///////////////////////////////////////////////////////////////////////////////
1441 ////    DETAIL VIEW
1442 SE.detailView = {
1443     consumeMetaDetail : function(ret) {
1444         // handling if the Email drafts
1445         if(ret.type == 'draft') {
1446             SE.composeLayout.c0_composeDraft(); 
1447             return;
1448         }
1449         
1450
1451         // cache contents browser-side
1452         SE._setDetailCache(ret);
1453
1454         var displayTemplate = new YAHOO.SUGAR.Template(SE.templates['displayOneEmail']);
1455         // 2 below must be in global context
1456         meta = ret.meta;
1457         meta['panelId'] = SE.util.getPanelId();
1458
1459         email = ret.meta.email;
1460         var out = displayTemplate.exec({
1461             'app_strings' : app_strings,
1462             'theme' : theme,
1463             'idx' : targetDiv.id,
1464             'meta' : meta,
1465             'email' : meta.email,
1466             'linkBeans' : linkBeans
1467         });
1468         var tabLabel = meta.email.name;
1469         if (tabLabel != null && tabLabel.length > 25) {
1470                 tabLabel = tabLabel.substring(0, 25) + "...";
1471         } // if
1472         targetDiv.set("label", tabLabel);
1473         targetDiv.set("content", out);
1474         
1475         var displayEmailFrameDiv = document.getElementById('displayEmailFrameDiv' + targetDiv.id);
1476         if (SUGAR.email2.util.isIe()) {
1477                 displayEmailFrameDiv.style.height = "390px";
1478         } else {
1479                 displayEmailFrameDiv.style.height = "410px";
1480         }
1481
1482         var displayFrame = document.getElementById('displayEmailFrame' + targetDiv.id);
1483         displayFrame.contentWindow.document.write(email.description);
1484         displayFrame.contentWindow.document.close();
1485         
1486         // hide archive links
1487         if(ret.meta.is_sugarEmail) {
1488                         document.getElementById("archiveEmail" + targetDiv.id).style.display = "none";                  
1489             document.getElementById("btnEmailView" + targetDiv.id).style.display = "none";
1490         } else {
1491             if (document.getElementById("showDeialViewForEmail" + targetDiv.id))
1492                 document.getElementById("showDeialViewForEmail" + targetDiv.id).style.display = "none";
1493         } // else
1494         
1495     },
1496
1497     consumeMetaPreview : function(ret) {
1498         // cache contents browser-side
1499         SE._setDetailCache(ret);
1500         
1501         
1502         
1503         var currrow = SE.grid.getLastSelectedRecord();
1504         currrow = SE.grid.getRecord(currrow);
1505         if (!currrow) {
1506             document.getElementById('_blank').innerHTML = '';
1507             return;
1508         }
1509         // handling if the Email drafts
1510         if(ret.type == 'draft'){
1511             if (currrow.getData().uid == ret.uid) {
1512                 SE.composeLayout.c0_composeDraft();
1513             }
1514             return;
1515         }
1516         
1517         if (currrow.getData().uid != ret.meta.uid) {
1518            return;
1519         }
1520         
1521         // remove loading sprite
1522         document.getElementById('_blank').innerHTML = '<iframe id="displayEmailFramePreview"/>';
1523         var displayTemplate = new YAHOO.SUGAR.Template(SE.templates['displayOneEmail']);
1524         meta = ret.meta;
1525         meta['panelId'] = SE.util.getPanelId();
1526         email = ret.meta.email;
1527
1528         document.getElementById('_blank').innerHTML = displayTemplate.exec({
1529             'app_strings' : app_strings,
1530             'theme' : theme,
1531             'idx' : 'Preview',
1532             'meta' : meta,
1533             'email' :meta.email,
1534             'linkBeans' : linkBeans
1535         });
1536        // document.getElementById('_blank').innerHTML = meta.email;
1537        /* displayTemplate.append('_blank', {
1538             'app_strings' : app_strings,
1539             'theme' : theme,
1540             'idx' : 'Preview',
1541             'meta' : meta,
1542             'email' :meta.email,
1543             'linkBeans' : linkBeans
1544         });*/
1545         
1546         var displayFrame = document.getElementById('displayEmailFramePreview');
1547         displayFrame.contentWindow.document.write(email.description);
1548         displayFrame.contentWindow.document.close();
1549         
1550         SE.listViewLayout.resizePreview();
1551
1552         // hide archive links
1553         if(ret.meta.is_sugarEmail) {
1554             document.getElementById("archiveEmailPreview").innerHTML = "&nbsp;";
1555             document.getElementById("btnEmailViewPreview").style.display = "none";
1556             document.getElementById("archiveEmail" + meta['panelId']).style.display = "none";
1557         } else {
1558           //hide view relationship link
1559                  document.getElementById("showDeialViewForEmail" + meta['panelId']).style.display = "none";
1560         }
1561     },
1562
1563     /**
1564      * wraps emailDelete() for single messages, comes from preview or tab
1565      */
1566     emailDeleteSingle : function(ieId, uid, mbox) {
1567         if(confirm(app_strings.LBL_EMAIL_DELETE_CONFIRM)) {
1568             // find active panel and close if the user double clicked the email to view.
1569             var activeTabId = SE.util.getPanelId();
1570             if(activeTabId != 'Preview')
1571                 SE.innerLayout.get("activeTab").close();
1572             
1573             document.getElementById('_blank').innerHTML = "";
1574                 var ser = [ ];
1575                         ser.push(uid);
1576                 uid = JSON.stringifyNoSecurity(ser);
1577             this.emailDelete(ieId, uid, mbox);
1578         }
1579     },
1580
1581     /**
1582      * Sends async call to delete a given message
1583      * @param
1584      */
1585     emailDelete : function(ieId, uid, mbox) {
1586        overlay(app_strings.LBL_EMAIL_DELETING_MESSAGE, app_strings.LBL_EMAIL_ONE_MOMENT);
1587        AjaxObject.startRequest(callbackContextmenus.markUnread, urlStandard + '&emailUIAction=markEmail&type=deleted&uids=' + 
1588            uid + "&ieId=" + ieId + "&folder=" + mbox);
1589     },
1590
1591     /**
1592      * retrieves one email to display in the preview pane.
1593      */
1594     getEmailPreview : function() {
1595         var row = SUGAR.email2.listView.currentRow;
1596         var data = row.getData();
1597             if (data && !(SUGAR.email2.contextMenus.emailListContextMenu.cfg.getProperty("visible") && data.type =='draft')) {
1598                var setRead = (data['seen'] == 0) ? true : false;
1599                    SUGAR.email2.listView.markRead(SUGAR.email2.listView.currentRowIndex, row);
1600                    SUGAR.email2.detailView.populateDetailView(data['uid'], data['mbox'], data['ieId'], setRead, SUGAR.email2.previewLayout);
1601             }
1602     },
1603
1604     /**
1605      * Imports one email into Sugar
1606      */
1607     importEmail : function(ieId, uid, mbox) {
1608         SE.util.clearHiddenFieldValues('emailUIForm');
1609
1610         overlay(app_strings.LBL_EMAIL_IMPORTING_EMAIL, app_strings.LBL_EMAIL_ONE_MOMENT);
1611
1612         var vars = "&ieId=" + ieId + "&uid=" + uid + "&mbox=" + mbox;
1613         AjaxObject.target = '';
1614         AjaxObject.startRequest(callbackImportOneEmail, urlStandard + '&emailUIAction=getImportForm' + vars);
1615     },
1616
1617     /**
1618      * Populates the frameFlex div with the contents of an email
1619      */
1620     populateDetailView : function(uid, mbox, ieId, setRead, destination) {
1621         SUGAR.email2.util.clearHiddenFieldValues('emailUIForm');
1622
1623         var mboxStr = new String(mbox);
1624         var compKey = mbox + uid;
1625
1626         if(setRead == true) {
1627                 SE.listView.boldUnreadRows()
1628                 SE.folders.decrementUnreadCount(ieId, mbox, 1);
1629         }
1630
1631         if(destination == SE.innerLayout) {
1632                 /*
1633              * loading email into a tab, peer with ListView
1634              * targetDiv must remain in the global namespace as it is used by AjaxObject
1635              */
1636                 //Check if we already have a tab of the email open
1637                 var tabs = SE.innerLayout.get("tabs");
1638                 for (var t in tabs) {
1639                         if (tabs[t].id && tabs[t].id == uid) {
1640                                 SE.innerLayout.set("activeTab", tabs[t]);
1641                                 return;
1642                         }
1643                 }
1644                 
1645                 targetDiv = new YAHOO.SUGAR.ClosableTab({
1646                                 label: loadingSprite,
1647                                         scroll : true,
1648                                         content : "",
1649                                         active : true
1650                 }, SE.innerLayout);
1651                 targetDiv.id = uid;
1652                 SE.innerLayout.addTab(targetDiv);
1653             
1654             // use cache if available
1655             if(SE.cache[compKey]) {
1656                 SE.detailView.consumeMetaDetail(SE.cache[compKey]);
1657             } else {
1658                 // open email as peer-tab to listView
1659                 SE.detailView.requestEmailContents(mboxStr, uid, mbox, ieId, AjaxObject.detailView.callback.emailDetail);
1660                // AjaxObject.startRequest(AjaxObject.detailView.callback.emailDetail, null); 
1661             }
1662         } else {
1663             // loading email into preview pane
1664             document.getElementById('_blank').innerHTML = loadingSprite;
1665
1666             // use cache if available
1667             if(SE.cache[compKey]) {
1668                 SE.detailView.consumeMetaPreview(SE.cache[compKey]);
1669             } else {
1670                 AjaxObject.forceAbort = true;
1671                 // open in preview window
1672                 SE.detailView.requestEmailContents(mboxStr, uid, mbox, ieId, AjaxObject.detailView.callback.emailPreview);
1673                // AjaxObject.startRequest(AjaxObject.detailView.callback.emailPreview, null); 
1674             }
1675         }
1676     },
1677     
1678     requestEmailContents : function(mboxStr, uid, mbox, ieId, callback)
1679     {
1680         if(mboxStr.substring(0,7) == 'sugar::') {
1681             // display an email from Sugar
1682             document.getElementById('emailUIAction').value = 'getSingleMessageFromSugar';
1683         } else {
1684             // display an email from an email server
1685             document.getElementById('emailUIAction').value = 'getSingleMessage';
1686         }
1687         document.getElementById('mbox').value = mbox;
1688         document.getElementById('ieId').value = ieId;
1689         document.getElementById('uid').value = uid;
1690
1691         YAHOO.util.Connect.setForm(document.getElementById('emailUIForm'));
1692
1693         AjaxObject.forceAbort = true;
1694         AjaxObject.target = '_blank';
1695         AjaxObject.startRequest(callback, null); 
1696     },
1697
1698     /**
1699      * Retrieves multiple emails for DetailView
1700      */
1701     populateDetailViewMultiple : function(uids, mbox, ieId, setRead) {
1702         overlay(app_strings.LBL_EMAIL_RETRIEVING_MESSAGE, app_strings.LBL_EMAIL_ONE_MOMENT);
1703         SE.util.clearHiddenFieldValues('emailUIForm');
1704
1705         var mboxStr = new String(mbox);
1706
1707         uids = SE.util.cleanUids(uids);
1708
1709         if(mboxStr.substring(0,7) == 'sugar::') {
1710             // display an email from Sugar
1711             document.getElementById('emailUIAction').value = 'getMultipleMessagesFromSugar';
1712             document.getElementById('uid').value = uids;
1713         } else {
1714             // display an email from an email server
1715             document.getElementById('emailUIAction').value = 'getMultipleMessages';
1716             document.getElementById('mbox').value = mbox;
1717             document.getElementById('ieId').value = ieId;
1718             document.getElementById('uid').value = uids;
1719         }
1720
1721         var formObject = document.getElementById('emailUIForm');
1722         YAHOO.util.Connect.setForm(formObject);
1723
1724         AjaxObject.target = 'frameFlex';
1725         AjaxObject.startRequest(callbackEmailDetailMultiple, null);
1726
1727         if(setRead == true) {
1728             var c = uids.split(",");
1729             SE.folders.decrementUnreadCount(ieId, mbox, c.length);
1730         }
1731     },
1732
1733     /**
1734      * Makes async call to get QuickCreate form
1735      * Renders a modal edit view for a given module
1736      */
1737     quickCreate : function(module, ieId, uid, mailbox) {
1738         var get = "&qc_module=" + module + "&ieId=" + ieId + "&uid=" + uid + "&mailbox=" + mailbox;
1739
1740         if(ieId == null || ieId == "null" || mailbox == 'sugar::Emails') {
1741             get += "&sugarEmail=true";
1742         }
1743         
1744         AjaxObject.startRequest(callbackQuickCreate, urlStandard + '&emailUIAction=getQuickCreateForm' + get);
1745     },
1746
1747     /**
1748      * Makes async call to save a quick create
1749      * @param bool
1750      */
1751     saveQuickCreate : function(action) {
1752         var qcd = SE.detailView.quickCreateDialog;
1753         if (check_form('form_EmailQCView_' + qcd.qcmodule)) {
1754                 var formObject = document.getElementById('form_EmailQCView_' + qcd.qcmodule);
1755                 var theCallback = callbackQuickCreateSave;
1756                 var accountType = '&sugarEmail=true';
1757                 if (qcd.ieId != 'null' && qcd.mbox != 'sugar::Emails') {
1758                    accountType = '&ieId=' + qcd.ieId;
1759                 }
1760                 
1761             if (action == 'reply') {
1762                    theCallback = callbackQuickCreateSaveAndReply;
1763                 } else if (action == true) {
1764                     theCallback = callbackQuickCreateSaveAndAddToAddressBook;
1765                 }
1766                 formObject.action.value = 'EmailUIAjax';
1767                 YAHOO.util.Connect.setForm(formObject);
1768                 overlay('Saving', app_strings.LBL_EMAIL_ONE_MOMENT);
1769                 AjaxObject.startRequest(theCallback, "to_pdf=true&emailUIAction=saveQuickCreate&qcmodule=" + qcd.qcmodule + '&uid=' + qcd.uid +
1770                                        accountType + '&mbox=' + qcd.mbox);
1771         }
1772     },
1773
1774     /**
1775      * Code to show/hide long list of email address in DetailView
1776      */
1777     showCroppedEmailList : function(el) {
1778         el.style.display = 'none';
1779         el.previousSibling.style.display = 'inline'
1780     },
1781     showFullEmailList : function(el) {
1782         el.style.display = 'none';
1783         el.nextSibling.style.display = 'inline';
1784     },
1785
1786     /**
1787      * Shows the QuickCreate overlay
1788      * @param string ieId
1789      * @param string uid
1790      * @param string mailbox
1791      */
1792     showQuickCreate : function(ieId, uid, mailbox) {
1793         var panelId = SE.util.getPanelId();
1794         var context = document.getElementById("quickCreateSpan" + panelId);
1795         
1796         if (!SE.detailView.cqMenus)
1797                 SE.detailView.cqMenus = {};
1798         
1799         if (SE.detailView.cqMenus[context]) 
1800                 SE.detailView.cqMenus[context].destroy();
1801         
1802             var menu = SE.detailView.cqMenus[context] = new YAHOO.widget.Menu("qcMenuDiv" + panelId, {
1803                 lazyload:true,
1804                 context: ["quickCreateSpan" + panelId, "tr","br", ["beforeShow", "windowResize"]]
1805         });
1806             
1807             for (var i=0; i < this.qcmodules.length; i++) {
1808             var module = this.qcmodules[i];
1809             menu.addItem({
1810                 text:   app_strings['LBL_EMAIL_QC_' + module.toUpperCase()],
1811                 modulename: module,
1812                 value: module,
1813                 onclick: { fn: function() {
1814                                 SE.detailView.quickCreate(this.value, ieId, uid, mailbox);
1815                         }
1816                 }
1817             });
1818         }
1819                 
1820                 menu.render(document.body);
1821                 menu.show();
1822     },
1823
1824     /**
1825      * Displays the "View" submenu in the detailView
1826      * @param string ieId
1827      * @param string uid
1828      * @param string mailbox
1829      */
1830     showViewMenu : function(ieId, uid, mailbox) {
1831         var panelId = SE.util.getPanelId();
1832         var context = "btnEmailView" + panelId;
1833         if (!SE.detailView.viewMenus)
1834                 SE.detailView.viewMenus = {};
1835         
1836         if (SE.detailView.viewMenus[context]) 
1837                 SE.detailView.viewMenus[context].destroy();
1838         
1839             var menu = SE.detailView.viewMenus[context] = new YAHOO.widget.Menu("menuDiv" + panelId, {
1840                 lazyload:true,
1841                 context: ["btnEmailView" + panelId, "tl","bl", ["beforeShow", "windowResize"]],
1842                 clicktohide: true
1843         });
1844                 menu.addItems(
1845                                 (ieId == 'null' || ieId == null) ? 
1846                         //No ieId - Sugar Email
1847                         [{
1848                                 text: app_strings.LBL_EMAIL_VIEW_RAW,
1849                                 onclick: { fn: function() {SE.detailView.viewRaw(ieId, uid, mailbox);} }
1850             }]
1851                         :
1852                         //IeID exists, on a remote server
1853                         [{
1854                 text: app_strings.LBL_EMAIL_VIEW_HEADERS,
1855                 onclick: { fn: function() {SE.detailView.viewHeaders(ieId, uid, mailbox);}}
1856             },{
1857                 text: app_strings.LBL_EMAIL_VIEW_RAW,
1858                 onclick: { fn: function() {SE.detailView.viewRaw(ieId, uid, mailbox);}}
1859             }]
1860         );
1861                 menu.render(document.body);
1862                 menu.show();
1863                 
1864
1865         /*
1866         //#23108 jchi@07/17/2008
1867         menu.render('quickCreateSpan'+ panelId);*/
1868         //this.viewMenu = menu;
1869         //this.viewMenu.show(context);
1870     },
1871     /**
1872      * Makes async call to get an email's headers
1873      */
1874     viewHeaders : function(ieId, uid, mailbox) {
1875         var get = "&type=headers&ieId=" + ieId + "&uid=" + uid + "&mailbox=" + mailbox;
1876         AjaxObject.startRequest(AjaxObject.detailView.callback.viewRaw, urlStandard + "&emailUIAction=displayView" + get);
1877     },
1878
1879     /**
1880      * Makes async call to get a printable version
1881      */
1882     viewPrintable : function(ieId, uid, mailbox) {
1883         if(mailbox == 'sugar::Emails') {
1884             // display an email from Sugar
1885             var emailUIAction = '&emailUIAction=getSingleMessageFromSugar';
1886         } else {
1887             // display an email from an email server
1888             var emailUIAction = '&emailUIAction=getSingleMessage';
1889         }
1890
1891         var get = "&type=printable&ieId=" + ieId + "&uid=" + uid + "&mbox=" + mailbox;
1892         AjaxObject.startRequest(AjaxObject.detailView.callback.viewPrint, urlStandard + emailUIAction + get);
1893     },
1894
1895     /**
1896      * Makes async call to get an email's raw source
1897      */
1898     viewRaw : function(ieId, uid, mailbox) {
1899         var get = "&type=raw&ieId=" + ieId + "&uid=" + uid + "&mailbox=" + mailbox;
1900         AjaxObject.startRequest(AjaxObject.detailView.callback.viewRaw, urlStandard + "&emailUIAction=displayView" + get);
1901     },
1902     
1903     /**
1904      * Display all email addresses in detailview.
1905      */
1906     displayAllAddrs : function(el) {
1907         el.style.display = 'none';
1908         Dom.getNextSibling(el).style.display = 'inline';
1909     }
1910 };
1911 ////    END SE.detailView
1912 ///////////////////////////////////////////////////////////////////////////////
1913
1914
1915
1916 ///////////////////////////////////////////////////////////////////////////////
1917 ////    SE.folders
1918 SE.folders = {
1919     contextMenuFocus : new Object(),
1920
1921     /**
1922      * Generates a standardized identifier that allows reconstruction of I-E ID-folder strings or
1923      * SugarFolder ID - folder strings
1924      */
1925     _createFolderId : function(node) {
1926         var ret = '';
1927
1928         if(!node.data.id)
1929             return ret;
1930
1931         if(node.data.ieId) {
1932             /* we have a local Sugar folder */
1933             if(node.data.ieId == 'folder') {
1934                 ret = "sugar::" + node.data.id; // FYI: folder_id is also stored in mbox field
1935             } else if(node.data.ieId.match(SE.reGUID)) {
1936                 ret = "remote::" + node.data.ieId + "::" + node.data.mbox.substr(node.data.mbox.indexOf("INBOX"), node.data.mbox.length);
1937             }
1938         } else {
1939             ret = node.data.id;
1940         }
1941
1942         return ret;
1943     },
1944
1945     addChildNode : function(parentNode, childNode) {
1946         var is_group = (childNode.properties.is_group == 'true') ? 1 : 0;
1947         var is_dynamic = (childNode.properties.is_dynamic == 'true') ? 1 : 0;
1948         var node = this.buildTreeViewNode(childNode.label, childNode.properties.id, is_group, is_dynamic, childNode.properties.unseen, parentNode, childNode.expanded);
1949
1950         if(childNode.nodes) {
1951             if(childNode.nodes.length > 0) {
1952                 for(j=0; j<childNode.nodes.length; j++) {
1953                     var newChildNode = childNode.nodes[j];
1954                     this.addChildNode(node, newChildNode);
1955                 }
1956             }
1957         }
1958     },
1959    
1960     /**
1961      * Builds and returns a new TreeView Node
1962      * @param string name
1963      * @param string id
1964      * @param int is_group
1965      * @return object
1966      */
1967     buildTreeViewNode : function(name, id, is_group, is_dynamic, unseen, parentNode, expanded) {
1968         var node = new YAHOO.widget.TextNode(name, parentNode, true);
1969
1970         //node.href = " SE.listView.populateListFrameSugarFolder(YAHOO.namespace('frameFolders').selectednode, '" + id + "', 'false');";
1971         node.expanded = expanded;
1972         node.data = new Object;
1973         node.data['id'] = id;
1974         node.data['mbox'] = id; // to support DD imports into BRAND NEW folders
1975         node.data['label'] = name;
1976         node.data['ieId'] = 'folder';
1977         node.data['isGroup'] = (is_group == 1) ? 'true' : 'false';
1978         node.data['isDynamic'] = (is_dynamic == 1) ? 'true' : 'false';
1979         node.data['unseen'] = unseen;
1980         return node;
1981     },
1982
1983     /**
1984      * ensures that a new folder has a valid name
1985      */
1986     checkFolderName : function(name) {
1987         if(name == "")
1988             return false;
1989
1990         this.folderAdd(name);
1991     },
1992
1993     /**
1994      * Pings email servers for new email - forces refresh of folder pane
1995      */
1996     checkEmailAccounts : function() {
1997         this.checkEmailAccountsSilent(true);
1998     },
1999
2000     checkEmailAccountsSilent : function(showOverlay) {
2001         if(typeof(SE.folders.checkingMail)) {
2002             clearTimeout(SE.folders.checkingMail);
2003         }
2004
2005         // don't stomp an on-going request
2006         if(AjaxObject.currentRequestObject.conn == null) {
2007             if(showOverlay) {
2008                 overlay(app_strings.LBL_EMAIL_CHECKING_NEW,
2009                       app_strings.LBL_EMAIL_ONE_MOMENT + "<br>&nbsp;<br><i>" + app_strings.LBL_EMAIL_CHECKING_DESC + "</i>");
2010             }
2011             AjaxObject.startRequest(AjaxObject.folders.callback.checkMail, urlStandard + '&emailUIAction=checkEmail&all=true');
2012         } else {
2013             // wait 5 secs before trying again.
2014             SE.folders.checkingMail = setTimeout("SE.folders.checkEmailAccountsSilent(false);", 5000);
2015         }
2016     },
2017     
2018     /**
2019      * Starts check of all email Accounts using a loading bar for large POP accounts
2020      */
2021     startEmailAccountCheck : function() {
2022         // don't do two checks at the same time
2023        if(!AjaxObject.requestInProgress()) {
2024             overlay(app_strings.LBL_EMAIL_ONE_MOMENT, app_strings.LBL_EMAIL_CHECKING_NEW, 'progress');
2025             SE.accounts.ieIds = SE.folders.getIeIds();
2026             if (SE.accounts.ieIds.length > 0) {
2027                 AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + 
2028                                 '&emailUIAction=checkEmailProgress&ieId=' + SE.accounts.ieIds[0] + "&currentCount=0");
2029             } else {
2030                hideOverlay();
2031             }
2032         } else {
2033             // wait 5 secs before trying again.
2034             SE.folders.checkingMail = setTimeout("SE.folders.startEmailAccountCheck();", 5000);
2035         }
2036     },
2037     
2038     /**
2039      * Checks a single Account check based on passed ieId
2040      */
2041      startEmailCheckOneAccount : function(ieId, synch) {
2042             if (synch) {
2043                 synch = true;
2044             } else {
2045                 synch = false;
2046             }
2047             var mbox = "";
2048             var node = SE.clickedFolderNode;
2049             if (node && !synch) {
2050                 mbox = node.data.mbox;
2051             } // if
2052             overlay(app_strings.LBL_EMAIL_CHECKING_NEW, app_strings.LBL_EMAIL_CHECKING_DESC, 'progress');
2053             SE.accounts.ieIds = [ieId];
2054             AjaxObject.startRequest(AjaxObject.accounts.callbackCheckMailProgress, urlStandard + 
2055                                 '&emailUIAction=checkEmailProgress&mbox=' + mbox + '&ieId=' + ieId + "&currentCount=0&synch=" + synch);
2056       },
2057
2058
2059     /**
2060      * Empties trash for subscribed accounts
2061      */
2062     emptyTrash : function() {
2063         SE.contextMenus.frameFoldersContextMenu.hide();
2064         overlay(app_strings.LBL_EMAIL_EMPTYING_TRASH, app_strings.LBL_EMAIL_ONE_MOMENT);
2065         AjaxObject.startRequest(callbackEmptyTrash, urlStandard + '&emailUIAction=emptyTrash');
2066     },
2067     
2068     /**
2069      * Clears Cache files of the inboundemail account
2070      */
2071     clearCacheFiles : function(ieId) {
2072         SE.contextMenus.frameFoldersContextMenu.hide();
2073         overlay(app_strings.LBL_EMAIL_CLEARING_CACHE_FILES, app_strings.LBL_EMAIL_ONE_MOMENT);
2074         AjaxObject.startRequest(callbackClearCacheFiles, urlStandard + '&ieId=' + ieId + '&emailUIAction=clearInboundAccountCache');
2075     },
2076     
2077     
2078     /**
2079      * Returns an array of all the active accounts in the folder view
2080      */
2081     getIeIds : function() {
2082          var ieIds = [];
2083          var root = SE.tree.getRoot();
2084          for(i=0; i < root.children.length; i++) {
2085            if ((root.children[i].data.cls == "ieFolder" && root.children[i].children.length > 0) ||
2086                         (root.children[i].data.isGroup != null && root.children[i].data.isGroup == "true" && root.children[i].children.length > 0)) {
2087                ieIds.push(root.children[i].children[0].data.ieId);
2088            }
2089          }
2090          return ieIds;
2091      },
2092
2093     /**
2094      * loads folder lists in Settings->Folders
2095      */
2096     lazyLoadSettings : function() {
2097         AjaxObject.timeout = 300000; // 5 min timeout for long checks
2098         AjaxObject.startRequest(callbackSettingsFolderRefresh, urlStandard + '&emailUIAction=getFoldersForSettings');
2099     },
2100
2101     /**
2102      * After the add new folder is done via folders tab on seetings, this function should get called
2103      * It will refresh the folder list after inserting an entry on the UI to update the new folder list
2104      */
2105     loadSettingFolder : function() {
2106         AjaxObject.timeout = 300000; // 5 min timeout for long checks
2107         AjaxObject.startRequest(callbackLoadSettingFolder, urlStandard + '&emailUIAction=getFoldersForSettings');
2108     },
2109     
2110     /**
2111      * Recursively removes nodes from the TreeView of type Sugar (data.ieId = 'folder')
2112      */
2113     removeSugarFolders : function() {
2114         var tree = SE.tree;
2115         var root = tree.getRoot();
2116         var folder = SE.util.findChildNode(root, "ieId", "folder");
2117         while(folder) {
2118             tree.removeNode(folder);
2119             folder = SE.util.findChildNode(root, "ieId", "folder");
2120         }
2121         if (!root.childrenRendered) {
2122                 root.childrenRendered = true;
2123         }
2124     },
2125     
2126     rebuildFolders : function(silent) {
2127       if (!silent) overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT);
2128        AjaxObject.startRequest(callbackFolders, urlStandard + '&emailUIAction=getAllFoldersTree');
2129     },
2130
2131     
2132     
2133     /**
2134      * Updates TreeView with Sugar Folders
2135      */
2136     setSugarFolders : function(delay) {
2137         this.removeSugarFolders();
2138                 //AjaxObject.forceAbort = true;
2139                 AjaxObject.startRequest(callbackRefreshSugarFolders, urlStandard + "&emailUIAction=refreshSugarFolders");
2140     },
2141
2142     /**
2143      * Takes async data object and creates the sugar folders in TreeView
2144      */
2145     setSugarFoldersEnd : function(o) {
2146         var root = SE.tree.getRoot();
2147         addChildNodes(root, {nodes: o});
2148         SE.accounts.renderTree();
2149         //If nothing is loaded in the grid, load "My Inbox"
2150         if (SE.grid.params.ieId == "undefined") {
2151                 SE.listView.populateListFrameSugarFolder({data: o[0]}, o[0].id, false);
2152         }
2153     },
2154
2155     startCheckTimer : function() {
2156         if(SE.userPrefs.emailSettings.emailCheckInterval && SE.userPrefs.emailSettings.emailCheckInterval != -1) {
2157             var ms = SE.userPrefs.emailSettings.emailCheckInterval * 60 * 1000;
2158
2159             if(typeof(SE.folders.checkTimer) != 'undefined') {
2160                 clearTimeout(SE.folders.checkTimer);
2161             }
2162
2163             SE.folders.checkTimer = setTimeout("SE.folders.checkEmailAccountsSilent(false);", ms);
2164             if (!SE.userPrefs.emailSettings.firstAutoCheck)
2165             {
2166                 SE.userPrefs.emailSettings.firstAutoCheck = true;
2167                 SE.folders.checkEmailAccountsSilent(false);
2168             }
2169         }
2170     },
2171
2172     /**
2173      * makes an async call to save user preference and refresh folder view
2174      * @param object SELECT list object
2175      */
2176     setFolderSelection : function() {
2177         overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT);
2178
2179         var a_rs = SE.accounts.inboundAccountsSettingsTable.getRecordSet().getRecords();
2180         var a_active_accnts = "";
2181         for(i=0;i<a_rs.length;i++)
2182         {
2183                 var t_record = a_rs[i];
2184                 var is_active = t_record.getData('is_active');
2185                 if(is_active)
2186                         a_active_accnts += ("&ieIdShow[]=" + t_record.getData('id'));
2187         }
2188         
2189         if(a_active_accnts == "")
2190                 a_active_accnts = "&ieIdShow[]=";
2191
2192         var query = "&emailUIAction=setFolderViewSelection" + a_active_accnts;
2193
2194         AjaxObject.startRequest(callbackFolders, urlStandard + query);
2195     },
2196
2197     /**
2198      * makes async call to save user preference for a given node's open state
2199      * @param object node YUI TextNode object
2200      */
2201     setOpenState : function(node) {
2202         SE.util.clearHiddenFieldValues('emailUIForm');
2203         var nodePath = node.data.id;
2204         var nodeParent = node.parent;
2205
2206         while(nodeParent != null) {
2207             // root node has no ID param
2208             if(nodeParent.data != null) {
2209                 nodePath = nodeParent.data.id + "::" + nodePath;
2210             }
2211
2212             var nodeParent = nodeParent.parent;
2213         }
2214
2215         document.getElementById('emailUIAction').value = 'setFolderOpenState';
2216         document.getElementById('focusFolder').value = nodePath;
2217
2218         if(node.expanded == true) {
2219             document.getElementById('focusFolderOpen').value = 'open';
2220         } else {
2221             document.getElementById('focusFolderOpen').value = 'closed';
2222         }
2223
2224         var formObject = document.getElementById('emailUIForm');
2225         YAHOO.util.Connect.setForm(formObject);
2226
2227         AjaxObject.startRequest(null, null);
2228     },
2229
2230     getNodeFromMboxPath : function(path) {
2231         var tree = YAHOO.widget.TreeView.getTree('frameFolders');
2232         var a = JSON.parse(path);
2233
2234         var node = tree.getRoot();
2235
2236         var i = 0;
2237         while(i < a.length) {
2238             node = this.getChildNodeFromLabel(node, a[i]);
2239             i++;
2240         }
2241
2242         return node;
2243     },
2244
2245     getChildNodeFromLabel : function(node, nodeLabel) {
2246         for(i=0; i<node.children.length; i++) {
2247             if(node.children[i].data.id == nodeLabel) {
2248                 return node.children[i];
2249             }
2250         }
2251     },
2252
2253     /**
2254      * returns the node that presumably under the user's right-click
2255      */
2256     getNodeFromContextMenuFocus : function() {
2257         //// get the target(parent) node
2258         var tree = YAHOO.widget.TreeView.trees.frameFolders;
2259         var index = -1;
2260         var target = SE.contextMenus.frameFoldersContextMenu.contextEventTarget;
2261
2262         // filter local folders
2263         if(target.className == 'localFolder' || target.className == 'groupInbox') {
2264             while(target && (target.className == 'localFolder' || target.className == 'groupInbox')) {
2265                 if(target.id == '') {
2266                     target = target.parentNode;
2267                 } else {
2268                     break;
2269                 }
2270             }
2271         }
2272
2273         var targetNode = document.getElementById(target.id);
2274         re = new RegExp(/ygtv[a-z]*(\d+)/i);
2275
2276         try {
2277             var matches = re.exec(targetNode.id);
2278         } catch(ex) {
2279             return document.getElementById(ygtvlabelel1);
2280         }
2281
2282         if(matches) {
2283             index = matches[1];
2284         } else {
2285             // usually parent node
2286             matches = re.exec(targetNode.parentNode.id);
2287
2288             if(matches) {
2289                 index = matches[1];
2290             }
2291         }
2292
2293         var parentNode = (index == -1) ? tree.getNodeByProperty('id', 'Home') : tree.getNodeByIndex(index);
2294         parentNode.expand();
2295
2296         return parentNode;
2297     },
2298
2299     /**
2300      * Decrements the Unread Email count in folder text
2301      * @param string ieId ID to look for
2302      * @param string mailbox name
2303      * @param count how many to decrement
2304      */
2305     decrementUnreadCount : function(ieId, mbox, count) {
2306         
2307         if(mbox == null)
2308             return;
2309             
2310         if(mbox.indexOf("sugar::") === 0) {
2311             var node = this.getNodeFromId(ieId);
2312         } else {
2313             var node = this.getNodeFromIeIdAndMailbox(ieId, mbox);
2314         }
2315         if(node) {
2316             var unseen = node.data.unseen;
2317             if(unseen > 0) {
2318                 var check = unseen - count;
2319                 var finalCount = (check >= 0) ? check : 0;
2320                 node.data.unseen = finalCount;
2321             }
2322             SE.accounts.renderTree();
2323         }
2324     },
2325
2326     /**
2327      * gets the TreeView node with a given ID/ieId
2328      * @param string id ID to look for
2329      * @return object Node
2330      */
2331     getNodeFromId : function(id) {
2332         SE.folders.focusNode = null;
2333         SE.util.cascadeNodes(SE.tree.getRoot(), function(ieId) {
2334             if ((this.data.id && this.data.id == ieId) || (this.data.ieId && this.data.ieId == ieId)) {
2335                 SE.folders.focusNode = this;
2336                 return false;
2337             }
2338         }, null, [id]);
2339         return SE.folders.focusNode;
2340     },
2341
2342     /**
2343      * Uses ieId and mailbox to try to find a node in the tree
2344      */
2345     getNodeFromIeIdAndMailbox : function(id, mbox) {
2346                 SE.folders.focusNode = null;
2347         if (mbox == "sugar::Emails") {        
2348                 mbox = id;
2349                 id = "folder";
2350         } // if
2351         SE.util.cascadeNodes(SE.tree.getRoot(), function(varsarray) {
2352                 if (varsarray instanceof Array) {
2353             if (this.data.ieId && this.data.ieId == varsarray[0] 
2354                     && this.data.mbox == varsarray[1]) {
2355                 SE.folders.focusNode = this;
2356                 return false;
2357             } }
2358                 else {
2359                         if (this.data.ieId && this.data.ieId == varsarray) {
2360                                 SE.folders.focusNode = this;
2361                     return false;
2362                         }
2363                 }
2364         }, null, [id, mbox]);
2365         return SE.folders.focusNode;
2366     },
2367     
2368     unhighliteAll : function() {
2369         SE.util.cascadeNodes(SE.tree.getRoot(), function(){this.unhighlight()});
2370     },
2371
2372     /**
2373      * Displays a short form
2374      */
2375     folderAdd : function() {
2376         SE.contextMenus.frameFoldersContextMenu.hide();
2377
2378         var node = SE.clickedFolderNode;
2379
2380         if(node != null && node.data) {
2381             overlay(app_strings.LBL_EMAIL_FOLDERS_ADD_DIALOG_TITLE, 
2382                     app_strings.LBL_EMAIL_SETTINGS_NAME, 
2383                     'prompt', {fn:SE.folders.folderAddXmlCall, beforeShow: SE.folders.folderAddRegisterEnter, beforeHide: SE.folders.folderRemoveRegisterEnter});
2384         } else {
2385             alert(app_strings.LBL_EMAIL_FOLDERS_NO_VALID_NODE);
2386         }
2387     },
2388
2389     folderAddRegisterEnter : function() {
2390         this.enterKeyListener = new YAHOO.util.KeyListener(YAHOO.util.Dom.get("sugar-message-prompt"), 
2391                                                                                                                         {keys: YAHOO.util.KeyListener.KEY.ENTER},
2392                                                                                                                         this.buttons[1].handler);
2393         
2394                 this.enterKeyListener.enable();                                                                                                                         
2395     },
2396     
2397     folderRemoveRegisterEnter : function() {
2398         this.enterKeyListener.disable();
2399     },
2400     
2401     folderAddXmlCall : function(name) {
2402         if (trim(name) == "") {
2403                 alert(mod_strings.LBL_ENTER_FOLDER_NAME);
2404                 return false;
2405         }
2406         name = escape(name);
2407         var post = '';
2408         var type = 'sugar';
2409
2410         var parentNode = SE.clickedFolderNode;
2411         
2412         this.contextMenuFocus = parentNode;
2413
2414         if(parentNode.data.ieId) {
2415             if(parentNode.data.ieId != 'folder' && parentNode.data.ieId.match(SE.reGUID)) {
2416                 type = 'imap';
2417             }
2418         }
2419         if(type == 'imap') {
2420                 // make an IMAP folder
2421             post = "&newFolderName=" + name + "&mbox=" + parentNode.data.mbox + "&ieId=" + parentNode.data.ieId;
2422             AjaxObject.startRequest(callbackFolderRename, urlStandard + '&emailUIAction=saveNewFolder&folderType=imap' + post);
2423         } else if(type == 'sugar') {
2424             // make a Sugar folder
2425             if(SE.folders.isUniqueFolderName(name)) {
2426                 post = "&parentId=" + parentNode.data.id + "&nodeLabel=" + name;
2427                 AjaxObject.startRequest(callbackFolderSave, urlStandard + '&emailUIAction=saveNewFolder&folderType=sugar&' + post);
2428             } else {
2429                 alert(app_strings.LBL_EMAIL_ERROR_DUPE_FOLDER_NAME);
2430                 SE.folders.folderAdd();
2431                 return;
2432             }
2433         } else {
2434             alert(app_strings.LBL_EMAIL_ERROR_CANNOT_FIND_NODE);
2435         }
2436
2437         // hide add-folder diaglogue
2438         SE.e2overlay.hide();
2439     },
2440
2441     /**
2442      * Removes either an IMAP folder or a Sugar Folder
2443      */
2444     folderDelete : function() {
2445         SE.contextMenus.frameFoldersContextMenu.hide();
2446         
2447         if(confirm(app_strings.LBL_EMAIL_FOLDERS_DELETE_CONFIRM)) {
2448             var post = '';
2449             var parentNode = SE.clickedFolderNode;
2450
2451             if(parentNode != null && parentNode.data) {
2452                 if(parentNode.data.mbox == 'INBOX' || parentNode.data.id == 'Home') {
2453                     overlay(app_strings.LBL_EMAIL_ERROR_GENERAL_TITLE, app_strings.LBL_EMAIL_FOLDERS_CHANGE_HOME, 'alert');
2454                     return;
2455                 }
2456
2457                 AjaxObject.target = 'frameFlex';
2458
2459                 if(parentNode.data.ieId != 'folder') {
2460                     // delete an IMAP folder
2461                     post = "&folderType=imap&mbox=" + parentNode.data.mbox + "&ieId=" + parentNode.data.ieId;
2462                 } else {
2463                     // delete a sugar folder
2464                     post = "&folderType=sugar&folder_id=" + parentNode.data.id;
2465                 }
2466                 overlay("Deleting folder", app_strings.LBL_EMAIL_ONE_MOMENT);
2467                 AjaxObject.startRequest(callbackFolderDelete, urlStandard + '&emailUIAction=deleteFolder' + post);
2468             } else {
2469                 alert(app_strings.LBL_EMAIL_ERROR_CANNOT_FIND_NODE);
2470             }
2471         }
2472     },
2473
2474     /**
2475      * Rename folder form
2476      */
2477      //EXT111
2478     folderRename : function() {
2479         SE.contextMenus.frameFoldersContextMenu.hide();
2480         var node = SE.clickedFolderNode;
2481
2482         if(node != null) {
2483             if(node.id == 'Home' || !node.data || node.data.mbox == 'INBOX') {
2484                 overlay(app_strings.LBL_EMAIL_ERROR_GENERAL_TITLE, app_strings.LBL_EMAIL_FOLDERS_CHANGE_HOME, 'alert');
2485                 return;
2486             }
2487             
2488                         overlay(app_strings.LBL_EMAIL_FOLDERS_RENAME_DIALOG_TITLE + " - " + node.data.text, 
2489                     app_strings.LBL_EMAIL_SETTINGS_NAME, 
2490                     'prompt',
2491                     {fn:SE.folders.submitFolderRename, beforeShow: SE.folders.folderAddRegisterEnter, beforeHide: SE.folders.folderRemoveRegisterEnter});        
2492         } else {
2493             alert(app_strings.LBL_EMAIL_FOLDERS_NO_VALID_NODE);
2494         }
2495     },
2496
2497     /**
2498      * fills an Object with key-value pairs of available folders
2499      */
2500     getAvailableFoldersObject : function() {
2501         var ret = new Object();
2502         var tree = SE.tree.root;
2503
2504         if(tree.children) {
2505             for(var i=0; i<tree.children.length; i++) {
2506                 ret = this.getFolderFromChild(ret, tree.children[i], '', app_strings.LBL_EMAIL_SPACER_MAIL_SERVER);
2507             }
2508         } else {
2509             ret['none'] = app_strings.LBL_NONE;
2510         }
2511
2512         return ret;
2513     },
2514
2515     /**
2516      * Fills in key-value pairs for dependent dropdowns
2517      * @param object ret Associative array
2518      * @param object node TreeView node in focus
2519      * @param string currentPath Built up path thus far
2520      * @param string spacer Defined in app_strings, visual separator b/t Sugar and Remote folders
2521      */
2522     getFolderFromChild : function(ret, node, currentPath, spacer) {
2523         if(node.data != null && node.depth > 0) {
2524             /* handle visual separtors differentiating b/t mailserver and local */
2525             if(node.data.ieId && node.data.ieId == 'folder') {
2526                 spacer = app_strings.LBL_EMAIL_SPACER_LOCAL_FOLDER;
2527             }
2528
2529             if(!ret.spacer0) {
2530                 ret['spacer0'] = spacer;
2531             } else if(ret.spacer0 != spacer) {
2532                 ret['spacer1'] = spacer
2533             }
2534
2535             var theLabel = node.data.label.replace(/<[^>]+[\w\/]+[^=>]*>/gi, '');
2536             var depthMarker = currentPath;
2537             var retIndex = SE.folders._createFolderId(node);
2538             ret[retIndex] = depthMarker + theLabel;
2539         }
2540
2541         if(node.children != null) {
2542             if(theLabel) {
2543                 currentPath += theLabel + "/";
2544             }
2545
2546             for(var i=0; i<node.children.length; i++) {
2547                 ret = this.getFolderFromChild(ret, node.children[i], currentPath, spacer);
2548             }
2549         }
2550
2551         return ret;
2552     },
2553
2554     /**
2555      * Wrapper to refresh folders tree
2556      */
2557     getFolders : function() {
2558         SE.accounts.rebuildFolderList();
2559     },
2560
2561     /**
2562      * handles events around folder-rename input field changes
2563      * @param object YUI event object
2564      */
2565     handleEnter : function(e) {
2566         switch(e.browserEvent.type) {
2567             case 'click':
2568                 e.preventDefault(); // click in text field
2569             break;
2570
2571             case 'blur':
2572                 SE.folders.submitFolderRename(e);
2573             break;
2574
2575             case 'keypress':
2576                 var kc = e.browserEvent.keyCode;
2577                 switch(kc) {
2578                     case 13: // enter
2579                         e.preventDefault();
2580                         SE.folders.submitFolderRename(e);
2581                     break;
2582
2583                     case 27: // esc
2584                         e.preventDefault(e);
2585                         SE.folders.cancelFolderRename(e);
2586                     break;
2587                 }
2588             break;
2589         }
2590     },
2591     /**
2592     * Called when a node is clicked on in the folder tree
2593     * @param node, The node clicked on
2594     * @param e, The click event
2595     */
2596     handleClick : function(o) {
2597         var node = o.node;
2598         //If the click was on a sugar folder
2599         if (node.data.ieId == "folder") {
2600             SE.listView.populateListFrameSugarFolder(node, node.id, false);
2601         }
2602         else {
2603             SE.listView.populateListFrame(node, node.data.ieId, false);
2604         }
2605        //eval(node.data.click);
2606        //debugger;
2607     },
2608     
2609     /**
2610     * Called when a node is right-clicked on in the folder tree
2611     */
2612     handleRightClick : function(e) {
2613         YAHOO.util.Event.preventDefault(e);
2614                 //Get the Tree Node
2615                 var node = SUGAR.email2.tree.getNodeByElement(YAHOO.util.Event.getTarget(e));
2616                 var menu = SUGAR.email2.contextMenus.frameFoldersContextMenu;
2617                 
2618                 //If the click was on a sugar folder
2619         SE.clickedFolderNode = node;
2620         var inbound = (node.data.ieId && node.data.ieId != 'folder');
2621                 var disableNew = (inbound && (typeof(node.data.mbox) == 'undefined'));
2622                 menu.getItem(0).cfg.setProperty("disabled", !inbound);
2623                 menu.getItem(1).cfg.setProperty("disabled", !inbound);
2624                 menu.getItem(2).cfg.setProperty("disabled", disableNew);
2625                 menu.getItem(3).cfg.setProperty("disabled", false);
2626                 menu.getItem(4).cfg.setProperty("disabled", false);
2627                 menu.getItem(5).cfg.setProperty("disabled", false);
2628                 menu.getItem(6).cfg.setProperty("disabled", true);
2629                 //Group folder
2630                 if (inbound && node.data.isGroup != null && node.data.isGroup == "true") {
2631                         menu.getItem(0).cfg.setProperty("disabled", true);
2632                         menu.getItem(1).cfg.setProperty("disabled", true);
2633                         menu.getItem(2).cfg.setProperty("disabled", true);
2634                         menu.getItem(3).cfg.setProperty("disabled", true);
2635                         menu.getItem(4).cfg.setProperty("disabled", true);
2636                 }
2637         if (node.data.protocol != null) {
2638                 menu.getItem(6).cfg.setProperty("disabled", false);
2639         }
2640                 if (node.data.folder_type != null && (node.data.folder_type == "inbound" ||
2641                                 node.data.folder_type == "sent" || node.data.folder_type == "draft")) {
2642                         //Sent or Draft folders
2643                         menu.getItem(3).cfg.setProperty("disabled", true);
2644                         menu.getItem(4).cfg.setProperty("disabled", true);
2645                         menu.getItem(5).cfg.setProperty("disabled", true);
2646                 }
2647                 
2648                 //For group with auto inbound, disable everything.
2649                 if( (typeof(node.data.is_group) != 'undefined') && node.data.is_group == 'true')
2650                 {
2651                     menu.getItem(0).cfg.setProperty("disabled", true);
2652                 menu.getItem(1).cfg.setProperty("disabled", true);
2653                 menu.getItem(2).cfg.setProperty("disabled", true);
2654                 menu.getItem(3).cfg.setProperty("disabled", true);
2655                 menu.getItem(4).cfg.setProperty("disabled", true);
2656                 menu.getItem(5).cfg.setProperty("disabled", true);
2657                 menu.getItem(6).cfg.setProperty("disabled", true);
2658                 }
2659                 
2660                 menu.cfg.setProperty("xy", YAHOO.util.Event.getXY(e));
2661                 menu.show();
2662     },
2663     
2664     /**
2665     * Called when a row is dropped on a node
2666     */
2667     handleDrop : function(rows, targetFolder) {
2668         var rowData = rows[0].getData();
2669         if (rowData.mbox != targetFolder.data.mbox) {
2670             var srcIeId = rowData.ieId;
2671             var srcFolder = rowData.mbox;
2672             var destIeId = targetFolder.data.ieId;
2673             var destFolder = targetFolder.data.mbox;
2674             var uids = [];
2675             for(var i=0; i<rows.length; i++) {
2676                 uids[i] = rows[i].getData().uid;
2677             }
2678             SE.listView.moveEmails(srcIeId, srcFolder, destIeId, destFolder, uids, rows);
2679         }
2680     },
2681     
2682     /**
2683     * Called when something is dragged over a Folder Node
2684     */
2685     dragOver : function(dragObject) {
2686        return true;
2687     },
2688     
2689     /**
2690      * Determines if a folder name is unique to the folder tree
2691      * @param string name
2692      */
2693     isUniqueFolderName : function(name) {
2694         uniqueFolder = true;
2695         var root = SE.tree.getRoot();
2696         SE.util.cascadeNodes(SE.tree.getRoot(), function(name) {
2697             if (this.attributes && this.attributes.ieId == "folder") {
2698                 if (this.attributes.text == name) {
2699                     uniqueFolder = false;
2700                     return false;
2701                 }
2702             }
2703         }, null, [name]);
2704         return uniqueFolder;
2705     },
2706
2707     /**
2708      * Makes async call to rename folder in focus
2709      * @param object e Event Object
2710      */
2711     submitFolderRename : function(newName) {
2712         if (trim(newName) == "") {
2713                 alert(mod_strings.LBL_ENTER_FOLDER_NAME);
2714                 return false;
2715         }
2716                 newName = escape(newName);        
2717         var node = SE.clickedFolderNode;
2718         var origName = node.data.text
2719         //Ignore no change
2720         if (newName == origName) {
2721             return true;
2722         }
2723         if(SE.folders.isUniqueFolderName(newName)) {
2724             overlay(app_strings.LBL_EMAIL_MENU_RENAMING_FOLDER, app_strings.LBL_EMAIL_ONE_MOMENT);
2725             if (node.data.ieId == "folder") {
2726                 //Sugar Folder
2727                 AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=renameFolder&folderId=" + node.data.id + "&newFolderName=" + newName);
2728             }
2729             else {
2730                 //IMAP folder or POP mailbox
2731                 var nodePath = node.data.mbox.substring(0, node.data.mbox.lastIndexOf(".") + 1);
2732                 AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=renameFolder&ieId=" 
2733                     + node.data.ieId + "&oldFolderName=" + node.data.mbox + "&newFolderName=" + nodePath + newName);
2734             }
2735             return true;
2736         } else {
2737             alert(app_strings.LBL_EMAIL_ERROR_DUPE_FOLDER_NAME);
2738             return false;
2739         }
2740     },
2741     
2742     moveFolder : function(folderId, parentFolderId) {
2743         if (folderId != parentFolderId)
2744         {
2745                 AjaxObject.startRequest(callbackFolderRename, urlStandard + "&emailUIAction=moveFolder&folderId=" 
2746                     + folderId + "&newParentId=" + parentFolderId);
2747         }
2748     },
2749
2750     /**
2751      * makes async call to do a full synchronization of all accounts
2752      */
2753     synchronizeAccounts : function() {
2754         if(confirm(app_strings.LBL_EMAIL_SETTINGS_FULL_SYNC_WARN)) {
2755             overlayModal(app_strings.LBL_EMAIL_SETTINGS_FULL_SYNC, app_strings.LBL_EMAIL_ONE_MOMENT + "<br>&nbsp;<br>" + app_strings.LBL_EMAIL_COFFEE_BREAK);
2756             AjaxObject.startRequest(callbackFullSync, urlStandard + '&emailUIAction=synchronizeEmail');
2757         }
2758     },
2759
2760     /**
2761      * Updates user's folder subscriptsion (Sugar only)
2762      * @param object SELECT DOM object in focus
2763      * @param string type of Folder selection
2764      */
2765     updateSubscriptions : function() {
2766         overlay(app_strings.LBL_EMAIL_REBUILDING_FOLDERS, app_strings.LBL_EMAIL_ONE_MOMENT);    
2767     
2768         var active = "";
2769
2770         select = document.getElementById('userFolders');
2771
2772         for(i=0; i<select.options.length; i++) {
2773             var opt = select.options[i];
2774              if(opt.selected && opt.value != "") {
2775                  if(active != "") {
2776                      active += "::";
2777                  }
2778                  active += opt.value;
2779              }
2780         }
2781         
2782         //Add the group folder ids.
2783         var group_folders = SUGAR.email2.folders.retrieveGroupFolderSubscriptions();
2784         for(i=0; i<group_folders.length; i++) 
2785         {
2786             active += ("::" + group_folders[i]);
2787         }
2788         
2789         AjaxObject.startRequest(callbackFolderSubscriptions, urlStandard + '&emailUIAction=updateSubscriptions&subscriptions=' + active);
2790     },
2791     /**
2792      * Updates user's group folder subscriptsion (Sugar only)
2793      * @param ieID The group folder to add to the tree view
2794      */
2795     retrieveGroupFolderSubscriptions : function() {
2796         
2797         var a_rs = SE.accounts.inboundAccountsSettingsTable.getRecordSet().getRecords();
2798         var activeGroupFolders = "";
2799         var activeGroupIds = [];
2800         for(i=0;i<a_rs.length;i++)
2801         {
2802                 var t_record = a_rs[i];
2803                 var is_active = t_record.getData('is_active');
2804                 var isGroupFolder = t_record.getData('has_groupfolder');
2805                 var ieID = t_record.getData('id');
2806                 if( isGroupFolder )
2807                 {
2808                     if(is_active)
2809                       activeGroupIds.push(ieID);
2810                 }
2811         }         
2812        
2813         return activeGroupIds;
2814     }
2815
2816 };
2817
2818 SE.folders.checkEmail2 = function() {
2819     AjaxObject.startRequest(callbackCheckEmail2, urlStandard + "&emailUIAction=checkEmail2");
2820 }
2821 ////    END FOLDERS OBJECT
2822 ///////////////////////////////////////////////////////////////////////////////
2823
2824
2825 ///////////////////////////////////////////////////////////////////////////////
2826 ////    SE.keys
2827 /**
2828  * Keypress Event capture and processing
2829  */
2830 SE.keys = {
2831     overall : function(e) {
2832         switch(e.charCode) {
2833             case 119: // "w"
2834                 if(e.ctrlKey || e.altKey) {
2835                     var focusRegion = SE.innerLayout.regions.center;
2836                     if(focusRegion.activePanel.closable == true) {
2837                         focusRegion.remove(focusRegion.activePanel);
2838                     }
2839                 }
2840             break;
2841         }
2842     }
2843 };
2844 ////    END SE.keys
2845 ///////////////////////////////////////////////////////////////////////////////
2846
2847
2848 ///////////////////////////////////////////////////////////////////////////////
2849 ////    SE.listView
2850 /**
2851  * ListView object methods and attributes
2852  */
2853 SE.listView = {
2854     currentRowId : -1,
2855
2856     /**
2857      * Fills the ListView pane with detected messages.
2858      */
2859     populateListFrame : function(node, ieId, forceRefresh) {
2860         SE.innerLayout.selectTab(0);
2861                 YAHOO.util.Connect.abort(AjaxObject.currentRequestObject, null, false);
2862
2863         Dom.get('_blank').innerHTML = "";
2864         SE.grid.params['emailUIAction'] = 'getMessageList';
2865         SE.grid.params['mbox'] = node.data.mbox;
2866         SE.grid.params['ieId'] = ieId;
2867         forcePreview = true; // loads the preview pane with first item in grid
2868         SE.listView.refreshGrid();
2869     },
2870
2871     /**
2872      * Like populateListFrame(), but specifically for SugarFolders since the API is radically different
2873      */
2874     populateListFrameSugarFolder : function(node, folderId, forceRefresh) {
2875         SE.innerLayout.selectTab(0);
2876         Dom.get('_blank').innerHTML = "";
2877         SE.grid.params['emailUIAction'] = 'getMessageListSugarFolders';
2878         SE.grid.params['ieId'] = node.data.id;
2879         SE.grid.params['mbox'] = node.data.origText ? node.data.origText : node.data.text;
2880         SE.listView.refreshGrid();
2881     },
2882
2883     /**Mac
2884      * Sets sort order as user preference
2885      * @param
2886      */
2887     saveListViewSortOrder : function(sortBy, focusFolderPassed, ieIdPassed, ieNamePassed) {
2888         ieId = ieIdPassed;
2889         ieName = ieNamePassed;
2890         focusFolder = focusFolderPassed;
2891
2892         SE.util.clearHiddenFieldValues('emailUIForm');
2893         var previousSort = document.getElementById('sortBy').value;
2894
2895         document.getElementById('sortBy').value = sortBy;
2896         document.getElementById('emailUIAction').value = 'saveListViewSortOrder';
2897         document.getElementById('focusFolder').value = focusFolder;
2898         document.getElementById('ieId').value = ieId;
2899
2900         if(sortBy == previousSort) {
2901             document.getElementById('reverse').value = '1';
2902         }
2903
2904         var formObject = document.getElementById('emailUIForm');
2905         YAHOO.util.Connect.setForm(formObject);
2906
2907         AjaxObject.startRequest(callbackListViewSortOrderChange, null);
2908     },
2909
2910
2911     /**
2912      * Enables click/arrow select of grid items which then populate the preview pane.
2913      */
2914     selectFirstRow : function() {
2915         SE.grid.selModel.selectFirstRow();
2916     },
2917
2918     selectLastRow : function() {
2919         SE.grid.selModel.selectRow(SE.grid.dataSource.data.getCount() - 1);
2920     },
2921
2922     setEmailListStyles : function() {
2923         SE.listView.boldUnreadRows();
2924         return;
2925         var ds = SE.grid.getStore();
2926         if (SE.grid.getSelections().length == 0) {
2927             document.getElementById('_blank').innerHTML = '';
2928         }
2929
2930         var acctMbox = '';
2931         if(typeof(ds.baseParams.mbox) != 'undefined') {
2932             acctMbox = (ds.baseParams.acct) ? ds.baseParams.acct + " " + ds.baseParams.mbox : ds.baseParams.mbox;
2933             var cm = SE.grid.getColumnModel();
2934             if (ds.baseParams.mbox == mod_strings.LBL_LIST_FORM_SENT_TITLE) {
2935                 cm.setColumnHeader(4, mod_strings.LBL_LIST_DATE_SENT);
2936                 //SE.grid.render();
2937             } else if (cm.config[4].header != app_strings.LBL_EMAIL_DATE_SENT_BY_SENDER){
2938                 cm.setColumnHeader(4, app_strings.LBL_EMAIL_DATE_SENT_BY_SENDER);
2939                 //SE.grid.render();
2940             }
2941         }
2942         var total = (typeof(ds.totalLength) != "undefined") ? " (" + ds.totalLength +" " + app_strings.LBL_EMAIL_MESSAGES +") " : "";
2943         SE.listViewLayout.setTitle(acctMbox + total);// + toggleRead + manualFit);
2944
2945
2946         // 4/20/2007 added to hide overlay after search
2947         //hideOverlay();
2948         if (ds.reader.xmlData.getElementsByTagName('UnreadCount').length > 0){
2949             var unread = ds.reader.xmlData.getElementsByTagName('UnreadCount')[0].childNodes[0].data;
2950             var node = SE.folders.getNodeFromIeIdAndMailbox(ds.baseParams.ieId, ds.baseParams.mbox);
2951             if (node) node.data.unseen = unread;
2952         }
2953         SE.accounts.renderTree();
2954
2955         
2956         // bug 15035 perhaps a heavy handed solution to stopping the loading spinner.
2957         if(forcePreview && ds.totalCount > 0) {
2958             SE.detailView.getEmailPreview();
2959             forcePreview = false;
2960         }
2961     },
2962
2963     /**
2964      * Removes a row if found via its UID
2965      */
2966     removeRowByUid : function(uid) {
2967         uid = new String(uid);
2968         uids = uid.split(',');
2969         var dataTableRecords = SE.grid.getRecordSet().getRecords(0, SE.grid.getRecordSet().getLength());
2970         
2971         for(j=0; j<uids.length; j++) {
2972             var theUid = uids[j];
2973             for (k = 0 ; k < SE.grid.getRecordSet().getLength() ; k++) {
2974                 if (SE.grid.getRecordSet().getRecords()[k].getData().uid == theUid) {
2975                         SE.grid.deleteRow(SE.grid.getRecordSet().getRecords()[k]);
2976                 }
2977             } // for
2978         }
2979     },
2980
2981     displaySelectedEmails : function(rows) {
2982         var dm = SE.grid.getDataModel();
2983         var uids = '';
2984
2985         for(i=0; i<rows.length; i++) {
2986             var rowIndex = rows[i].rowIndex;
2987             var metadata = dm.data[rowIndex];
2988
2989             if(uids != "") {
2990                 uids += ",";
2991             }
2992             uids += metadata[5];
2993
2994             // unbold unseen email
2995             this.unboldRow(rowIndex);
2996         }
2997
2998         SE.detailView.populateDetailViewMultiple(uids, metadata[6], metadata[7], metadata[8], false);
2999     },
3000
3001     /**
3002      * exception handler for data load failures
3003      */
3004     loadException : function(dataModel, ex, response) {
3005         //debugger;
3006     },
3007
3008     /**
3009      * Moves email(s) from a folder to another, from IMAP/POP3 to Sugar and vice-versa
3010      * @param string sourceIeId Email's source I-E id
3011      * @param string sourceFolder Email's current folder
3012      * @param destinationIeId Destination I-E id
3013      * @param destinationFolder Destination folder in format [root::IE::INBOX::etc]
3014      *
3015      * @param array emailUids Array of email's UIDs
3016      */
3017     moveEmails : function(sourceIeId, sourceFolder, destinationIeId, destinationFolder, emailUids, selectedRows) {
3018         if(destinationIeId != 'folder' && sourceIeId != destinationIeId) {
3019             overlay(app_strings.LBL_EMAIL_ERROR_MOVE_TITLE, app_strings.LBL_EMAIL_ERROR_MOVE);
3020         } else {
3021             overlay("Moving Email(s)", app_strings.LBL_EMAIL_ONE_MOMENT);
3022             // remove rows from visibility
3023             for(row in selectedRows) {
3024                 //SE.grid.getStore().remove(row);
3025             }
3026
3027             var baseUrl =    '&sourceIeId=' + sourceIeId +
3028                             '&sourceFolder=' + sourceFolder +
3029                             '&destinationIeId=' + destinationIeId +
3030                             '&destinationFolder=' + destinationFolder;
3031             var uids = '';
3032
3033             for(i=0; i<emailUids.length; i++) {
3034                 if(uids != '') {
3035                     uids += app_strings.LBL_EMAIL_DELIMITER;
3036                 }
3037                 uids += emailUids[i];
3038             }
3039             if (destinationIeId == 'folder' && sourceFolder != 'sugar::Emails') {
3040                 AjaxObject.startRequest(callbackImportOneEmail, urlStandard + '&emailUIAction=moveEmails&emailUids=' + uids + baseUrl);
3041             } else {
3042                 AjaxObject.startRequest(callbackMoveEmails, urlStandard + '&emailUIAction=moveEmails&emailUids=' + uids + baseUrl);
3043             }
3044         }
3045     },
3046     
3047     /**
3048      * Unbolds text in the grid view to denote read status
3049      */
3050     markRead : function(index, record) {
3051         // unbold unseen email
3052         var row = SE.grid.getRecord(record);
3053         row.getData().seen = 1;
3054         SE.grid.getTrEl(record).style.fontWeight = "normal";
3055     },
3056
3057     /**
3058      * grid row output, bolding unread emails
3059      */
3060     boldUnreadRows : function() {
3061         // bold unread emails
3062         var trEl = SE.grid.getFirstTrEl();
3063         while(trEl != null) {
3064                 if(SE.grid.getRecord(trEl).getData().seen == "0")
3065                         trEl.style.fontWeight = "bold";
3066                 else
3067                         trEl.style.fontWeight = "";
3068                 trEl = SE.grid.getNextTrEl(trEl);
3069         }
3070     },
3071
3072     /**
3073      * Show preview for an email if 1 and only 1 is selected
3074      * ---- all references must be fully qual'd since this gets wrapped by the YUI event handler
3075      */
3076     handleRowSelect : function(e) {
3077         if(e.selectedRows.length == 1) {
3078             SE.detailView.getEmailPreview();
3079         }
3080     },
3081
3082     handleDrop : function(e, dd, targetId, e2) {
3083         switch(targetId) {
3084             case 'htmleditordiv':
3085                 var rows = SE.grid.getSelectedRows();
3086                 if(rows.length > 0) {
3087                     SE.listView.displaySelectedEmails(rows);
3088                 }
3089             break;
3090
3091             default:
3092                 var targetElId = new String(targetId);
3093                 var targetIndex = targetElId.replace('ygtvlabelel',"");
3094                 var targetNode = SE.tree.getNodeByIndex(targetIndex);
3095                 var dm = SE.grid.getDataModel();
3096                 var emailUids = new Array();
3097                 var destinationIeId = targetNode.data.ieId;
3098                 var destinationFolder = SE.util.generateMboxPath(targetNode.data.mbox);
3099
3100
3101                 var rows = SE.grid.getSelectedRows();
3102                 // iterate through dragged rows
3103                 for(i=0; i<rows.length; i++) {
3104                     //var rowIndex = e.selModel.selectedRows[i].rowIndex;
3105                     var rowIndex = rows[i].rowIndex;
3106                     var dataModelRow = dm.data[rowIndex];
3107                     var sourceIeId = dataModelRow[7];
3108                     var sourceFolder = dataModelRow[6];
3109                     emailUids[i] = dataModelRow[5];
3110                 }
3111
3112                 // event wrapped call - need FQ
3113                 overlay(app_strings.LBL_EMAIL_PERFORMING_TASK, app_strings.LBL_EMAIL_ONE_MOMENT);
3114                 SE.listView.moveEmails(sourceIeId, sourceFolder, destinationIeId, destinationFolder, emailUids, e.selModel.selectedRows);
3115             break;
3116         }
3117     },
3118
3119     /**
3120      * Hack-around to get double-click and single clicks to work on the grid
3121      * ---- all references must be fully qual'd since this gets wrapped by the YUI event handler
3122      */
3123     handleClick : function(o) {
3124         SUGAR.email2.grid.clearTextSelection();
3125         
3126         var el = SUGAR.email2.grid.getSelectedRows();
3127         
3128         //Load an email preview only if a single record is selected.  For multiple selections do nothing.
3129         if ( el.length == 1)
3130         {
3131            var rowId = el[0];
3132            SUGAR.email2.listView.currentRow = SUGAR.email2.grid.getRecord(rowId);
3133            SUGAR.email2.listView.currentRowIndex = rowId;
3134            clearTimeout(SUGAR.email2.detailView.previewTimer);
3135            SUGAR.email2.detailView.previewTimer = setTimeout("SUGAR.email2.detailView.getEmailPreview();", 500);
3136         }
3137     },
3138
3139     /**
3140      * Custom handler for double-click/enter
3141      * ---- all references must be fully qual'd since this gets wrapped by the YUI event handler
3142      */
3143     getEmail : function(e) {
3144         var rows = SE.grid.getSelectedRows();
3145         var row = SE.grid.getRecord(rows[0]).getData();
3146         
3147         clearTimeout(SE.detailView.previewTimer);
3148         document.getElementById("_blank").innerHTML = "";
3149
3150         if(row.type != "draft") {
3151             SE.detailView.populateDetailView(row.uid, row.mbox, row.ieId, 'true', SE.innerLayout);
3152         } else {
3153             // circumventing yui-ext tab generation, let callback handler build new view
3154             SE.util.clearHiddenFieldValues('emailUIForm');
3155             //function(uid, mbox, ieId, setRead, destination) {
3156             document.getElementById('emailUIAction').value = 'getSingleMessageFromSugar';
3157             document.getElementById('uid').value = row.uid; // uid;
3158             document.getElementById('mbox').value = row.mbox; // mbox;
3159             document.getElementById('ieId').value = row.ieId; // ieId;
3160
3161             YAHOO.util.Connect.setForm(document.getElementById('emailUIForm'));
3162             AjaxObject.target = '_blank';
3163             AjaxObject.startRequest(AjaxObject.detailView.callback.emailDetail, null);
3164         }
3165     },
3166
3167     /**
3168      * Retrieves a row if found via its UID
3169      * @param string
3170      * @return int
3171      */
3172     getRowIndexByUid : function(uid) {
3173         uid = new String(uid);
3174         uids = uid.split(',');
3175
3176         for(j=0; j<uids.length; j++) {
3177             var theUid = uids[j];
3178
3179             for(i=0; i<SE.grid.getStore().data.length; i++) {
3180                 if(SE.grid.getStore().data[i].id == theUid) {
3181                     return i;
3182                 }
3183             }
3184         }
3185     },
3186     
3187     /**
3188      * Returns the UID's of the seleted rows
3189      *
3190      */
3191      getUidsFromSelection : function() {
3192          var rows = SE.grid.getSelectedRows();
3193          var uids = [];
3194          /* iterate through available rows JIC a row is deleted - use first available */
3195          for(var i=0; i<rows.length; i++) {
3196                  uids[i] = SE.grid.getRecord(rows[i]).getData().uid;
3197          }
3198          return uids;
3199      },
3200     
3201     refreshGrid : function() {
3202         SE.grid.getDataSource().sendRequest(
3203             SUGAR.util.paramsToUrl(SE.grid.params), 
3204                 SE.grid.onDataReturnInitializeTable,
3205                 SE.grid
3206         );
3207     }
3208     
3209 };
3210 ////    END SE.listView
3211 ///////////////////////////////////////////////////////////////////////////////
3212
3213 ///////////////////////////////////////////////////////////////////////////////
3214 ////    SEARCH
3215 SE.search = {
3216     /**
3217      * sends search criteria
3218      * @param reference element search field
3219      */
3220     search : function(el) {
3221         var searchCriteria = new String(el.value);
3222
3223         if(searchCriteria == '') {
3224             alert(app_strings.LBL_EMAIL_ERROR_EMPTY);
3225             return false;
3226         }
3227
3228         var safeCriteria = escape(searchCriteria);
3229
3230         var accountListSearch = document.getElementById('accountListSearch');
3231         //overlay(app_strings.LBL_EMAIL_SEARCHING,app_strings.LBL_EMAIL_ONE_MOMENT);
3232
3233         SE.grid.getStore().baseParams['emailUIAction'] = 'search';
3234         SE.grid.getStore().baseParams['mbox'] = app_strings.LBL_EMAIL_SEARCH_RESULTS_TITLE;
3235         SE.grid.getStore().baseParams['subject'] = safeCriteria;
3236         SE.grid.getStore().baseParams['ieId'] = accountListSearch.options[accountListSearch.selectedIndex].value;
3237         SE.grid.getStore().load({params:{start:0, limit:SE.userPrefs.emailSettings.showNumInList}});
3238         
3239     },
3240
3241     /**
3242      * sends advanced search criteria
3243      */
3244     searchAdvanced : function() {
3245         var formObject = document.getElementById('advancedSearchForm');
3246         var search = false;
3247
3248         //Set assigned user id to blank if name is not present.
3249         if (formObject.elements['assigned_user_name'].value == "")
3250             formObject.elements['assigned_user_id'].value = "";
3251             
3252         for(i=0; i<formObject.elements.length; i++) {
3253             if(formObject.elements[i].type != 'button' && formObject.elements[i].value != "") {
3254                 search = true;
3255             }
3256             if(formObject.elements[i].type == 'text') {
3257                 SE.grid.params[formObject.elements[i].name] = formObject.elements[i].value;
3258             }
3259             if(formObject.elements[i].type == 'hidden') {
3260                 SE.grid.params[formObject.elements[i].name] = formObject.elements[i].value;
3261             }
3262              if(formObject.elements[i].type == 'select-one') {
3263                 var el = formObject.elements[i];
3264                 var v = el.options[el.selectedIndex].value;
3265
3266                 if(v != "")
3267                     SE.grid.params[el.name] = v;
3268                 else
3269                 {
3270                     //Clear previous search results if necessary
3271                     if(typeof( SE.grid.params[el.name]) != 'undefined')
3272                         delete SE.grid.params[el.name]
3273                 }
3274              }
3275         }
3276
3277         if (search) 
3278         {
3279             if(! this.validateSearchFormInput() )
3280                 return;
3281                                 
3282                 SE.grid.params['emailUIAction'] = 'searchAdvanced';
3283                 SE.grid.params['mbox'] = app_strings.LBL_EMAIL_SEARCH_RESULTS_TITLE;
3284                 var accountListSearch = document.getElementById('accountListSearch');
3285                 SE.listView.refreshGrid();
3286         } else {
3287             alert(app_strings.LBL_EMAIL_ERROR_EMPTY);
3288         }
3289     },
3290     
3291     /**
3292     *  Validates the search form inputs to ensure all parameters are valid
3293     *  @return bool
3294     */
3295     validateSearchFormInput: function()
3296     { 
3297         addToValidate('advancedSearchForm', 'dateTo', 'date', false, app_strings.LBL_EMAIL_SEARCH_DATE_UNTIL);  
3298         addToValidate('advancedSearchForm', 'dateFrom', 'date', false, app_strings.LBL_EMAIL_SEARCH_DATE_FROM); 
3299         var dateCheck = check_form('advancedSearchForm');
3300        
3301         //If the parent type is selected ensure the user selected a parent_id.
3302         if( SE.composeLayout.isParentTypeAndNameValid('_search') && dateCheck)
3303             return true;
3304         else
3305             return false;
3306     },
3307     /**
3308     *   Toggles the advanced options, either hidding or showing the selection.
3309     */
3310     toggleAdvancedOptions: function()
3311     {
3312         var el = YAHOO.util.Dom.getElementsByClassName('toggleClass','tr', 'advancedSearchTable');
3313
3314         for(var i=0;i<el.length;i++)
3315         {
3316             if(Dom.hasClass(el[i],"toggleClass yui-hidden" ))    
3317                 Dom.replaceClass(el[i],"toggleClass yui-hidden", "toggleClass visible-search-option" )
3318             else
3319                 Dom.replaceClass(el[i],"toggleClass visible-search-option","toggleClass yui-hidden" )
3320         }
3321     },
3322     /**
3323      * clears adv search form fields
3324      */
3325     searchClearAdvanced : function() {
3326         var form = document.getElementById('advancedSearchForm');
3327
3328         for(i=0; i<form.elements.length; i++) {
3329             if(form.elements[i].type != 'button') {
3330                 form.elements[i].value = '';
3331             }
3332         }
3333     }
3334 };
3335 ////    END SE.search
3336 //////////////////////////////////////////////////////////////////////////////
3337
3338
3339 //////////////////////////////////////////////////////////////////////////////
3340 ////    SE.settings
3341 SE.settings = {
3342     /******************************************************************************
3343      * USER SIGNATURES calls stolen from Users module
3344      *****************************************************************************/
3345     createSignature : function(record, the_user_id) {
3346         var URL = "index.php?module=Users&action=PopupSignature&sugar_body_only=true";
3347         if(record != "") {
3348             URL += "&record="+record;
3349         }
3350         if(the_user_id != "") {
3351             URL += "&the_user_id="+the_user_id;
3352         }
3353         var windowName = 'email_signature';
3354         var windowFeatures = 'width=800,height=600,resizable=1,scrollbars=1';
3355
3356         var win = window.open(URL, windowName, windowFeatures);
3357         if(win && win.focus) {
3358             // put the focus on the popup if the browser supports the focus() method
3359             win.focus();
3360         }
3361     },
3362
3363     deleteSignature : function() {
3364         if(confirm(app_strings.LBL_EMAIL_CONFIRM_DELETE_SIGNATURE)) {
3365             overlay(app_strings.LBL_EMAIL_IE_DELETE_SIGNATURE, app_strings.LBL_EMAIL_ONE_MOMENT);
3366                 var singature_id = document.getElementById('signature_id').value;
3367                 AjaxObject.startRequest(callbackDeleteSignature, urlStandard + '&emailUIAction=deleteSignature&id=' + singature_id);
3368         } // if
3369     },
3370     
3371     saveOptionsGeneral :  function(displayMessage) {
3372         var formObject = document.getElementById('formEmailSettingsGeneral');
3373         if (!SUGAR.collection.prototype.validateTemSet('formEmailSettingsGeneral', 'team_name')) {
3374                 alert(mod_strings.LBL_EMAILS_NO_PRIMARY_TEAM_SPECIFIED);
3375                 return false;
3376         } // if
3377         YAHOO.util.Connect.setForm(formObject);
3378         SE.composeLayout.emailTemplates = null;
3379
3380         AjaxObject.target = 'frameFlex';
3381         AjaxObject.startRequest(callbackSettings, urlStandard + '&emailUIAction=saveSettingsGeneral');
3382
3383         if(displayMessage)
3384             alert(app_strings.LBL_EMAIL_SETTINGS_SAVED);
3385             
3386         SE.settings.settingsDialog.hide();
3387     },
3388
3389     /**
3390      * Shows settings container screen
3391      */
3392     showSettings : function() {
3393         if(!SE.settings.settingsDialog) {
3394                 var dlg = SE.settings.settingsDialog = new YAHOO.widget.Dialog("settingsDialog", {
3395                 modal:true,
3396                 visible:false,
3397                 fixedcenter:true,
3398                 draggable: false,
3399                 width:"800px",
3400                                 constraintoviewport: true
3401             });
3402                         dlg.showEvent.subscribe( function (){ 
3403                                 var el = this.element;
3404                                 var viewH = YAHOO.util.Dom.getViewportHeight();
3405                 if (this.header && el && viewH - 50 < el.clientHeight) {
3406                     var body = this.header.nextElementSibling;
3407                                         body.style.overflow = "auto";
3408                     body.style.height = (viewH - 50) + "px";
3409                 }
3410             }, dlg);
3411                 dlg.setHeader(app_strings.LBL_EMAIL_SETTINGS);
3412                 dlg.setBody('<div id="settingsTabDiv"/>');
3413                 dlg.beforeRenderEvent.subscribe(function() { 
3414                         var dd = new YAHOO.util.DDProxy(dlg.element); 
3415                         dd.setHandleElId(dlg.header); 
3416                         dd.on('endDragEvent', function() { 
3417                                 dlg.show(); 
3418                         }); 
3419                 }, dlg, true); 
3420                 dlg.render();
3421
3422                 var tp = SE.settings.settingsTabs = new YAHOO.widget.TabView("settingsTabDiv");
3423                         var tabContent = Dom.get("tab_general");
3424                 tp.addTab(new YAHOO.widget.Tab({
3425                                 label: app_strings.LBL_EMAIL_SETTINGS_GENERAL,
3426                                 scroll : true,
3427                                 content :  tabContent.innerHTML,
3428                                 id : "generalSettings",
3429                                 active : true
3430                         }));
3431                 tabContent.parentNode.removeChild(tabContent);
3432                 tabContent = Dom.get("tab_accounts");
3433                 var accountTab = new YAHOO.widget.Tab({
3434                                 label: app_strings.LBL_EMAIL_SETTINGS_ACCOUNTS,
3435                                 scroll : true,
3436                                 content : tabContent.innerHTML,
3437                                 id : "accountSettings"
3438                         });
3439                 tp.addTab(accountTab);
3440                 tabContent.parentNode.removeChild(tabContent);
3441
3442                         tp.appendTo(dlg.body);
3443         }
3444         
3445         SE.settings.settingsDialog.show();
3446         SE.folders.lazyLoadSettings();
3447         SE.accounts.lazyLoad();
3448     },
3449     
3450
3451     lazyLoadRules : function() {
3452         if(false/*!SE.settings.rules*/) {
3453             AjaxObject.startRequest(callbackLoadRules, urlStandard + "&emailUIAction=loadRulesForSettings");
3454         }
3455
3456     }
3457
3458 };
3459 ////    END SE.settings
3460 ///////////////////////////////////////////////////////////////////////////////
3461 })();
3462
3463 /******************************************************************************
3464  * UTILITIES
3465  *****************************************************************************/
3466 function removeHiddenNodes(nodes, grid) {
3467     var el;
3468         for(var i = nodes.length - 1; i > -1; i--) {
3469         el = grid ? grid.getTrEl(nodes[i]) : nodes[i];
3470         if (YAHOO.util.Dom.hasClass(el, 'rowStylenone')) {
3471                 nodes.splice(i,1);
3472        }
3473     }
3474 }
3475
3476 function strpad(val) {
3477     return (!isNaN(val) && val.toString().length==1)?"0"+val:val;
3478 };
3479
3480 function refreshTodos() {
3481     SUGAR.email2.util.clearHiddenFieldValues('emailUIForm');
3482     AjaxObject.target = 'todo';
3483     AjaxObject.startRequest(callback, urlStandard + '&emailUIAction=refreshTodos');
3484 };
3485
3486 /******************************************************************************
3487  * MUST STAY IN GLOBAL NAMESPACE
3488  *****************************************************************************/
3489 function refresh_signature_list(signature_id, signature_name) {
3490     var field=document.getElementById('signature_id');
3491     var bfound=0;
3492     for (var i=0; i < field.options.length; i++) {
3493             if (field.options[i].value == signature_id) {
3494                 if (field.options[i].selected==false) {
3495                     field.options[i].selected=true;
3496                 }
3497                 bfound=1;
3498             }
3499     }
3500     //add item to selection list.
3501     if (bfound == 0) {
3502         var newElement=document.createElement('option');
3503         newElement.text=signature_name;
3504         newElement.value=signature_id;
3505         field.options.add(newElement);
3506         newElement.selected=true;
3507     }
3508
3509     //enable the edit button.
3510     var field1=document.getElementById('edit_sig');
3511     field1.style.visibility="inherit";
3512     var deleteButt = document.getElementById('delete_sig');
3513     deleteButt.style.visibility="inherit";
3514 };
3515
3516 function setDefaultSigId(id) {
3517     var checkbox = document.getElementById("signature_default");
3518     var default_sig = document.getElementById("signatureDefault");
3519
3520     if(checkbox.checked) {
3521         default_sig.value = id;
3522     } else {
3523         default_sig.value = "";
3524     }
3525 };
3526
3527 function setSigEditButtonVisibility() {
3528     var field = document.getElementById('signature_id');
3529     var editButt = document.getElementById('edit_sig');
3530     var deleteButt = document.getElementById('delete_sig');
3531     if(field.value != '') {
3532         editButt.style.visibility = "inherit";
3533         deleteButt.style.visibility = "inherit";
3534     } else {
3535         editButt.style.visibility = "hidden";
3536         deleteButt.style.visibility = "hidden";
3537     }
3538 }