!import
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1 /* -*- Mode: Javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 *
3 * ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 *
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
10 *
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
15 *
16 * The Original Code is mozilla.org code.
17 *
18 * The Initial Developer of the Original Code is
19 * Netscape Communications Corporation.
20 * Portions created by the Initial Developer are Copyright (C) 1999
21 * the Initial Developer. All Rights Reserved.
22 *
23 * Contributor(s):
24 * Jeff Beckley <beckley@qualcomm.com>
25 *
26 * Alternatively, the contents of this file may be used under the terms of
27 * either of the GNU General Public License Version 2 or later (the "GPL"),
28 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
37 *
38 * ***** END LICENSE BLOCK ***** */
39
40 var importType = null;
41 var gImportMsgsBundle;
42 var importService = 0;
43 var successStr = null;
44 var errorStr = null;
45 var inputStr = null ;
46 var progressInfo = null;
47 var selectedModuleName = null;
48
49 var selLocIsHome = false ;
50 var addInterface = null ;
51
OnLoadImportDialog
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
52 function OnLoadImportDialog()
53 {
54 gImportMsgsBundle = document.getElementById("bundle_importMsgs");
55 importService = Components.classes["@mozilla.org/import/import-service;1"].getService();
56 importService = top.importService.QueryInterface(Components.interfaces.nsIImportService);
57
58 progressInfo = { };
59 progressInfo.progressWindow = null;
60 progressInfo.importInterface = null;
61 progressInfo.mainWindow = window;
62 progressInfo.intervalState = 0;
63 progressInfo.importSuccess = false;
64 progressInfo.importType = null;
65 progressInfo.localFolderExists = false;
66
67 // look in arguments[0] for parameters
68 if (window.arguments && window.arguments.length >= 1 &&
69 "importType" in window.arguments[0] && window.arguments[0].importType)
70 {
71 // keep parameters in global for later
72 importType = window.arguments[0].importType;
73 progressInfo.importType = top.importType;
74 }
75 else
76 {
77 importType = "all";
78 progressInfo.importType = "all";
79 }
80
81 SetUpImportType();
82
83 // on startup, set the focus to the control element
84 // for accessibility reasons.
85 // if we used the wizardOverlay, we would get this for free.
86 // see bug #101874
87 document.getElementById("importFields").focus();
88 }
89
90
SetUpImportType
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
91 function SetUpImportType()
92 {
93 // set dialog title
94 document.getElementById("importFields").value = importType;
95
96 // Mac migration not working right now, so disable it
97 if (navigator.platform.match("^Mac"))
98 {
99 document.getElementById("allRadio").setAttribute("disabled", "true");
100 if (importType == "all")
101 document.getElementById("importFields").value = "addressbook";
102 }
103
104 ListModules();
105 }
106
107
SetDivText
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
108 function SetDivText(id, text)
109 {
110 var div = document.getElementById(id);
111
112 if (div) {
113 if (!div.hasChildNodes()) {
114 var textNode = document.createTextNode(text);
115 div.appendChild(textNode);
116 }
117 else if ( div.childNodes.length == 1 ) {
118 div.childNodes[0].nodeValue = text;
119 }
120 }
121 }
122
CheckIfLocalFolderExists
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
123 function CheckIfLocalFolderExists()
124 {
125 var acctMgr = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
126 if (acctMgr) {
127 try {
128 if (acctMgr.localFoldersServer)
129 progressInfo.localFolderExists = true;
130 }
131 catch (ex) {
132 progressInfo.localFolderExists = false;
133 }
134 }
135 }
136
ImportDialogOKButton
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
137 function ImportDialogOKButton()
138 {
139 var listbox = document.getElementById('moduleList');
140 var deck = document.getElementById("stateDeck");
141 var header = document.getElementById("header");
142 var progressMeterEl = document.getElementById("progressMeter");
143 var progressStatusEl = document.getElementById("progressStatus");
144 var progressTitleEl = document.getElementById("progressTitle");
145
146 // better not mess around with navigation at this point
147 var nextButton = document.getElementById("forward");
148 nextButton.setAttribute("disabled", "true");
149 var backButton = document.getElementById("back");
150 backButton.setAttribute("disabled", "true");
151
152 if ( listbox && listbox.selectedItems && (listbox.selectedItems.length == 1) )
153 {
154 importType = document.getElementById("importFields").value;
155 var index = listbox.selectedItems[0].getAttribute('list-index');
156 var module = importService.GetModule(importType, index);
157 var name = importService.GetModuleName(importType, index);
158 selectedModuleName = name;
159 if (module)
160 {
161 // Fix for Bug 57839 & 85219
162 // We use localFoldersServer(in nsIMsgAccountManager) to check if Local Folder exists.
163 // We need to check localFoldersServer before importing "mail", "settings", or "filters".
164 // Reason: We will create an account with an incoming server of type "none" after
165 // importing "mail", so the localFoldersServer is valid even though the Local Folder
166 // is not created.
167 if (importType == "mail" || importType == "settings" || importType == "filters")
168 CheckIfLocalFolderExists();
169
170 var meterText = "";
171 switch(importType)
172 {
173 case "mail":
174
175 top.successStr = Components.classes["@mozilla.org/supports-string;1"].createInstance();
176 if (top.successStr) {
177 top.successStr = top.successStr.QueryInterface( Components.interfaces.nsISupportsString);
178 }
179 top.errorStr = Components.classes["@mozilla.org/supports-string;1"].createInstance();
180 if (top.errorStr)
181 top.errorStr = top.errorStr.QueryInterface( Components.interfaces.nsISupportsString);
182
183 if (ImportMail( module, top.successStr, top.errorStr) == true)
184 {
185 // We think it was a success, either, we need to
186 // wait for the import to finish
187 // or we are done!
188 if (top.progressInfo.importInterface == null) {
189 ShowImportResults(true, 'Mail');
190 return( true);
191 }
192 else {
193 meterText = gImportMsgsBundle.getFormattedString('MailProgressMeterText',
194 [ name ]);
195 header.setAttribute("description", meterText);
196
197 progressStatusEl.setAttribute("label", "");
198 progressTitleEl.setAttribute("label", meterText);
199
200 deck.setAttribute("selectedIndex", "2");
201 progressInfo.progressWindow = top.window;
202 progressInfo.intervalState = setInterval("ContinueImportCallback()", 100);
203 return( true);
204 }
205 }
206 else
207 {
208 ShowImportResults(false, 'Mail');
209 // enable back and next buttons so that users can retry or pick other import options.
210 nextButton.removeAttribute("disabled");
211 backButton.removeAttribute("disabled");
212 return( false);
213 }
214 break;
215
216 case "addressbook":
217 top.successStr = Components.classes["@mozilla.org/supports-string;1"].createInstance();
218 if (top.successStr)
219 top.successStr = top.successStr.QueryInterface( Components.interfaces.nsISupportsString);
220 top.errorStr = Components.classes["@mozilla.org/supports-string;1"].createInstance();
221 if (top.errorStr)
222 top.errorStr = top.errorStr.QueryInterface( Components.interfaces.nsISupportsString);
223 top.inputStr = Components.classes["@mozilla.org/supports-string;1"].createInstance();
224 if (top.inputStr)
225 top.inputStr = top.inputStr.QueryInterface( Components.interfaces.nsISupportsString);
226
227 if (ImportAddress( module, top.successStr, top.errorStr) == true) {
228 // We think it was a success, either, we need to
229 // wait for the import to finish
230 // or we are done!
231 if (top.progressInfo.importInterface == null) {
232 ShowImportResults(true, 'Address');
233 return( true);
234 }
235 else {
236 meterText = gImportMsgsBundle.getFormattedString('AddrProgressMeterText',
237 [ name ]);
238 header.setAttribute("description", meterText);
239
240 progressStatusEl.setAttribute("label", "");
241 progressTitleEl.setAttribute("label", meterText);
242
243 deck.setAttribute("selectedIndex", "2");
244 progressInfo.progressWindow = top.window;
245 progressInfo.intervalState = setInterval("ContinueImportCallback()", 100);
246
247 return( true);
248 }
249 }
250 else
251 {
252 ShowImportResults(false, 'Address');
253 // re-enable the next button, as we are here
254 // because the user cancelled when picking an addressbook file to import.
255 // enable next, so they can try again
256 nextButton.removeAttribute("disabled");
257 // also enable back button so that users can pick other import options.
258 backButton.removeAttribute("disabled");
259 return( false);
260 }
261 break;
262
263 case "settings":
264 var error = new Object();
265 error.value = null;
266 var newAccount = new Object();
267 if (!ImportSettings( module, newAccount, error))
268 {
269 if (error.value)
270 ShowImportResultsRaw(gImportMsgsBundle.getString('ImportSettingsFailed'), null, false);
271 // the user canceled the operation, shoud we dismiss
272 // this dialog or not?
273 return false;
274 }
275 else
276 ShowImportResultsRaw(gImportMsgsBundle.getFormattedString('ImportSettingsSuccess', [ name ]), null, true);
277 break;
278
279 case "filters":
280 var error = new Object();
281 error.value = null;
282 if (!ImportFilters( module, error))
283 {
284 if (error.value)
285 ShowImportResultsRaw(gImportMsgsBundle.getFormattedString('ImportFiltersFailed', [ name ]), error.value, false);
286 // the user canceled the operation, shoud we dismiss
287 // this dialog or not?
288 return false;
289 }
290 else
291 {
292 if (error.value)
293 ShowImportResultsRaw(gImportMsgsBundle.getFormattedString('ImportFiltersPartial', [ name ]), error.value, true);
294 else
295 ShowImportResultsRaw(gImportMsgsBundle.getFormattedString('ImportFiltersSuccess', [ name ]), null, true);
296 }
297 break;
298 }
299 }
300 }
301
302 return true;
303 }
304
SetStatusText
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
305 function SetStatusText( val)
306 {
307 var progressStatus = document.getElementById("progressStatus");
308 progressStatus.setAttribute( "label", val);
309 }
310
SetProgress
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
311 function SetProgress( val)
312 {
313 var progressMeter = document.getElementById("progressMeter");
314 progressMeter.setAttribute( "value", val);
315 }
316
ContinueImportCallback
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
317 function ContinueImportCallback()
318 {
319 progressInfo.mainWindow.ContinueImport( top.progressInfo);
320 }
321
ImportSelectionChanged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
322 function ImportSelectionChanged()
323 {
324 var listbox = document.getElementById('moduleList');
325 if ( listbox && listbox.selectedItems && (listbox.selectedItems.length == 1) )
326 {
327 var index = listbox.selectedItems[0].getAttribute('list-index');
328 SetDivText('description', top.importService.GetModuleDescription(top.importType, index));
329 }
330 }
331
CompareImportModuleName
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
332 function CompareImportModuleName(a, b)
333 {
334 if (a.name > b.name)
335 return 1;
336 if (a.name < b.name)
337 return -1;
338 return 0;
339 }
340
ListModules
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
341 function ListModules() {
342 if (top.importService == null)
343 return;
344
345 var body = document.getElementById( "moduleList");
346 while (body.hasChildNodes()) {
347 body.removeChild(body.lastChild);
348 }
349
350 var count = top.importService.GetModuleCount(top.importType);
351 var i;
352
353 var moduleArray = new Array(count);
354 for (i = 0; i < count; i++) {
355 moduleArray[i] = {name:top.importService.GetModuleName(top.importType, i), index:i };
356 }
357
358 // sort the array of modules by name, so that they'll show up in the right order
359 moduleArray.sort(CompareImportModuleName);
360
361 for (i = 0; i < count; i++) {
362 AddModuleToList(moduleArray[i].name, moduleArray[i].index);
363 }
364 }
365
AddModuleToList
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
366 function AddModuleToList(moduleName, index)
367 {
368 var body = document.getElementById("moduleList");
369
370 var item = document.createElement('listitem');
371 item.setAttribute('label', moduleName);
372 item.setAttribute('list-index', index);
373
374 body.appendChild(item);
375 }
376
377
ContinueImport
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
378 function ContinueImport( info) {
379 var isMail = info.importType == 'mail' ? true : false;
380 var clear = true;
381 var deck;
382 var pcnt;
383
384 if (info.importInterface) {
385 if (!info.importInterface.ContinueImport()) {
386 info.importSuccess = false;
387 clearInterval( info.intervalState);
388 if (info.progressWindow != null) {
389 deck = document.getElementById("stateDeck");
390 deck.setAttribute("selectedIndex", "3");
391 info.progressWindow = null;
392 }
393
394 ShowImportResults(false, isMail ? 'Mail' : 'Address');
395 }
396 else if ((pcnt = info.importInterface.GetProgress()) < 100) {
397 clear = false;
398 if (info.progressWindow != null) {
399 if (pcnt < 5)
400 pcnt = 5;
401 SetProgress( pcnt);
402 if (isMail) {
403 var mailName = info.importInterface.GetData( "currentMailbox");
404 if (mailName) {
405 mailName = mailName.QueryInterface( Components.interfaces.nsISupportsString);
406 if (mailName)
407 SetStatusText( mailName.data);
408 }
409 }
410 }
411 }
412 else {
413 dump("*** WARNING! sometimes this shows results too early. \n");
414 dump(" something screwy here. this used to work fine.\n");
415 clearInterval( info.intervalState);
416 info.importSuccess = true;
417 if (info.progressWindow) {
418 deck = document.getElementById("stateDeck");
419 deck.setAttribute("selectedIndex", "3");
420 info.progressWindow = null;
421 }
422
423 ShowImportResults(true, isMail ? 'Mail' : 'Address');
424 }
425 }
426 if (clear) {
427 info.intervalState = null;
428 info.importInterface = null;
429 }
430 }
431
432
ShowResults
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
433 function ShowResults(doesWantProgress, result)
434 {
435 if (result)
436 {
437 if (doesWantProgress)
438 {
439 var deck = document.getElementById("stateDeck");
440 var header = document.getElementById("header");
441 var progressStatusEl = document.getElementById("progressStatus");
442 var progressTitleEl = document.getElementById("progressTitle");
443
444 var meterText = gImportMsgsBundle.getFormattedString('AddrProgressMeterText',
445 [ name ]);
446 header.setAttribute("description", meterText);
447
448 progressStatusEl.setAttribute("label", "");
449 progressTitleEl.setAttribute("label", meterText);
450
451 deck.setAttribute("selectedIndex", "2");
452 progressInfo.progressWindow = top.window;
453 progressInfo.intervalState = setInterval("ContinueImportCallback()", 100);
454 }
455 else
456 {
457 ShowImportResults(true, 'Address');
458 }
459 }
460 else
461 {
462 ShowImportResults(false, 'Address');
463 }
464
465 return true ;
466 }
467
468
ShowImportResults
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
469 function ShowImportResults(good, module)
470 {
471 // The callers seem to set 'good' to true even if there's something
472 // in the error log. So we should only make it a success case if
473 // error log/str is empty.
474 var modSuccess = 'Import' + module + 'Success';
475 var modFailed = 'Import' + module + 'Failed';
476 var results, title;
477 if (good && !errorStr.data) {
478 title = gImportMsgsBundle.getFormattedString(modSuccess, [ selectedModuleName ? selectedModuleName : '' ]);
479 results = successStr.data;
480 }
481 else if (errorStr.data) {
482 title = gImportMsgsBundle.getFormattedString(modFailed, [ selectedModuleName ? selectedModuleName : '' ]);
483 results = errorStr.data;
484 }
485
486 if (results && title)
487 ShowImportResultsRaw(title, results, good);
488 }
489
ShowImportResultsRaw
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
490 function ShowImportResultsRaw(title, results, good)
491 {
492 SetDivText("status", title);
493 var header = document.getElementById("header");
494 header.setAttribute("description", title);
495 dump("*** results = " + results + "\n");
496 attachStrings("results", results);
497 var deck = document.getElementById("stateDeck");
498 deck.setAttribute("selectedIndex", "3");
499 var nextButton = document.getElementById("forward");
500 nextButton.label = nextButton.getAttribute("finishedval");
501 nextButton.removeAttribute("disabled");
502 var cancelButton = document.getElementById("cancel");
503 cancelButton.setAttribute("disabled", "true");
504 var backButton = document.getElementById("back");
505 backButton.setAttribute("disabled", "true");
506
507 // If the Local Folder is not existed, create it after successfully
508 // import "mail" and "settings"
509 var checkLocalFolder = (top.progressInfo.importType == 'mail' || top.progressInfo.importType == 'settings') ? true : false;
510 if (good && checkLocalFolder && !top.progressInfo.localFolderExists) {
511 var am = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
512 if (am)
513 am.createLocalMailAccount();
514 }
515 }
516
attachStrings
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
517 function attachStrings(aNode, aString)
518 {
519 var attachNode = document.getElementById(aNode);
520 if (!aString) {
521 attachNode.parentNode.setAttribute("hidden", "true");
522 return;
523 }
524 var strings = aString.split("\n");
525 for (var i = 0; i < strings.length; i++) {
526 if (strings[i]) {
527 var currNode = document.createTextNode(strings[i]);
528 attachNode.appendChild(currNode);
529 var br = document.createElementNS("http://www.w3.org/1999/xhtml", 'br');
530 attachNode.appendChild( br);
531 }
532 }
533 }
534
ShowAddressComplete
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
535 function ShowAddressComplete( good)
536 {
537 var str = null;
538 if (good == true) {
539 if ((top.selectedModuleName != null) && (top.selectedModuleName.length > 0))
540 str = gImportMsgsBundle.getFormattedString('ImportAddressSuccess', [ top.selectedModuleName ]);
541 else
542 str = gImportMsgsBundle.getFormattedString('ImportAddressSuccess', [ "" ]);
543 str += "\n";
544 str += "\n" + top.successStr.data;
545 }
546 else {
547 if ((top.errorStr.data != null) && (top.errorStr.data.length > 0)) {
548 if ((top.selectedModuleName != null) && (top.selectedModuleName.length > 0))
549 str = gImportMsgsBundle.getFormattedString('ImportAddressFailed', [ top.selectedModuleName ]);
550 else
551 str = gImportMsgsBundle.getFormattedString('ImportAddressFailed', [ "" ]);
552 str += "\n" + top.errorStr.data;
553 }
554 }
555
556 if (str != null)
557 alert( str);
558 }
559
560 /*
561 Import Settings from a specific module, returns false if it failed
562 and true if successful. A "local mail" account is returned in newAccount.
563 This is only useful in upgrading - import the settings first, then
564 import mail into the account returned from ImportSettings, then
565 import address books.
566 An error string is returned as error.value
567 */
ImportSettings
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
568 function ImportSettings( module, newAccount, error) {
569 var setIntf = module.GetImportInterface( "settings");
570 if (setIntf != null)
571 setIntf = setIntf.QueryInterface( Components.interfaces.nsIImportSettings);
572 if (setIntf == null) {
573 error.value = gImportMsgsBundle.getString('ImportSettingsBadModule');
574 return( false);
575 }
576
577 // determine if we can auto find the settings or if we need to ask the user
578 var location = new Object();
579 var description = new Object();
580 var result = setIntf.AutoLocate( description, location);
581 if (result == false) {
582 // In this case, we couldn't not find the settings
583 if (location.value != null) {
584 // Settings were not found, however, they are specified
585 // in a file, so ask the user for the settings file.
586 var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
587 if (filePicker != null) {
588 filePicker = filePicker.QueryInterface( Components.interfaces.nsIFilePicker);
589 if (filePicker != null) {
590 var file = null;
591 try {
592 filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectSettings'), Components.interfaces.nsIFilePicker.modeOpen);
593 filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
594 filePicker.show();
595 file = filePicker.file;
596 }
597 catch(ex) {
598 file = null;
599 error.value = null;
600 return( false);
601 }
602 if (file != null) {
603 setIntf.SetLocation( file);
604 }
605 else {
606 error.value = null;
607 return( false);
608 }
609 }
610 else {
611 error.value = gImportMsgsBundle.getString('ImportSettingsNotFound');
612 return( false);
613 }
614 }
615 else {
616 error.value = gImportMsgsBundle.getString('ImportSettingsNotFound');
617 return( false);
618 }
619 }
620 else {
621 error.value = gImportMsgsBundle.getString('ImportSettingsNotFound');
622 return( false);
623 }
624 }
625
626 // interesting, we need to return the account that new
627 // mail should be imported into?
628 // that's really only useful for "Upgrade"
629 result = setIntf.Import( newAccount);
630 if (result == false) {
631 error.value = gImportMsgsBundle.getString('ImportSettingsFailed');
632 }
633 return( result);
634 }
635
ImportMail
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
636 function ImportMail( module, success, error) {
637 if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
638 error.data = gImportMsgsBundle.getString('ImportAlreadyInProgress');
639 return( false);
640 }
641
642 top.progressInfo.importSuccess = false;
643
644 var mailInterface = module.GetImportInterface( "mail");
645 if (mailInterface != null)
646 mailInterface = mailInterface.QueryInterface( Components.interfaces.nsIImportGeneric);
647 if (mailInterface == null) {
648 error.data = gImportMsgsBundle.getString('ImportMailBadModule');
649 return( false);
650 }
651
652 var loc = mailInterface.GetData( "mailLocation");
653
654 if (loc == null) {
655 // No location found, check to see if we can ask the user.
656 if (mailInterface.GetStatus( "canUserSetLocation") != 0) {
657 if (selectedModuleName == gImportMsgsBundle.getString('Comm4xImportName'))
658 {
659 var errorValue = true;
660 //open the profile dialog.
661 var comm4xprofile = Components.classes["@mozilla.org/comm4xProfile;1"].createInstance();
662 if(comm4xprofile != null) {
663 comm4xprofile = comm4xprofile.QueryInterface( Components.interfaces.nsIComm4xProfile);
664 if(comm4xprofile != null) {
665 var length = {value:0};
666 var profileList = null;
667 try {
668 profileList = comm4xprofile.getProfileList(length);
669 }
670 catch (ex) {}
671 if (length.value)
672 {
673 var selected = {value:0};
674 if (length.value == 1)
675 {
676 errorValue = false;
677 }
678 else {
679 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
680 if (promptService) {
681 var clickedOk = false;
682 clickedOk = promptService.select(window,
683 gImportMsgsBundle.getString('profileTitle'),
684 gImportMsgsBundle.getString('profileText'),
685 length.value, profileList, selected);
686 if (clickedOk) {
687 errorValue = false;
688 }
689 else {
690 // users cancel the pick list dialog so just return and
691 // don't set error string so that current dialog can stay.
692 return( false);
693 }
694 } // promptService
695 }
696 if (!errorValue) {
697 var profileDir = comm4xprofile.getMailDir(profileList[selected.value]);
698 var localfile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
699 localfile.initWithPath(profileDir);
700 mailInterface.SetData( "mailLocation", localfile);
701 }
702 } // profileList
703 } // comm4xprofile
704 } // comm4xprofile
705 if (errorValue) {
706 error.data = gImportMsgsBundle.getString('ImportMailNotFound');
707 return(false);
708 }
709 }
710 else {
711 var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
712 if (filePicker != null) {
713 filePicker = filePicker.QueryInterface( Components.interfaces.nsIFilePicker);
714 if (filePicker != null) {
715 try {
716 filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectMailDir'), Components.interfaces.nsIFilePicker.modeGetFolder);
717 filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
718 filePicker.show();
719 if (filePicker.file && (filePicker.file.path.length > 0))
720 mailInterface.SetData( "mailLocation", filePicker.file);
721 else
722 return( false);
723 } catch( ex) {
724 // don't show an error when we return!
725 return( false);
726 }
727 }
728 else {
729 error.data = gImportMsgsBundle.getString('ImportMailNotFound');
730 return( false);
731 }
732 }
733 else {
734 error.data = gImportMsgsBundle.getString('ImportMailNotFound');
735 return( false);
736 }
737 }
738 }
739 else {
740 error.data = gImportMsgsBundle.getString('ImportMailNotFound');
741 return( false);
742 }
743 }
744
745 if (mailInterface.WantsProgress()) {
746 if (mailInterface.BeginImport( success, error, false)) {
747 top.progressInfo.importInterface = mailInterface;
748 // top.intervalState = setInterval( "ContinueImport()", 100);
749 return true;
750 }
751 else
752 return false;
753 }
754 else
755 return mailInterface.BeginImport( success, error, false) ? true : false;
756 }
757
758
759 // The address import! A little more complicated than the mail import
760 // due to field maps...
ImportAddress
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
761 function ImportAddress( module, success, error) {
762 if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
763 error.data = gImportMsgsBundle.getString('ImportAlreadyInProgress');
764 return( false);
765 }
766
767 top.progressInfo.importSuccess = false;
768
769 addInterface = module.GetImportInterface( "addressbook");
770 if (addInterface != null)
771 addInterface = addInterface.QueryInterface( Components.interfaces.nsIImportGeneric);
772 if (addInterface == null) {
773 error.data = gImportMsgsBundle.getString('ImportAddressBadModule');
774 return( false);
775 }
776
777 var path ;
778 var loc = addInterface.GetStatus( "autoFind");
779 if (loc == false) {
780 loc = addInterface.GetData( "addressLocation");
781 if (loc != null) {
782 loc = loc.QueryInterface( Components.interfaces.nsIFile);
783 if (loc != null) {
784 if (!loc.exists)
785 loc = null;
786 }
787 }
788 }
789
790 if (loc == null) {
791 // Couldn't find the address book, see if we can
792 // as the user for the location or not?
793 if (addInterface.GetStatus( "canUserSetLocation") == 0) {
794 // an autofind address book that could not be found!
795 error.data = gImportMsgsBundle.getString('ImportAddressNotFound');
796 return( false);
797 }
798
799 var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
800 if (filePicker != null) {
801 filePicker = filePicker.QueryInterface( Components.interfaces.nsIFilePicker);
802 if (filePicker == null) {
803 error.data = gImportMsgsBundle.getString('ImportAddressNotFound');
804 return( false);
805 }
806 }
807 else {
808 error.data = gImportMsgsBundle.getString('ImportAddressNotFound');
809 return( false);
810 }
811
812 // The address book location was not found.
813 // Determine if we need to ask for a directory
814 // or a single file.
815 var file = null;
816 var fileIsDirectory = false;
817 if (addInterface.GetStatus( "supportsMultiple") != 0) {
818 // ask for dir
819 try {
820 filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectAddrDir'), Components.interfaces.nsIFilePicker.modeGetFolder);
821 filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
822 filePicker.show();
823 if (filePicker.file && (filePicker.file.path.length > 0)) {
824 file = filePicker.file;
825 fileIsDirectory = true;
826 }
827 else {
828 file = null;
829 }
830 } catch( ex) {
831 file = null;
832 }
833 }
834 else {
835 // ask for file
836 try {
837 filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectAddrFile'), Components.interfaces.nsIFilePicker.modeOpen);
838 if (selectedModuleName == gImportMsgsBundle.getString('Comm4xImportName'))
839 filePicker.appendFilter(gImportMsgsBundle.getString('Comm4xFiles'),"*.na2");
840 else {
841 var addressbookBundle = document.getElementById("bundle_addressbook");
842 filePicker.appendFilter(addressbookBundle.getString('LDIFFiles'), "*.ldi; *.ldif");
843 filePicker.appendFilter(addressbookBundle.getString('CSVFiles'), "*.csv");
844 filePicker.appendFilter(addressbookBundle.getString('TABFiles'), "*.tab; *.txt");
845 filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterAll);
846 }
847
848 if (filePicker.show() == Components.interfaces.nsIFilePicker.returnCancel)
849 return false;
850
851 if (filePicker.file && (filePicker.file.path.length > 0))
852 file = filePicker.file;
853 else
854 file = null;
855 } catch( ex) {
856 dump("ImportAddress(): failure when picking a file to import: " + ex + "\n");
857 file = null;
858 }
859 }
860
861 path = filePicker.file.leafName;
862
863 if (file == null) {
864 return( false);
865 }
866
867 if ( !fileIsDirectory && (file.fileSize == 0) ) {
868 var errorText = gImportMsgsBundle.getFormattedString('ImportEmptyAddressBook', [path]);
869 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
870
871 promptService.alert(window, document.title, errorText);
872 return false;
873 }
874 addInterface.SetData("addressLocation", file);
875 }
876
877 // no need to use the fieldmap for 4.x import since we are using separate dialog
878 if (selectedModuleName == gImportMsgsBundle.getString('Comm4xImportName'))
879 {
880 var deck = document.getElementById("stateDeck");
881 deck.setAttribute("selectedIndex", "4");
882 var isHomeRadioGroup = document.getElementById("homeorwork");
883 isHomeRadioGroup.selectedItem = document.getElementById("workRadio");
884 var forwardButton = document.getElementById("forward");
885 forwardButton.removeAttribute("disabled");
886 var warning = document.getElementById("warning");
887 var textStr = " " + path ;
888 warning.setAttribute ('value', textStr) ;
889 return false;
890 }
891
892 var map = addInterface.GetData( "fieldMap");
893 if (map != null) {
894 map = map.QueryInterface( Components.interfaces.nsIImportFieldMap);
895 if (map != null) {
896 var result = new Object();
897 result.ok = false;
898 top.window.openDialog(
899 "chrome://messenger/content/fieldMapImport.xul",
900 "",
901 "chrome,modal,titlebar",
902 {fieldMap: map,
903 addInterface: addInterface,
904 result: result});
905 }
906 if (result.ok == false)
907 return( false);
908 }
909
910 if (addInterface.WantsProgress()) {
911 if (addInterface.BeginImport( success, error, selLocIsHome)) {
912 top.progressInfo.importInterface = addInterface;
913 // top.intervalState = setInterval( "ContinueImport()", 100);
914 return( true);
915 }
916 else {
917 return( false);
918 }
919 }
920 else {
921 if (addInterface.BeginImport( success, error, selLocIsHome)) {
922 return( true);
923 }
924 else {
925 return( false);
926 }
927 }
928 }
929
930 /*
931 Import filters from a specific module.
932 Returns false if it failed and true if it succeeded.
933 An error string is returned as error.value.
934 */
ImportFilters
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
935 function ImportFilters( module, error)
936 {
937 if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
938 error.data = gImportMsgsBundle.getString('ImportAlreadyInProgress');
939 return( false);
940 }
941
942 top.progressInfo.importSuccess = false;
943
944 var filtersInterface = module.GetImportInterface("filters");
945 if (filtersInterface != null)
946 filtersInterface = filtersInterface.QueryInterface(Components.interfaces.nsIImportFilters);
947 if (filtersInterface == null) {
948 error.data = gImportMsgsBundle.getString('ImportFiltersBadModule');
949 return( false);
950 }
951
952 return filtersInterface.Import(error);
953 }
954
SwitchType
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
955 function SwitchType( newType)
956 {
957 top.importType = newType;
958 top.progressInfo.importType = newType;
959
960 SetUpImportType();
961
962 SetDivText('description', "");
963 }
964
965
next
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
966 function next()
967 {
968 var deck = document.getElementById("stateDeck");
969 var index = deck.getAttribute("selectedIndex");
970 switch (index) {
971 case "0":
972 var backButton = document.getElementById("back");
973 backButton.removeAttribute("disabled");
974 var radioGroup = document.getElementById("importFields");
975
976 if (radioGroup.value == "all")
977 {
978 window.openDialog("chrome://messenger/content/migration/migration.xul",
979 "", "chrome,dialog,modal,centerscreen");
980 close();
981 }
982 else
983 {
984 SwitchType(radioGroup.value);
985 deck.setAttribute("selectedIndex", "1");
986 SelectFirstItem();
987 enableAdvance();
988 }
989 break;
990 case "1":
991 ImportDialogOKButton();
992 break;
993 case "3":
994 close();
995 break;
996 case "4" :
997 var isHomeRadioGroup = document.getElementById("homeorwork");
998 if (isHomeRadioGroup.selectedItem.getAttribute("value") == "Home")
999 selLocIsHome = true ;
1000 ExportComm4x() ;
1001 break ;
1002 }
1003 }
1004
ExportComm4x
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1005 function ExportComm4x()
1006 {
1007 var result ;
1008 if (addInterface.WantsProgress())
1009 {
1010 result = addInterface.BeginImport( successStr, errorStr, selLocIsHome) ;
1011 top.progressInfo.importInterface = addInterface;
1012 ShowResults(true, result) ;
1013 }
1014 else
1015 {
1016 result = addInterface.BeginImport( successStr, errorStr, selLocIsHome) ;
1017 ShowResults(false, result) ;
1018 }
1019
1020 return true ;
1021 }
1022
SelectFirstItem
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1023 function SelectFirstItem()
1024 {
1025 var listbox = document.getElementById("moduleList");
1026 listbox.selectedIndex = 0;
1027 ImportSelectionChanged();
1028 }
1029
enableAdvance
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1030 function enableAdvance()
1031 {
1032 var listbox = document.getElementById("moduleList");
1033 var nextButton = document.getElementById("forward");
1034 if (listbox.selectedItems.length)
1035 nextButton.removeAttribute("disabled");
1036 else
1037 nextButton.setAttribute("disabled", "true");
1038 }
1039
back
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1040 function back()
1041 {
1042 var deck = document.getElementById("stateDeck");
1043 if (deck.getAttribute("selectedIndex") == "1") {
1044 var backButton = document.getElementById("back");
1045 backButton.setAttribute("disabled", "true");
1046 var nextButton = document.getElementById("forward");
1047 nextButton.label = nextButton.getAttribute("nextval");
1048 nextButton.removeAttribute("disabled");
1049 deck.setAttribute("selectedIndex", "0");
1050 }
1051 }