This is just some static backup of the original site, don't expect every link to work!

source: content/v_identity.js @ 85fa10

ng_0.9
Last change on this file since 85fa10 was 85fa10, checked in by rene <rene@…>, 4 years ago

removed everything related to smtp-storage

  • Property mode set to 100644
File size: 15.9 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2    This program is free software; you can redistribute it and/or modify
3    it under the terms of the GNU General Public License as published by
4    the Free Software Foundation; either version 2 of the License, or
5    (at your option) any later version.
6
7    This program is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU General Public License for more details.
11
12    You should have received a copy of the GNU General Public License
13    along with this program; if not, write to the Free Software
14    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15
16    The Original Code is the Virtual Identity Extension.
17
18    The Initial Developer of the Original Code is Rene Ejury.
19    Portions created by the Initial Developer are Copyright (C) 2007
20    the Initial Developer. All Rights Reserved.
21
22    Contributor(s):
23 * ***** END LICENSE BLOCK ***** */
24
25Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
26virtualIdentityExtension.ns(function () {
27  with(virtualIdentityExtension.LIB) {
28
29    let Log = vI.setupLogging("virtualIdentity.main");
30    Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
31    Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
32    Components.utils.import("resource://v_identity/vI_replyToSelf.js", virtualIdentityExtension);
33    Components.utils.import("resource://v_identity/vI_accountUtils.js", virtualIdentityExtension);
34    Components.utils.import("resource://v_identity/plugins/signatureSwitch.js", virtualIdentityExtension);
35    Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension);
36    Components.utils.import("resource://v_identity/vI_smartIdentity.js", virtualIdentityExtension);
37    Components.utils.import("resource://v_identity/vI_log.js", virtualIdentityExtension);
38    Components.utils.import("resource:///modules/mailServices.js");
39
40    var main = {
41      timeStampID: null,
42      _smartIdentity: null,
43     
44      headerParser: Components.classes["@mozilla.org/messenger/headerparser;1"]
45        .getService(Components.interfaces.nsIMsgHeaderParser),
46
47      unicodeConverter: Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
48        .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
49
50      accountManager: Components.classes["@mozilla.org/messenger/account-manager;1"]
51        .getService(Components.interfaces.nsIMsgAccountManager),
52
53
54      // Those variables keep pointers to original functions which might get replaced later
55      original_functions: {
56        LoadIdentity: null
57      },
58
59      // some pointers to the layout-elements of the extension
60      elements: {
61        init_base: function () {
62          main.elements.Area_MsgIdentityHbox = document.getElementById("virtualIdentityExtension_msgIdentityHbox");
63          main.elements.Obj_MsgIdentity = document.getElementById("msgIdentity");
64        },
65        init_rest: function () {
66          main.elements.Obj_MsgIdentityPopup = document.getElementById("msgIdentityPopup");
67          main.elements.Obj_vILogo = document.getElementById("virtualIdentityExtension_Logo");
68        },
69        strings: null
70      },
71
72      ComposeStateListener: {
73        NotifyComposeBodyReady: function () {
74          Log.debug("NotifyComposeBodyReady");
75          main.initSystemStage2();
76        },
77        NotifyComposeFieldsReady: function () {
78          Log.debug("NotifyComposeFieldsReady");
79        },
80        ComposeProcessDone: function (aResult) {
81          Log.debug("StateListener reports ComposeProcessDone");
82          vI.vIaccount_removeUsedVIAccount();
83          vI.storage.clean();
84        },
85        SaveInFolderDone: function (folderURI) {
86          Log.debug("SaveInFolderDone");
87          vI.vIaccount_removeUsedVIAccount();
88          vI.storage.clean();
89        }
90      },
91
92      replacement_functions: {
93        LoadIdentity: function (startup) {
94          var identityElement = document.getElementById("msgIdentity");
95         
96          // identitykey and accountkey might not be set on new selectedItem, if it's a virtual identity
97          // on startup there might be no identitykey if a virtual identity is selected.
98          Log.debug("run adapted LoadIdentity startup=" + startup);
99         
100          let hasBaseId = identityElement.selectedItem.identityData.id.key;
101          if (hasBaseId == null) {
102            identityElement.selectedItem.setAttribute("identitykey", identityElement.getAttribute("identitykey"));
103            identityElement.selectedItem.setAttribute("accountkey", identityElement.getAttribute("accountkey"));
104          }
105          else {
106            identityElement.setAttribute("description", identityElement.selectedItem.getAttribute("description"));
107          }
108         
109          if (startup)
110            identityElement.identityData = identityElement.selectedItem.identityData.getDuplicate();
111          // else only values are copied into current identityData
112          else
113            identityElement.identityData.takeOverAvailableData(identityElement.selectedItem.identityData);
114         
115          gComposeNotificationBar.clearIdentityWarning();
116         
117          main.original_functions.LoadIdentity(startup);
118         
119          // store identitykey locally to enable restoring after selection of next virtual identity without identitykey
120          identityElement.setAttribute("identitykey", identityElement.selectedItem.getAttribute("identitykey"));
121         
122          identityElement.vid = identityElement.selectedItem.vid;
123        },
124      },
125
126      remove: function () {
127        window.removeEventListener('compose-window-reopen', main.reopen, true);
128        window.removeEventListener('compose-window-close', main.close, true);
129        Log.debug("end. remove Account if there.")
130        vI.storage.clean();
131      },
132
133      _getRecipients: function () {
134        var recipients = [];
135        for (var row = 1; row <= top.MAX_RECIPIENTS; row++) {
136          if (typeof awGetPopupElement(row).selectedItem == 'undefined')
137            continue;
138          var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
139          if (recipientType == "addr_reply" || recipientType == "addr_followup" ||
140            main._recipientIsDoBcc(row) || awGetInputElement(row).value.match(/^\s*$/)) continue;
141          recipients.push({
142            recipient: awGetInputElement(row).value,
143            recipientType: recipientType
144          });
145        }
146        return recipients;
147      },
148
149      _recipientIsDoBcc: function (row) {
150        if (typeof awGetPopupElement(row).selectedItem == 'undefined')
151          return false;
152        var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
153        if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
154
155        var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
156
157        for (var index = 0; index < doBccArray.count; index++) {
158          if (doBccArray.StringAt(index) == awGetInputElement(row).value) {
159            Log.debug("_recipientIsDoBcc: ignoring doBcc field '" +
160              doBccArray.StringAt(index));
161            return true;
162          }
163        }
164        return false
165      },
166
167      // initialization //
168      init: function () {
169        if (!this.timeStampID) {
170          this.timeStampID = parseInt((new Date()).getTime() / 100) % 864000; // give object unified id (per day)
171          Log = vI.setupLogging("virtualIdentity.main[" + this.timeStampID + "]");
172        }
173        window.removeEventListener('load', main.init, false);
174        window.removeEventListener('compose-window-init', main.init, true);
175        if (main.elements.Area_MsgIdentityHbox) return; // init done before, (?reopen)
176        Log.debug("init.")
177        main.unicodeConverter.charset = "UTF-8";
178       
179        // make msgIdentity editable
180//         var identityElement = document.getElementById("msgIdentity");
181//         identityElement.removeAttribute("type");
182//         identityElement.editable = true;
183//         identityElement.focus();
184//         identityElement.value = identityElement.selectedItem.value;
185//         identityElement.select();
186//         identityElement.inputField.placeholder = getComposeBundle().getFormattedString("msgIdentityPlaceholder", [identityElement.selectedItem.value]);
187//         
188//         main.adapt_interface();
189       
190//         main.adapt_loadIdentity();
191       
192       
193        let statusbarLabel = document.getElementById("v_identity_logo_statusbar");
194        statusbarLabel.setAttribute("value", statusbarLabel.getAttribute("value") + vI.extensionVersion);
195       
196        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
197        document.getElementById("virtualIdentityExtension_tooltipPopupset")
198          .addTooltip(document.getElementById("msgIdentity"), false);
199        window.addEventListener('compose-window-reopen', main.reopen, true);
200        window.addEventListener('compose-window-close', main.close, true);
201
202        // append observer to virtualIdentityExtension_fccSwitch, because it does'n work with real identities (hidden by css)
203//         document.getElementById("virtualIdentityExtension_fccSwitch").appendChild(document.getElementById("virtualIdentityExtension_msgIdentityClone_observer").cloneNode(false));
204
205        main.AccountManagerObserver.register();
206
207        main.initSystemStage1();
208        Log.debug("init done.")
209      },
210
211      initSystemStage1: function () {
212        Log.debug("initSystemStage1.");
213//         document.getElementById("msgIdentity").init();
214       
215        Log.debug("initSystemStage1 done.")
216      },
217
218      initSystemStage2: function () {
219        Log.debug("initSystemStage2.");
220        Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityClone=" + document.getElementById("msgIdentity"))
221//         vI.initReplyTo(window);
222        vI.storage.init();
223        vI.statusmenu.init();
224        new vI.smartIdentity(window, gMsgCompose, vI.storage);
225        Log.debug("initSystemStage2 done.")
226      },
227
228      close: function () {
229        vI.storage.clean();
230      },
231
232      adapt_interface: function () {
233        if (main.elements.Obj_MsgIdentityPopup) return; // only rearrange the interface once
234
235        // initialize the pointers to extension elements
236        main.elements.init_base()
237
238        // rearrange the positions of some elements
239        var parent_hbox = main.elements.Obj_MsgIdentity.parentNode;
240        var storage_box = document.getElementById("addresses-box");
241        var virtualIdentityExtension_autoReplyToSelfLabel = document.getElementById("virtualIdentityExtension_autoReplyToSelfLabelBox");
242
243        storage_box.removeChild(virtualIdentityExtension_autoReplyToSelfLabel);
244        parent_hbox.appendChild(virtualIdentityExtension_autoReplyToSelfLabel);
245        storage_box.removeChild(main.elements.Area_MsgIdentityHbox);
246        parent_hbox.appendChild(main.elements.Area_MsgIdentityHbox);
247
248        //main.elements.Obj_MsgIdentity.setAttribute("hidden", "true");
249        main.elements.Obj_MsgIdentity.previousSibling.setAttribute("control", "msgIdentity");
250
251        var access_label = parent_hbox.getElementsByAttribute("control", "msgIdentity")[0];
252        if (access_label) access_label.setAttribute("control", "msgIdentity");
253
254        // initialize the pointers to extension elements (initialize those earlier might brake the interface)
255        main.elements.init_rest();
256      },
257
258      adapt_loadIdentity: function () {
259        if (main.original_functions.LoadIdentity) return true; // only initialize this once
260        Log.debug("adapt LoadIdentity");
261        main.original_functions.LoadIdentity = LoadIdentity;
262        LoadIdentity = main.replacement_functions.LoadIdentity;
263        return true;
264      },
265
266      reopen: function () {
267        vI.clearDebugOutput();
268        Log.debug("composeDialog reopened. (msgType " + gMsgCompose.type + ")")
269        Log.debug("document.title=" + document.title + " gMsgCompose=" + gMsgCompose + " msgIdentityClone=" + document.getElementById("msgIdentity"))
270
271        // clean all elements
272        document.getElementById("msgIdentity").clean();
273        vI.storage.clean(); // just to be sure!
274        Log.debug("everything cleaned.")
275
276        // register StateListener
277        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
278
279        // now (re)init the elements
280        main.initSystemStage1();
281
282        vI.vIprefs.dropLocalChanges();
283
284        // NotifyComposeBodyReady is only triggered in reply-cases
285        // so activate stage2 in reply-cases trough StateListener
286        // in other cases directly
287        var msgComposeType = Components.interfaces.nsIMsgCompType;
288        switch (gMsgCompose.type) {
289        case msgComposeType.New:
290        case msgComposeType.NewsPost:
291        case msgComposeType.MailToUrl:
292        case msgComposeType.Draft:
293        case msgComposeType.Template:
294        case msgComposeType.ForwardAsAttachment:
295        case msgComposeType.ForwardInline:
296          main.initSystemStage2();
297          //             case msgComposeType.Reply:
298          //             case msgComposeType.ReplyAll:
299          //             case msgComposeType.ReplyToGroup:
300          //             case msgComposeType.ReplyToSender:
301          //             case msgComposeType.ReplyToSenderAndGroup:
302          //             case msgComposeType.ReplyWithTemplate:
303          //             case msgComposeType.ReplyToList:
304          //                 main.initSystemStage2() triggered trough NotifyComposeBodyReady;
305        }
306        Log.debug("reopen done.")
307      },
308
309      //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
310      AccountManagerObserver: {
311        _uninstall: false,
312        observe: function (subject, topic, data) {
313          if (topic == "am-acceptChanges") {
314            Log.debug("account changes observed");
315            Log.debug("cleaning original msgIdentityPopup");
316            var MenuItems = main.elements.Obj_MsgIdentityPopup.childNodes;
317            while (MenuItems.length > 0) {
318              try {
319                MenuItems[0].clean();
320              } catch (e) {};
321              main.elements.Obj_MsgIdentityPopup.removeChild(MenuItems[0])
322            }
323            let msgIdentity = document.getElementById("msgIdentity")
324            let tmp_identity = msgIdentity.identityData;
325            msgIdentity.clean();
326            msgIdentity.init();
327            Log.debug("cleaning original msgIdentityPopup done.");
328            tmp_identity.existingID = tmp_identity.isExistingIdentity(false)
329            if (tmp_identity.existingID) {
330              tmp_identity.id.key = tmp_identity.existingID
331            } else {
332              tmp_identity.id.key = MailServices.accounts.defaultAccount.defaultIdentity.key
333            }
334            Log.debug("adding previous identity to msgIdentityClone");
335            msgIdentity.selectedMenuItem = msgIdentity.addIdentityToCloneMenu(tmp_identity);
336            Log.debug("adding previous identity to msgIdentityClone done.");
337          }
338        },
339        register: function () {
340          var obsService = Components.classes["@mozilla.org/observer-service;1"].
341          getService(Components.interfaces.nsIObserverService)
342          obsService.addObserver(this, "am-acceptChanges", false);
343        },
344        unregister: function () {
345          var obsService = Components.classes["@mozilla.org/observer-service;1"].
346          getService(Components.interfaces.nsIObserverService)
347          obsService.removeObserver(this, "am-acceptChanges");
348        }
349      }
350    }
351
352    main.elements.init_base();
353    main.elements.init_rest();
354    main.adapt_loadIdentity();
355   
356    window.addEventListener('compose-window-init', main.init, true);
357
358    window.addEventListener("unload", function (e) {
359      main.AccountManagerObserver.unregister();
360      try {
361        vI.statusmenu.removeObserver();
362      } catch (ex) {}
363    }, false);
364    vI.main = main;
365  }
366});
Note: See TracBrowser for help on using the repository browser.