/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * 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 Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* * here's how this dialog works: * The main dialog contains a tree on the left (accounttree) and a * deck on the right. Each card in the deck on the right contains an * IFRAME which loads a particular preference document (such as am-main.xul) * * when the user clicks on items in the tree on the right, two things have * to be determined before the UI can be updated: * - the relevant account * - the relevant page * * when both of these are known, this is what happens: * - every form element of the previous page is saved in the account value * hashtable for the previous account * - the card containing the relevant page is brought to the front * - each form element in the page is filled in with an appropriate value * from the current account's hashtable * - in the IFRAME inside the page, if there is an onInit() method, * it is called. The onInit method can further update this page based * on values set in the previous step. */ var gSmtpHostNameIsIllegal = false; var accountArray; var gGenericAttributeTypes; var accounttree; var currentServerId; var currentPageId; var pendingServerId; var pendingPageId; var gPrefsBundle; var gBrandBundle; // services used var RDF; var accountManager; var smtpService; var nsPrefBranch; var gPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); // widgets var duplicateButton; var removeButton; var addAccountButton; var setDefaultButton; // This sets an attribute in a xul element so that we can later // know what value to substitute in a prefstring. Different // preference types set different attributes. We get the value // in the same way as the function getAccountValue() determines it. function updateElementWithKeys(account, element, type) { switch (type) { case "identity": element["identitykey"] = account.defaultIdentity.key; break; case "pop3": case "imap": case "nntp": case "server": element["serverkey"] = account.incomingServer.key; break; case "smtp": if (smtpService.defaultServer) element["serverkey"] = smtpService.defaultServer.key; break; default: // dump("unknown element type! "+type+"\n"); } } function hideShowControls(serverType) { var controls = document.getElementsByAttribute("hidefor", "*"); for (var controlNo = 0; controlNo < controls.length; controlNo++) { var control = controls[controlNo]; var hideFor = control.getAttribute("hidefor"); // Hide unsupported server types using hideFor="servertype1,servertype2". var hide = false; var hideForTokens = hideFor.split(","); for (var tokenNo = 0; tokenNo < hideForTokens.length; tokenNo++) { if (hideForTokens[tokenNo] == serverType) { hide = true; break; } } if (hide) control.setAttribute("hidden", "true"); else control.removeAttribute("hidden"); } } // called when the whole document loads // perform initialization here function onLoad() { gPrefsBundle = document.getElementById("bundle_prefs"); gBrandBundle = document.getElementById("bundle_brand"); var selectedServer; var selectPage = null; if ("arguments" in window && window.arguments[0]) { selectedServer = window.arguments[0].server; selectPage = window.arguments[0].selectPage; } accountArray = new Array; gGenericAttributeTypes = new Array; RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager); smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"].getService(Components.interfaces.nsISmtpService); accounttree = document.getElementById("accounttree"); var prefService = Components.classes["@mozilla.org/preferences-service;1"]; prefService = prefService.getService(); prefService=prefService.QueryInterface(Components.interfaces.nsIPrefService); nsPrefBranch = prefService.getBranch(null); addAccountButton = document.getElementById("addAccountButton"); duplicateButton = document.getElementById("duplicateButton"); removeButton = document.getElementById("removeButton"); setDefaultButton = document.getElementById("setDefaultButton"); sortAccountList(accounttree); setTimeout(selectServer, 0, selectedServer ? selectedServer.serverURI : "", selectPage); } function sortAccountList(accounttree) { var xulSortService = Components.classes["@mozilla.org/xul/xul-sort-service;1"].getService(Components.interfaces.nsIXULSortService); xulSortService.sort(accounttree, 'http://home.netscape.com/NC-rdf#FolderTreeName?sort=true', 'ascending'); } function selectServer(serverId, selectPage) { var selectedServer, selectedItem; if (serverId) selectedServer = document.getElementById(serverId); if (!selectedServer) selectedServer = getFirstAccount(); if (serverId && selectedServer && selectPage) selectedItem = findSelectPage(selectedServer, selectPage); if (!selectedItem) selectedItem = selectedServer; var index = accounttree.contentView.getIndexOfItem(selectedItem); accounttree.view.selection.select(index); accounttree.treeBoxObject.ensureRowIsVisible(index); var lastItem = selectedServer.lastChild.lastChild; if (lastItem.localName == "treeitem") index = accounttree.contentView.getIndexOfItem(lastItem); accounttree.treeBoxObject.ensureRowIsVisible(index); } function findSelectPage(selectServer, selectPage) { var children = selectServer.childNodes; for (i=0; i < children.length; i++) { if (children[i].localName == "treechildren") { var pageNodes = children[i].childNodes; for (j=0; j < pageNodes.length; j++) { if (pageNodes[j].localName == "treeitem") { var page = pageNodes[j].getAttribute('PageTag'); if (page == selectPage) { return pageNodes[j]; } } } } } return null; } function getFirstAccount() { var tree = document.getElementById("accounttree"); var firstItem = findFirstTreeItem(tree); return firstItem; } function findFirstTreeItem(tree) { var children = tree.childNodes; var treechildren; for (var i=0;i= 2) { var type = vals[0]; var slot = vals[1]; //dump("In checkUserServerChanges() ***: accountValues[" + type + "][" + slot + "] = " + getFormElementValue(pageElements[i]) + "/" + accountValues[type][slot] + "\n"); // if this type doesn't exist (just removed) then return. if (!(type in accountValues) || !accountValues[type]) return true; if (slot == "realHostName") { oldHost = accountValues[type][slot]; newHost = getFormElementValue(pageElements[i]); hIndx = i; } else if (slot == "realUsername") { oldUser = accountValues[type][slot]; newUser = getFormElementValue(pageElements[i]); uIndx = i; } else if (slot == "type") newType = getFormElementValue(pageElements[i]); } } } // There is no username defined for news so reset it. if (newType == "nntp") oldUser = newUser = ""; //dump("In checkUserServerChanges() *** Username = " + newUser + "/" + oldUser + "\n"); //dump("In checkUserServerChanges() *** Hostname = " + newHost + "/" + oldHost + "\n"); //dump("In checkUserServerChanges() *** Type = " + newType + "\n"); // If something is changed then check if the new user/host already exists. if ( (oldUser != newUser) || (oldHost != newHost) ) { var newServer = accountManager.findRealServer(newUser, newHost, newType, 0); if (newServer) { if (showAlert) { var alertText = gPrefsBundle.getString("modifiedAccountExists"); window.alert(alertText); } // Restore the old values before return if (newType != "nntp") setFormElementValue(pageElements[uIndx], oldUser); setFormElementValue(pageElements[hIndx], oldHost); return false; } //dump("In checkUserServerChanges() Ah, Server not found !!!" + "\n"); // If username is changed remind users to change Your Name and Email Address. // If serve name is changed and has defined filters then remind users to edit rules. if (showAlert) { var account = getAccountFromServerId(currentServerId); var filterList; if (account && (newType != "nntp")) { var server = account.incomingServer; filterList = server.getFilterList(null); } var userChangeText, serverChangeText; if ( (oldHost != newHost) && (filterList != undefined) && filterList.filterCount ) serverChangeText = gPrefsBundle.getString("serverNameChanged"); if (oldUser != newUser) userChangeText = gPrefsBundle.getString("userNameChanged"); if ( (serverChangeText != undefined) && (userChangeText != undefined) ) serverChangeText = serverChangeText + "\n\n" + userChangeText; else if (userChangeText != undefined) serverChangeText = userChangeText; if (serverChangeText != undefined) window.alert(serverChangeText); } } return true; } function onSave() { if (pendingPageId) { dump("ERROR: " + pendingPageId + " hasn't loaded yet! Not saving.\n"); return; } // make sure the current visible page is saved savePage(currentServerId); for (var accountid in accountArray) { var account = getAccountFromServerId(accountid); var accountValues = accountArray[accountid]; if (accountValues) saveAccount(accountValues, account); } } function onAddAccount() { MsgAccountWizard(); } function ReloadSmtpPanel() { var smtpUsername = top.frames["contentFrame"].document.getElementById("smtp.username"); var smtpHostname = top.frames["contentFrame"].document.getElementById("smtp.hostname"); var smtpPort = top.frames["contentFrame"].document.getElementById("smtp.port"); var smtpUseUsername = top.frames["contentFrame"].document.getElementById("smtp.useUsername"); var smtpAuthMethod = top.frames["contentFrame"].document.getElementById("smtp.authMethod"); var smtpTrySSL = top.frames["contentFrame"].document.getElementById("smtp.trySSL"); var defaultServer = smtpService.defaultServer; smtpUsername.value = defaultServer.username; smtpHostname.value = defaultServer.hostname; smtpPort.value = defaultServer.port ? defaultServer.port : ""; smtpAuthMethod.setAttribute("value", defaultServer.authMethod); if (smtpAuthMethod.getAttribute("value") == "1") smtpUseUsername.checked = true; var elements = smtpTrySSL.getElementsByAttribute("value", defaultServer.trySSL); if (!elements.item(0)) elements = smtpTrySSL.getElementsByAttribute("value", "1"); smtpTrySSL.selectedItem = elements[0]; } function onDuplicateAccount() { //dump("onDuplicateAccount\n"); if (duplicateButton.getAttribute("disabled") == "true") return; var result = getServerIdAndPageIdFromTree(accounttree); if (result) { var canDuplicate = true; var account = getAccountFromServerId(result.serverId); if (account) { var server = account.incomingServer; var type = server.type; var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + type].getService(Components.interfaces.nsIMsgProtocolInfo); canDuplicate = protocolinfo.canDuplicate; } else { canDuplicate = false; } if (canDuplicate) { try { accountManager.duplicateAccount(account); } catch (ex) { var alertText = gPrefsBundle.getString("failedDuplicateAccount"); window.alert(alertText); } } } } function onSetDefault(event) { if (event.target.getAttribute("disabled") == "true") return; var result = getServerIdAndPageIdFromTree(accounttree); if (!result) return; var account = getAccountFromServerId(result.serverId); if (!account) return; accountManager.defaultAccount = account; setEnabled(setDefaultButton, false); } function onRemoveAccount(event) { //dump("onRemoveAccount\n"); if (event.target.getAttribute("disabled") == "true") return; var result = getServerIdAndPageIdFromTree(accounttree); if (!result) return; if (result.serverId == "http://home.netscape.com/NC-rdf#PageTitleFakeAccount") { nsPrefBranch.setBoolPref("mailnews.fakeaccount.show", false); // select the default account selectServer(null, null); } var account = getAccountFromServerId(result.serverId); if (!account) return; var server = account.incomingServer; var type = server.type; var prettyName = server.prettyName; var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + type].getService(Components.interfaces.nsIMsgProtocolInfo); var canDelete = protocolinfo.canDelete; if (!canDelete) { canDelete = server.canDelete; } if (!canDelete) return; var confirmRemoveAccount = gPrefsBundle.getFormattedString("confirmRemoveAccount", [prettyName]); var confirmTitle = gPrefsBundle.getString("confirmRemoveAccountTitle"); var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. getService(Components.interfaces.nsIPromptService); if (!promptService || !promptService.confirm(window, confirmTitle, confirmRemoveAccount)) { return; } try { // clear cached data out of the account array if (accountArray[result.serverId]) delete accountArray[result.serverId]; currentServerId = currentPageId = null; accountManager.removeAccount(account); selectServer(null, null); } catch (ex) { dump("failure to remove account: " + ex + "\n"); var alertText = gPrefsBundle.getString("failedRemoveAccount"); window.alert(alertText); } } function saveAccount(accountValues, account) { var identity = null; var server = null; if (account) { identity = account.defaultIdentity; server = account.incomingServer; } for (var type in accountValues) { var typeArray = accountValues[type]; for (var slot in typeArray) { var dest; try { if (type == "identity") dest = identity; else if (type == "server") dest = server; else if (type == "pop3") dest = server.QueryInterface(Components.interfaces.nsIPop3IncomingServer); else if (type == "imap") dest = server.QueryInterface(Components.interfaces.nsIImapIncomingServer); else if (type == "none") dest = server.QueryInterface(Components.interfaces.nsINoIncomingServer); else if (type == "nntp") dest = server.QueryInterface(Components.interfaces.nsINntpIncomingServer); else if (type == "smtp") dest = smtpService.defaultServer; } catch (ex) { // don't do anything, just means we don't support that } if (dest == undefined) continue; if ((type in gGenericAttributeTypes) && (slot in gGenericAttributeTypes[type])) { switch (gGenericAttributeTypes[type][slot]) { case "int": if (dest.getIntAttribute(slot) != typeArray[slot]) dest.setIntAttribute(slot, typeArray[slot]); break; case "wstring": if (dest.getUnicharAttribute(slot) != typeArray[slot]) dest.setUnicharAttribute(slot, typeArray[slot]); break; case "string": if (dest.getCharAttribute(slot) != typeArray[slot]) dest.setCharAttribute(slot, typeArray[slot]); break; case "bool": // in some cases // like for radiogroups of type boolean // the value will be "false" instead of false // we need to convert it. if (typeArray[slot] == "false") typeArray[slot] = false; else if (typeArray[slot] == "true") typeArray[slot] = true; if (dest.getBoolAttribute(slot) != typeArray[slot]) dest.setBoolAttribute(slot, typeArray[slot]); break; default: dump("unexpected preftype: " + preftype + "\n"); break; } } else { if (slot in dest && typeArray[slot] != undefined && dest[slot] != typeArray[slot]) { try { dest[slot] = typeArray[slot]; } catch (ex) { // hrm... need to handle special types here } } } } } // if we made account changes to the spam settings, we'll need to re-initialize // our settings object if (server && server.spamSettings) server.spamSettings.initialize(server); } function updateButtons(tree,serverId) { var canCreate = true; var canDuplicate = true; var canDelete = true; var canSetDefault = true; //dump("updateButtons\n"); //dump("serverId = " + serverId + "\n"); var account = getAccountFromServerId(serverId); //dump("account = " + account + "\n"); if (account) { var server = account.incomingServer; var type = server.type; if (account == accountManager.defaultAccount || !server.canBeDefaultServer || account.identities.Count() < 1) canSetDefault = false; //dump("servertype = " + type + "\n"); var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + type].getService(Components.interfaces.nsIMsgProtocolInfo); canDuplicate = protocolinfo.canDuplicate; canDelete = protocolinfo.canDelete; if (!canDelete) { canDelete = server.canDelete; } } else { // HACK // if account is null, we have either selected a SMTP server, or there is a problem // either way, we don't want the user to be able to delete it or duplicate it canSetDefault = false; canDelete = (serverId == "http://home.netscape.com/NC-rdf#PageTitleFakeAccount"); canDuplicate = false; } if (tree.view.selection.count < 1) canDuplicate = canSetDefault = canDelete = false; // check for disabled preferences on the account buttons. // Not currently handled by WSM or the main loop yet since these buttons aren't // under the IFRAME if (nsPrefBranch.prefIsLocked(addAccountButton.getAttribute("prefstring"))) canCreate = false; if (nsPrefBranch.prefIsLocked(setDefaultButton.getAttribute("prefstring"))) canSetDefault = false; if (nsPrefBranch.prefIsLocked(removeButton.getAttribute("prefstring"))) canDelete = false; setEnabled(addAccountButton, canCreate); setEnabled(duplicateButton, canDuplicate); setEnabled(setDefaultButton, canSetDefault); setEnabled(removeButton, canDelete); } function setEnabled(control, enabled) { if (!control) return; if (enabled) control.removeAttribute("disabled"); else control.setAttribute("disabled", true); } // // Called when someone clicks on an account. Figure out context by what they // clicked on. This is also called when an account is removed. In this case, // nothing is selected. // function onAccountClick(tree) { var currentSelection = getServerIdAndPageIdFromTree(tree); // Nothing is selected. This is the case when an account was removed. // A call of selectServer(null,null) after the removal ensures that // onAccountClick() is called again after that with a valid selection. if (!currentSelection) return; if (showPage(currentSelection.serverId, currentSelection.pageId)) updateButtons(tree, currentSelection.serverId); } // show the page for the given server: // - save the old values // - start loading the new page function showPage(serverId, pageId) { if (pageId == currentPageId && serverId == currentServerId) return false; // check if user/host names have been changed checkUserServerChanges(false); if (gSmtpHostNameIsIllegal) { gSmtpHostNameIsIllegal = false; selectServer(currentServerId, currentPageId); return false; } // save the previous page savePage(currentServerId); var changeServerId = (serverId != currentServerId); // loading a complete different page if (pageId != currentPageId) { // prevent overwriting with bad stuff currentServerId = currentPageId = null; pendingServerId=serverId; pendingPageId=pageId; loadPage(pageId); } // same page, different server else if (changeServerId) { restorePage(pageId, serverId); } return changeServerId; } // page has loaded function onPanelLoaded(pageId) { if (pageId != pendingPageId) { // if we're reloading the current page, we'll assume the // page has asked itself to be completely reloaded from // the prefs. to do this, clear out the the old entry in // the account data, and then restore theh page if (pageId == currentPageId) { clearAccountData(currentServerId, currentPageId); restorePage(currentPageId, currentServerId); } } else { restorePage(pendingPageId, pendingServerId); } // probably unnecessary, but useful for debugging pendingServerId = null; pendingPageId = null; } function loadPage(pageId) { var chromePackageName; try { // we could compare against "main","server","copies","offline","addressing", // "smtp","advanced", and "fakeaccount" first to save the work, but don't // as some of these might be turned into extensions (for thunderbird) chromePackageName = accountManager.getChromePackageName(pageId.split("am-")[1].split(".xul")[0]); } catch (ex) { chromePackageName = "messenger"; } const LOAD_FLAGS_NONE = Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE; document.getElementById("contentFrame").webNavigation.loadURI("chrome://" + chromePackageName + "/content/" + pageId, LOAD_FLAGS_NONE, null, null, null); } // // save the values of the widgets to the given server // function savePage(serverId) { if (!serverId) return; // tell the page that it's about to save if ("onSave" in top.frames["contentFrame"]) top.frames["contentFrame"].onSave(); var accountValues = getValueArrayFor(serverId); if (!accountValues) return; var pageElements = getPageFormElements(); if (!pageElements) return; // store the value in the account for (var i=0; i= 2) { var type = vals[0]; var slot = vals[1]; setAccountValue(accountValues, type, slot, getFormElementValue(pageElements[i])); } } } } function setAccountValue(accountValues, type, slot, value) { if (!(type in accountValues)) accountValues[type] = new Array; //dump("Form->Array: accountValues[" + type + "][" + slot + "] = " + value + "\n"); accountValues[type][slot] = value; } function getAccountValue(account, accountValues, type, slot, preftype, isGeneric) { if (!(type in accountValues)) accountValues[type] = new Array; // fill in the slot from the account if necessary if (!(slot in accountValues[type]) || accountValues[type][slot] == undefined) { // dump("Array->Form: lazily reading in the " + slot + " from the " + type + "\n"); var server; if (account) server= account.incomingServer; var source = null; try { if (type == "identity") source = account.defaultIdentity; else if (type == "server") source = account.incomingServer; else if (type == "pop3") source = server.QueryInterface(Components.interfaces.nsIPop3IncomingServer); else if (type == "imap") source = server.QueryInterface(Components.interfaces.nsIImapIncomingServer); else if (type == "none") source = server.QueryInterface(Components.interfaces.nsINoIncomingServer); else if (type == "nntp") source = server.QueryInterface(Components.interfaces.nsINntpIncomingServer); else if (type == "smtp") source = smtpService.defaultServer; } catch (ex) { } if (source) { if (isGeneric) { if (!(type in gGenericAttributeTypes)) gGenericAttributeTypes[type] = new Array; // we need the preftype later, for setting when we save. gGenericAttributeTypes[type][slot] = preftype; switch (preftype) { case "int": accountValues[type][slot] = source.getIntAttribute(slot); break; case "wstring": accountValues[type][slot] = source.getUnicharAttribute(slot); break; case "string": accountValues[type][slot] = source.getCharAttribute(slot); break; case "bool": accountValues[type][slot] = source.getBoolAttribute(slot); break; default: dump("unexpected preftype: " + preftype + "\n"); break; } } else if (slot in source) { accountValues[type][slot] = source[slot]; } else { accountValues[type][slot] = null; } } else { accountValues[type][slot] = null; } } var value = accountValues[type][slot]; //dump("Array->Form: accountValues[" + type + "][" + slot + "] = " + value + "\n"); return value; } // // restore the values of the widgets from the given server // function restorePage(pageId, serverId) { if (!serverId) return; var accountValues = getValueArrayFor(serverId); if (!accountValues) return; var pageElements = getPageFormElements(); if (!pageElements) return; var account = getAccountFromServerId(serverId); if ("onPreInit" in top.frames["contentFrame"]) top.frames["contentFrame"].onPreInit(account, accountValues); // restore the value from the account for (var i=0; i= 2) { var type = vals[0]; var slot = vals[1]; // buttons are lockable, but don't have any data so we skip that part. // elements that do have data, we get the values at poke them in. if (pageElements[i].localName != "button") { var value = getAccountValue(account, accountValues, type, slot, pageElements[i].getAttribute("preftype"), (pageElements[i].getAttribute("genericattr") == "true")); setFormElementValue(pageElements[i], value); } updateElementWithKeys(account,pageElements[i],type); var isLocked = getAccountValueIsLocked(pageElements[i]); setEnabled(pageElements[i],!isLocked); } } } // tell the page that new values have been loaded if ("onInit" in top.frames["contentFrame"]) top.frames["contentFrame"].onInit(pageId, serverId); // everything has succeeded, vervied by setting currentPageId currentPageId = pageId; currentServerId = serverId; } // // gets the value of a widget // function getFormElementValue(formElement) { try { var type = formElement.localName; if (type=="checkbox") { if (formElement.getAttribute("reversed")) return !formElement.checked; return formElement.checked; } if (type == "textbox" && formElement.getAttribute("datatype") == "nsIFileSpec") { if (formElement.value) { var filespec = Components.classes["@mozilla.org/filespec;1"].createInstance(Components.interfaces.nsIFileSpec); filespec.unicodePath = formElement.value; return filespec; } return null; } if (type == "textbox" && formElement.getAttribute("datatype") == "nsILocalFile") { if (formElement.value) { var localfile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); localfile.initWithPath(formElement.value); return localfile; } return null; } if (type == "text") { var val = formElement.getAttribute("value"); if (val) return val; return null; } if ("value" in formElement) { return formElement.value; } return null; } catch (ex) { dump("getFormElementValue failed, ex="+ex+"\n"); } return null; } // // sets the value of a widget // function setFormElementValue(formElement, value) { //formElement.value = formElement.defaultValue; // formElement.checked = formElement.defaultChecked; var type = formElement.localName; if (type == "checkbox") { if (value == undefined) { if ("defaultChecked" in formElement && formElement.defaultChecked) formElement.checked = formElement.defaultChecked; else formElement.checked = false; } else { if (formElement.getAttribute("reversed")) formElement.checked = !value; else formElement.checked = value; } } else if (type == "radiogroup" || type =="menulist") { var selectedItem; if (value == undefined) { if (type == "radiogroup") selectedItem = formElement.firstChild; else selectedItem = formElement.firstChild.firstChild; } else selectedItem = formElement.getElementsByAttribute("value", value)[0]; formElement.selectedItem = selectedItem; } // handle nsIFileSpec else if (type == "textbox" && formElement.getAttribute("datatype") == "nsIFileSpec") { if (value) { var filespec = value.QueryInterface(Components.interfaces.nsIFileSpec); try { formElement.value = filespec.unicodePath; } catch (ex) { dump("Still need to fix uninitialized filespec problem!\n"); } } else { if ("defaultValue" in formElement) formElement.value = formElement.defaultValue; else formElement.value = ""; } } else if (type == "textbox" && formElement.getAttribute("datatype") == "nsILocalFile") { if (value) { var localfile = value.QueryInterface(Components.interfaces.nsILocalFile); try { formElement.value = localfile.path; } catch (ex) { dump("Still need to fix uninitialized nsIFile problem!\n"); } } else { if ("defaultValue" in formElement) formElement.value = formElement.defaultValue; else formElement.value = ""; } } else if (type == "text") { if (value == null || value == undefined) formElement.removeAttribute("value"); else formElement.setAttribute("value",value); } // let the form figure out what to do with it else { if (value == undefined) { if ("defaultValue" in formElement && formElement.defaultValue) formElement.value = formElement.defaultValue; } else formElement.value = value; } } // // conversion routines - get data associated // with a given pageId, serverId, etc // // helper routine for account manager panels to get the current account for the selected server function getCurrentAccount() { var result = getServerIdAndPageIdFromTree(accounttree); return getAccountFromServerId(result.serverId); } // // get the account associated with this serverId // function getAccountFromServerId(serverId) { // get the account by dipping into RDF and then into the acount manager var serverResource = RDF.GetResource(serverId); try { var serverFolder = serverResource.QueryInterface(Components.interfaces.nsIMsgFolder); var incomingServer = serverFolder.server; var account = accountManager.FindAccountForServer(incomingServer); return account; } catch (ex) { } return null; } // // get the array of form elements for the given page // function getPageFormElements() { try { if("getElementsByAttribute" in top.frames["contentFrame"].document) { var pageElements = top.frames["contentFrame"].document.getElementsByAttribute("wsm_persist", "true"); return pageElements; } } catch (ex) { dump("getPageFormElements() failed: " + ex + "\n"); } return null; } // // get the value array for the given serverId // function getValueArrayFor(serverId) { if (serverId == undefined) serverId="global"; if (!(serverId in accountArray)) { accountArray[serverId] = new Array; } return accountArray[serverId]; } function clearAccountData(serverId, pageId) { accountArray[serverId] = null; } function getServerIdAndPageIdFromTree(tree) { var serverId = null; if (tree.view.selection.count < 1) return null; var node = tree.contentView.getItemAtIndex(tree.currentIndex); // get the page to load // (stored in the PageTag attribute of this node) var pageId = node.getAttribute('PageTag'); // get the server's Id // (stored in the Id attribute of the server node) var servernode = node.parentNode.parentNode; // for toplevel treeitems, we just use the current treeitem // dump("servernode is " + servernode + "\n"); if (servernode.localName != "treeitem") { servernode = node; } return {"serverId": servernode.id, "pageId": pageId } }