gecko-dev/mailnews/import/resources/content/importDialog.js
mitesh%netscape.com c08757addc Bug 83585 - Changes for new feature to import comm 4.x ab
r=chuang and sr=sspitzer
checking in for rdayal@netscape.com
2001-07-19 01:01:21 +00:00

900 lines
29 KiB
JavaScript

/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
var importType = null;
var gImportMsgsBundle;
var importService = 0;
var successStr = null;
var errorStr = null;
var inputStr = null ;
var progressInfo = null;
var selectedModuleName = null;
var selLocIsHome = false ;
var addInterface = null ;
function OnLoadImportDialog()
{
gImportMsgsBundle = document.getElementById("bundle_importMsgs");
importService = Components.classes["@mozilla.org/import/import-service;1"].getService();
importService = top.importService.QueryInterface(Components.interfaces.nsIImportService);
progressInfo = { };
progressInfo.progressWindow = null;
progressInfo.importInterface = null;
progressInfo.mainWindow = window;
progressInfo.intervalState = 0;
progressInfo.importSuccess = false;
progressInfo.importType = null;
progressInfo.localFolderExists = false;
// look in arguments[0] for parameters
if (window.arguments && window.arguments.length >= 1 &&
"importType" in window.arguments[0] && window.arguments[0].importType)
{
// keep parameters in global for later
importType = window.arguments[0].importType;
progressInfo.importType = top.importType;
}
else
{
importType = "addressbook";
progressInfo.importType = "addressbook";
}
SetUpImportType();
}
function SetUpImportType()
{
// set dialog title
var typeRadioGroup = document.getElementById("importFields");
switch (importType)
{
case "mail":
typeRadioGroup.selectedItem = document.getElementById("mailRadio");
break;
case "addressbook":
typeRadioGroup.selectedItem = document.getElementById("addressbookRadio");
break;
case "settings":
typeRadioGroup.selectedItem = document.getElementById("settingsRadio");
break;
}
ListModules();
}
function SetDivText(id, text)
{
var div = document.getElementById(id);
if (div) {
if (!div.childNodes.length) {
var textNode = document.createTextNode(text);
div.appendChild(textNode);
}
else if ( div.childNodes.length == 1 ) {
div.childNodes[0].nodeValue = text;
}
}
}
function CheckIfLocalFolderExists()
{
var acctMgr = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
if (acctMgr) {
try {
if (acctMgr.localFoldersServer)
progressInfo.localFolderExists = true;
}
catch (ex) {
progressInfo.localFolderExists = false;
}
}
}
function ImportDialogOKButton()
{
var tree = document.getElementById('moduleList');
var deck = document.getElementById("stateDeck");
var header = document.getElementById("header");
var progressMeterEl = document.getElementById("progressMeter");
var progressStatusEl = document.getElementById("progressStatus");
var progressTitleEl = document.getElementById("progressTitle");
// better not mess around with navigation at this point
var nextButton = document.getElementById("forward");
nextButton.setAttribute("disabled", "true");
var backButton = document.getElementById("back");
backButton.setAttribute("disabled", "true");
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
{
var importTypeRadioGroup = document.getElementById("importFields");
importType = importTypeRadioGroup.selectedItem.getAttribute("value");
var index = tree.selectedItems[0].getAttribute('list-index');
var module = importService.GetModule(importType, index);
var name = importService.GetModuleName(importType, index);
selectedModuleName = name;
if (module)
{
// Fix for Bug 57839 & 85219
// We use localFoldersServer(in nsIMsgAccountManager) to check if Local Folder exists.
// We need to check localFoldersServer before importing "mail" or "settings".
// Reason: We will create an account with an incoming server of type "none" after
// importing "mail", so the localFoldersServer is valid even though the Local Folder
// is not created.
if (importType == "mail" || importType == "settings")
CheckIfLocalFolderExists();
var meterText = "";
switch(importType)
{
case "mail":
top.successStr = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
if (top.successStr) {
top.successStr = top.successStr.QueryInterface( Components.interfaces.nsISupportsWString);
}
top.errorStr = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
if (top.errorStr)
top.errorStr = top.errorStr.QueryInterface( Components.interfaces.nsISupportsWString);
if (ImportMail( module, top.successStr, top.errorStr) == true)
{
// We think it was a success, either, we need to
// wait for the import to finish
// or we are done!
if (top.progressInfo.importInterface == null) {
ShowImportResults(true, 'Mail');
return( true);
}
else {
meterText = gImportMsgsBundle.getFormattedString('MailProgressMeterText',
[ name ]);
header.setAttribute("description", meterText);
progressStatusEl.setAttribute("label", "");
progressTitleEl.setAttribute("label", meterText);
deck.setAttribute("index", "2");
progressInfo.progressWindow = top.window;
progressInfo.intervalState = setInterval("ContinueImportCallback()", 100);
return( true);
}
}
else
{
ShowImportResults(false, 'Mail');
return( false);
}
break;
case "addressbook":
top.successStr = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
if (top.successStr)
top.successStr = top.successStr.QueryInterface( Components.interfaces.nsISupportsWString);
top.errorStr = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
if (top.errorStr)
top.errorStr = top.errorStr.QueryInterface( Components.interfaces.nsISupportsWString);
top.inputStr = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
if (top.inputStr)
top.inputStr = top.inputStr.QueryInterface( Components.interfaces.nsISupportsWString);
if (ImportAddress( module, top.successStr, top.errorStr) == true) {
// We think it was a success, either, we need to
// wait for the import to finish
// or we are done!
if (top.progressInfo.importInterface == null) {
ShowImportResults(true, 'Address');
return( true);
}
else {
meterText = gImportMsgsBundle.getFormattedString('MailProgressMeterText',
[ name ]);
header.setAttribute("description", meterText);
progressStatusEl.setAttribute("label", "");
progressTitleEl.setAttribute("label", meterText);
deck.setAttribute("index", "2");
progressInfo.progressWindow = top.window;
progressInfo.intervalState = setInterval("ContinueImportCallback()", 100);
return( true);
}
}
else
{
ShowImportResults(false, 'Address');
return( false);
}
break;
case "settings":
var error = new Object();
error.value = null;
var newAccount = new Object();
if (!ImportSettings( module, newAccount, error))
{
if (error.value)
ShowImportResultsRaw(gImportMsgsBundle.getString('ImportSettingsFailed'), null, false);
// the user canceled the operation, shoud we dismiss
// this dialog or not?
return false;
}
else
ShowImportResultsRaw(gImportMsgsBundle.getFormattedString('ImportSettingsSuccess', [ name ]), null, true);
break;
}
}
}
return true;
}
function SetStatusText( val)
{
var progressStatus = document.getElementById("progressStatus");
progressStatus.setAttribute( "label", val);
}
function SetProgress( val)
{
var progressMeter = document.getElementById("progressMeter");
progressMeter.setAttribute( "label", val);
}
function ContinueImportCallback()
{
progressInfo.mainWindow.ContinueImport( top.progressInfo);
}
function ImportSelectionChanged()
{
var tree = document.getElementById('moduleList');
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
{
var index = tree.selectedItems[0].getAttribute('list-index');
SetDivText('description', top.importService.GetModuleDescription(top.importType, index));
}
}
function ListModules() {
if (top.importService == null)
return;
var body = document.getElementById( "bucketBody");
var max = body.childNodes.length - 1;
while (max >= 0) {
body.removeChild( body.childNodes[max]);
max--;
}
var count = top.importService.GetModuleCount( top.importType);
for (var i = 0; i < count; i++) {
AddModuleToList( top.importService.GetModuleName( top.importType, i), i);
}
}
function AddModuleToList(moduleName, index)
{
var body = document.getElementById("bucketBody");
var item = document.createElement('treeitem');
var row = document.createElement('treerow');
var cell = document.createElement('treecell');
cell.setAttribute('label', moduleName);
item.setAttribute('list-index', index);
row.appendChild(cell);
item.appendChild(row);
body.appendChild(item);
}
function ContinueImport( info) {
var isMail = info.importType == 'mail' ? true : false;
var clear = true;
var deck;
var pcnt;
if (info.importInterface) {
if (!info.importInterface.ContinueImport()) {
info.importSuccess = false;
clearInterval( info.intervalState);
if (info.progressWindow != null) {
deck = document.getElementById("stateDeck");
deck.setAttribute("index", "3");
info.progressWindow = null;
}
ShowImportResults(false, isMail ? 'Mail' : 'Address');
}
else if ((pcnt = info.importInterface.GetProgress()) < 100) {
clear = false;
if (info.progressWindow != null) {
if (pcnt < 5)
pcnt = 5;
SetProgress( pcnt);
if (isMail) {
var mailName = info.importInterface.GetData( "currentMailbox");
if (mailName) {
mailName = mailName.QueryInterface( Components.interfaces.nsISupportsWString);
if (mailName)
SetStatusText( mailName.data);
}
}
}
}
else {
dump("*** WARNING! sometimes this shows results too early. \n");
dump(" something screwy here. this used to work fine.\n");
clearInterval( info.intervalState);
info.importSuccess = true;
if (info.progressWindow) {
deck = document.getElementById("stateDeck");
deck.setAttribute("index", "3");
info.progressWindow = null;
}
ShowImportResults(true, isMail ? 'Mail' : 'Address');
}
}
if (clear) {
info.intervalState = null;
info.importInterface = null;
}
}
function ShowResults(doesWantProgress, result)
{
if (result)
{
if (doesWantProgress)
{
var deck = document.getElementById("stateDeck");
var header = document.getElementById("header");
var progressStatusEl = document.getElementById("progressStatus");
var progressTitleEl = document.getElementById("progressTitle");
var meterText = gImportMsgsBundle.getFormattedString('MailProgressMeterText',
[ name ]);
header.setAttribute("description", meterText);
progressStatusEl.setAttribute("label", "");
progressTitleEl.setAttribute("label", meterText);
deck.setAttribute("index", "2");
progressInfo.progressWindow = top.window;
progressInfo.intervalState = setInterval("ContinueImportCallback()", 100);
}
else
{
ShowImportResults(true, 'Address');
}
}
else
{
ShowImportResults(false, 'Address');
}
return true ;
}
function ShowImportResults(good, module)
{
var modSuccess = 'Import' + module + 'Success';
var modFailed = 'Import' + module + 'Failed';
var results, title;
if (good) {
title = gImportMsgsBundle.getFormattedString(modSuccess, [ selectedModuleName ? selectedModuleName : '' ]);
results = successStr.data;
}
else if (errorStr.data) {
title = gImportMsgsBundle.getFormattedString(modFailed, [ selectedModuleName ? selectedModuleName : '' ]);
results = errorStr.data;
}
if (results && title)
ShowImportResultsRaw(title, results, good);
}
function ShowImportResultsRaw(title, results, good)
{
SetDivText("status", title);
var header = document.getElementById("header");
header.setAttribute("description", title);
dump("*** results = " + results + "\n");
attachStrings("results", results);
var deck = document.getElementById("stateDeck");
deck.setAttribute("index", "3");
var nextButton = document.getElementById("forward");
nextButton.label = nextButton.getAttribute("finishedval");
nextButton.removeAttribute("disabled");
var cancelButton = document.getElementById("cancel");
cancelButton.setAttribute("disabled", "true");
// If the Local Folder is not existed, create it after successfully
// import "mail" and "settings"
var checkLocalFolder = (top.progressInfo.importType == 'mail' || top.progressInfo.importType == 'settings') ? true : false;
if (good && checkLocalFolder && !top.progressInfo.localFolderExists) {
var messengerMigrator = Components.classes["@mozilla.org/messenger/migrator;1"].getService(Components.interfaces.nsIMessengerMigrator);
if (messengerMigrator)
messengerMigrator.createLocalMailAccount(false);
}
}
function attachStrings(aNode, aString)
{
var attachNode = document.getElementById(aNode);
if (!aString) {
attachNode.parentNode.setAttribute("hidden", "true");
return;
}
var strings = aString.split("\n");
for (var i = 0; i < strings.length; i++) {
if (strings[i]) {
var currNode = document.createTextNode(strings[i]);
attachNode.appendChild(currNode);
var br = document.createElementNS("http://www.w3.org/1999/xhtml", 'br');
attachNode.appendChild( br);
}
}
}
function ShowAddressComplete( good)
{
var str = null;
if (good == true) {
if ((top.selectedModuleName != null) && (top.selectedModuleName.length > 0))
str = gImportMsgsBundle.getFormattedString('ImportAddressSuccess', [ top.selectedModuleName ]);
else
str = gImportMsgsBundle.getFormattedString('ImportAddressSuccess', [ "" ]);
str += "\n";
str += "\n" + top.successStr.data;
}
else {
if ((top.errorStr.data != null) && (top.errorStr.data.length > 0)) {
if ((top.selectedModuleName != null) && (top.selectedModuleName.length > 0))
str = gImportMsgsBundle.getFormattedString('ImportAddressFailed', [ top.selectedModuleName ]);
else
str = gImportMsgsBundle.getFormattedString('ImportAddressFailed', [ "" ]);
str += "\n" + top.errorStr.data;
}
}
if (str != null)
alert( str);
}
function CreateNewFileSpecFromPath( inPath)
{
var file = Components.classes["@mozilla.org/filespec;1"].createInstance();
if (file != null) {
file = file.QueryInterface( Components.interfaces.nsIFileSpec);
if (file != null) {
file.nativePath = inPath;
}
}
return( file);
}
/*
Import Settings from a specific module, returns false if it failed
and true if successful. A "local mail" account is returned in newAccount.
This is only useful in upgrading - import the settings first, then
import mail into the account returned from ImportSettings, then
import address books.
An error string is returned as error.value
*/
function ImportSettings( module, newAccount, error) {
var setIntf = module.GetImportInterface( "settings");
if (setIntf != null)
setIntf = setIntf.QueryInterface( Components.interfaces.nsIImportSettings);
if (setIntf == null) {
error.value = gImportMsgsBundle.getString('ImportSettingsBadModule');
return( false);
}
// determine if we can auto find the settings or if we need to ask the user
var location = new Object();
var description = new Object();
var result = setIntf.AutoLocate( description, location);
if (result == false) {
// In this case, we couldn't not find the settings
if (location.value != null) {
// Settings were not found, however, they are specified
// in a file, so ask the user for the settings file.
var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
if (filePicker != null) {
filePicker = filePicker.QueryInterface( Components.interfaces.nsIFilePicker);
if (filePicker != null) {
var file = null;
try {
filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectSettings'), Components.interfaces.nsIFilePicker.modeOpen);
filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
filePicker.show();
if (filePicker.file && (filePicker.file.path.length > 0))
file = CreateNewFileSpecFromPath( filePicker.file.path);
else
file = null;
}
catch(ex) {
file = null;
error.value = null;
return( false);
}
if (file != null) {
setIntf.SetLocation( file);
}
else {
error.value = null;
return( false);
}
}
else {
error.value = gImportMsgsBundle.getString('ImportSettingsNotFound');
return( false);
}
}
else {
error.value = gImportMsgsBundle.getString('ImportSettingsNotFound');
return( false);
}
}
else {
error.value = gImportMsgsBundle.getString('ImportSettingsNotFound');
return( false);
}
}
// interesting, we need to return the account that new
// mail should be imported into?
// that's really only useful for "Upgrade"
result = setIntf.Import( newAccount);
if (result == false) {
error.value = gImportMsgsBundle.getString('ImportSettingsFailed');
}
return( result);
}
function CreateNewFileSpec( inFile)
{
var file = Components.classes["@mozilla.org/filespec;1"].createInstance();
if (file != null) {
file = file.QueryInterface( Components.interfaces.nsIFileSpec);
if (file != null) {
file.fromFileSpec( inFile);
}
}
return( file);
}
function ImportMail( module, success, error) {
if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
error.data = gImportMsgsBundle.getString('ImportAlreadyInProgress');
return( false);
}
top.progressInfo.importSuccess = false;
var mailInterface = module.GetImportInterface( "mail");
if (mailInterface != null)
mailInterface = mailInterface.QueryInterface( Components.interfaces.nsIImportGeneric);
if (mailInterface == null) {
error.data = gImportMsgsBundle.getString('ImportMailBadModule');
return( false);
}
var loc = mailInterface.GetData( "mailLocation");
if (loc == null) {
// No location found, check to see if we can ask the user.
if (mailInterface.GetStatus( "canUserSetLocation") != 0) {
var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
if (filePicker != null) {
filePicker = filePicker.QueryInterface( Components.interfaces.nsIFilePicker);
if (filePicker != null) {
try {
filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectMailDir'), Components.interfaces.nsIFilePicker.modeGetFolder);
filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
filePicker.show();
if (filePicker.file && (filePicker.file.path.length > 0))
mailInterface.SetData( "mailLocation", CreateNewFileSpecFromPath( filePicker.file.path));
else
return( false);
} catch( ex) {
// don't show an error when we return!
return( false);
}
}
else {
error.data = gImportMsgsBundle.getString('ImportMailNotFound');
return( false);
}
}
else {
error.data = gImportMsgsBundle.getString('ImportMailNotFound');
return( false);
}
}
else {
error.data = gImportMsgsBundle.getString('ImportMailNotFound');
return( false);
}
}
if (mailInterface.WantsProgress()) {
if (mailInterface.BeginImport( success, error, false)) {
top.progressInfo.importInterface = mailInterface;
// top.intervalState = setInterval( "ContinueImport()", 100);
return true;
}
else
return false;
}
else
return mailInterface.BeginImport( success, error, false) ? true : false;
}
// The address import! A little more complicated than the mail import
// due to field maps...
function ImportAddress( module, success, error) {
if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
error.data = gImportMsgsBundle.getString('ImportAlreadyInProgress');
return( false);
}
top.progressInfo.importSuccess = false;
addInterface = module.GetImportInterface( "addressbook");
if (addInterface != null)
addInterface = addInterface.QueryInterface( Components.interfaces.nsIImportGeneric);
if (addInterface == null) {
error.data = gImportMsgsBundle.getString('ImportAddressBadModule');
return( false);
}
var path ;
var loc = addInterface.GetStatus( "autoFind");
if (loc == false) {
loc = addInterface.GetData( "addressLocation");
if (loc != null) {
loc = loc.QueryInterface( Components.interfaces.nsIFileSpec);
if (loc != null) {
if (!loc.exists)
loc = null;
}
}
}
if (loc == null) {
// Couldn't find the address book, see if we can
// as the user for the location or not?
if (addInterface.GetStatus( "canUserSetLocation") == 0) {
// an autofind address book that could not be found!
error.data = gImportMsgsBundle.getString('ImportAddressNotFound');
return( false);
}
var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
if (filePicker != null) {
filePicker = filePicker.QueryInterface( Components.interfaces.nsIFilePicker);
if (filePicker == null) {
error.data = gImportMsgsBundle.getString('ImportAddressNotFound');
return( false);
}
}
else {
error.data = gImportMsgsBundle.getString('ImportAddressNotFound');
return( false);
}
// The address book location was not found.
// Determine if we need to ask for a directory
// or a single file.
var file = null;
if (addInterface.GetStatus( "supportsMultiple") != 0) {
// ask for dir
try {
filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectAddrDir'), Components.interfaces.nsIFilePicker.modeGetFolder);
filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
filePicker.show();
if (filePicker.file && (filePicker.file.path.length > 0))
file = filePicker.file.path;
else
file = null;
} catch( ex) {
file = null;
}
}
else {
// ask for file
try {
filePicker.init( top.window, gImportMsgsBundle.getString('ImportSelectAddrFile'), Components.interfaces.nsIFilePicker.modeOpen);
if (selectedModuleName == gImportMsgsBundle.getString('Comm4xImportName'))
filePicker.appendFilter(gImportMsgsBundle.getString('Comm4xFiles'),"*.na2");
filePicker.appendFilters( Components.interfaces.nsIFilePicker.filterAll);
filePicker.show();
if (filePicker.file && (filePicker.file.path.length > 0))
file = filePicker.file.path;
else
file = null;
} catch( ex) {
file = null;
}
}
path = filePicker.file.leafName;
if (file == null) {
return( false);
}
file = CreateNewFileSpecFromPath( file);
addInterface.SetData( "addressLocation", file);
}
// no need to use the fieldmap for 4.x import since we are using separate dialog
if (selectedModuleName == gImportMsgsBundle.getString('Comm4xImportName'))
{
var deck = document.getElementById("stateDeck");
deck.setAttribute("index", "4");
var isHomeRadioGroup = document.getElementById("homeorwork");
isHomeRadioGroup.selectedItem = document.getElementById("workRadio");
var forwardButton = document.getElementById("forward");
forwardButton.removeAttribute("disabled");
var warning = document.getElementById("warning");
var textStr = " " + path ;
warning.setAttribute ('value', textStr) ;
return false;
}
var map = addInterface.GetData( "fieldMap");
if (map != null) {
map = map.QueryInterface( Components.interfaces.nsIImportFieldMap);
if (map != null) {
var result = new Object();
result.ok = false;
top.window.openDialog(
"chrome://messenger/content/fieldMapImport.xul",
"",
"chrome,modal,titlebar",
{fieldMap: map,
addInterface: addInterface,
result: result});
}
if (result.ok == false)
return( false);
}
if (addInterface.WantsProgress()) {
if (addInterface.BeginImport( success, error, selLocIsHome)) {
top.progressInfo.importInterface = addInterface;
// top.intervalState = setInterval( "ContinueImport()", 100);
return( true);
}
else {
return( false);
}
}
else {
if (addInterface.BeginImport( success, error, selLocIsHome)) {
return( true);
}
else {
return( false);
}
}
}
function SwitchType( newType)
{
top.importType = newType;
top.progressInfo.importType = newType;
SetUpImportType();
SetDivText('description', "");
}
function next()
{
var deck = document.getElementById("stateDeck");
var index = deck.getAttribute("index");
switch (index) {
case "0":
var backButton = document.getElementById("back");
backButton.removeAttribute("disabled");
var radioGroup = document.getElementById("importFields");
SwitchType(radioGroup.value);
deck.setAttribute("index", "1");
enableAdvance();
break;
case "1":
ImportDialogOKButton();
break;
case "3":
close();
break;
case "4" :
var isHomeRadioGroup = document.getElementById("homeorwork");
if (isHomeRadioGroup.selectedItem.getAttribute("value") == "Home")
selLocIsHome = true ;
ExportComm4x() ;
break ;
}
}
function ExportComm4x()
{
var result ;
if (addInterface.WantsProgress())
{
result = addInterface.BeginImport( successStr, errorStr, selLocIsHome) ;
top.progressInfo.importInterface = addInterface;
ShowResults(true, result) ;
}
else
{
result = addInterface.BeginImport( successStr, errorStr, selLocIsHome) ;
ShowResults(false, result) ;
}
return true ;
}
function enableAdvance()
{
var tree = document.getElementById("moduleList");
var nextButton = document.getElementById("forward");
if (tree.selectedItems.length)
nextButton.removeAttribute("disabled");
else
nextButton.setAttribute("disabled", "true");
}
function back()
{
var deck = document.getElementById("stateDeck");
if (deck.getAttribute("index") == "1") {
var backButton = document.getElementById("back");
backButton.setAttribute("disabled", "true");
var nextButton = document.getElementById("forward");
nextButton.label = nextButton.getAttribute("nextval");
nextButton.removeAttribute("disabled");
deck.setAttribute("index", "0");
}
}