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