pjs/mailnews/addrbook/resources/content/addressbook.js

874 строки
27 KiB
JavaScript

/* ***** 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 Addressbook.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corp.
* Portions created by the Initial Developer are Copyright (C) 1999-2001
* the Initial Developer. All Rights Reserved.
*
* Original Author:
* Paul Hangas <hangas@netscape.com>
*
* Contributor(s):
* Seth Spitzer <sspitzer@netscape.com>
* Mark Banner <mark@standard8.demon.co.uk>
*
* Alternatively, the contents of this file may be used under the terms of
* either 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 ***** */
var cvPrefs = 0;
var addressbook = 0;
var gSearchTimer = null;
var gStatusText = null;
var gQueryURIFormat = null;
var gSearchInput;
var gPrintSettings = null;
var gDirTree;
var gSearchBox;
var gCardViewBox;
var gCardViewBoxEmail1;
var gPreviousDirTreeIndex = -1;
// Constants that correspond to choices
// in Address Book->View -->Show Name as
const kDisplayName = 0;
const kLastNameFirst = 1;
const kFirstNameFirst = 2;
const kLDAPDirectory = 0; // defined in nsDirPrefs.h
const kPABDirectory = 2; // defined in nsDirPrefs.h
const kPrefOnlineCheckAllowed = "mail.addr_book.im.onlineCheckAllowed";
// Note: We need to keep this listener as it does not just handle dir
// pane deletes but also deletes of address books and lists from places like
// the sidebar and LDAP preference pane.
var gAddressBookAbListener = {
onItemAdded: function(parentDir, item) {
// will not be called
},
onItemRemoved: function(parentDir, item) {
// will only be called when an addressbook is deleted
try {
// If we don't have a record of the previous selection, the only
// option is to select the first.
if (gPreviousDirTreeIndex == -1) {
SelectFirstAddressBook();
}
else {
// Don't reselect if we already have a valid selection, this may be
// the case if items are being removed via other methods, e.g. sidebar,
// LDAP preference pane etc.
if (dirTree.currentIndex == -1) {
var directory = item.QueryInterface(Components.interfaces.nsIAbDirectory);
// If we are a mail list, move the selection up the list before
// trying to find the parent. This way we'll end up selecting the
// parent address book when we remove a mailing list.
//
// For simple address books we don't need to move up the list, as
// we want to select the next one upon removal.
if (directory.isMailList && gPreviousDirTreeIndex > 0)
--gPreviousDirTreeIndex;
// Now get the parent of the row.
var newRow = dirTree.view.getParentIndex(gPreviousDirTreeIndex);
// if we have no parent (i.e. we are an address book), use the
// previous index.
if (newRow == -1)
newRow = gPreviousDirTreeIndex;
// Fall back to the first adddress book if we're not in a valid range
if (newRow >= dirTree.view.rowCount)
newRow = 0;
// Now select the new item.
dirTree.view.selection.select(newRow);
}
}
}
catch (ex) {
}
},
onItemPropertyChanged: function(item, property, oldValue, newValue) {
// will not be called
}
};
function OnUnloadAddressBook()
{
var addrbookSession =
Components.classes["@mozilla.org/addressbook/services/session;1"]
.getService(Components.interfaces.nsIAddrBookSession);
addrbookSession.removeAddressBookListener(gAddressBookAbListener);
RemovePrefObservers();
CloseAbView();
}
var gAddressBookAbViewListener = {
onSelectionChanged: function() {
ResultsPaneSelectionChanged();
},
onCountChanged: function(total) {
SetStatusText(total);
}
};
function GetAbViewListener()
{
return gAddressBookAbViewListener;
}
const kPrefMailAddrBookLastNameFirst = "mail.addr_book.lastnamefirst";
var gMailAddrBookLastNameFirstObserver = {
observe: function(subject, topic, value) {
if (topic == "nsPref:changed" && value == kPrefMailAddrBookLastNameFirst) {
UpdateCardView();
}
}
}
function AddPrefObservers()
{
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
var prefBranch = prefService.getBranch(null).QueryInterface(Components.interfaces.nsIPrefBranch2);
prefBranch.addObserver(kPrefMailAddrBookLastNameFirst, gMailAddrBookLastNameFirstObserver, false);
}
function RemovePrefObservers()
{
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
var prefBranch = prefService.getBranch(null).QueryInterface(Components.interfaces.nsIPrefBranch2);
prefBranch.removeObserver(kPrefMailAddrBookLastNameFirst, gMailAddrBookLastNameFirstObserver);
}
function OnLoadAddressBook()
{
gSearchInput = document.getElementById("searchInput");
verifyAccounts(null); // this will do migration, if we need to.
top.addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
InitCommonJS();
UpgradeAddressBookResultsPaneUI("mailnews.ui.addressbook_results.version");
GetCurrentPrefs();
AddPrefObservers();
// FIX ME - later we will be able to use onload from the overlay
OnLoadCardView();
SetupAbCommandUpdateHandlers();
//workaround - add setTimeout to make sure dynamic overlays get loaded first
setTimeout('OnLoadDirTree()', 0);
// if the pref is locked disable the menuitem New->LDAP directory
if (gPrefs.prefIsLocked("ldap_2.disable_button_add"))
document.getElementById("addLDAP").setAttribute("disabled", "true");
// add a listener, so we can switch directories if
// the current directory is deleted
var addrbookSession =
Components.classes["@mozilla.org/addressbook/services/session;1"]
.getService(Components.interfaces.nsIAddrBookSession);
// this listener cares when a directory (= address book), or a directory item
// is/are removed. In the case of directory items, we are only really
// interested in mailing list changes and not cards but we have to have both.
addrbookSession.addAddressBookListener(
gAddressBookAbListener,
Components.interfaces.nsIAddrBookSession.directoryRemoved |
Components.interfaces.nsIAddrBookSession.directoryItemRemoved);
var dirTree = GetDirTree();
dirTree.addEventListener("click",DirPaneClick,true);
// Ensure we don't load xul error pages into the main window
window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShell)
.useErrorPages = false;
}
function OnLoadDirTree() {
var treeBuilder = dirTree.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder);
treeBuilder.addObserver(abDirTreeObserver);
SelectFirstAddressBook();
}
function GetCurrentPrefs()
{
// prefs
if ( cvPrefs == 0 )
cvPrefs = new Object;
cvPrefs.prefs = gPrefs;
// check "Show Name As" menu item based on pref
var menuitemID;
switch (gPrefs.getIntPref("mail.addr_book.lastnamefirst"))
{
case kFirstNameFirst:
menuitemID = 'firstLastCmd';
break;
case kLastNameFirst:
menuitemID = 'lastFirstCmd';
break;
case kDisplayName:
default:
menuitemID = 'displayNameCmd';
break;
}
var menuitem = top.document.getElementById(menuitemID);
if ( menuitem )
menuitem.setAttribute('checked', 'true');
// initialize phonetic
var showPhoneticFields =
gPrefs.getComplexValue("mail.addr_book.show_phonetic_fields",
Components.interfaces.nsIPrefLocalizedString).data;
// show phonetic fields if indicated by the pref
if (showPhoneticFields == "true")
document.getElementById("cmd_SortBy_PhoneticName")
.setAttribute("hidden", "false");
document.getElementById("menu_allow_online_check")
.setAttribute("checked", gPrefs.getBoolPref(kPrefOnlineCheckAllowed));
}
function SetNameColumn(cmd)
{
var prefValue;
switch ( cmd )
{
case 'firstLastCmd':
prefValue = kFirstNameFirst;
break;
case 'lastFirstCmd':
prefValue = kLastNameFirst;
break;
case 'displayNameCmd':
prefValue = kDisplayName;
break;
}
cvPrefs.prefs.setIntPref("mail.addr_book.lastnamefirst", prefValue);
}
function CommandUpdate_AddressBook()
{
goUpdateCommand('cmd_delete');
goUpdateCommand('button_delete');
goUpdateCommand('cmd_newlist');
}
function ResultsPaneSelectionChanged()
{
UpdateCardView();
}
function UpdateCardView()
{
var cards = GetSelectedAbCards();
// display the selected card, if exactly one card is selected.
// either no cards, or more than one card is selected, clear the pane.
if (cards.length == 1)
OnClickedCard(cards[0])
else
ClearCardViewPane();
}
function OnClickedCard(card)
{
if (card)
DisplayCardViewPane(card);
else
ClearCardViewPane();
}
function AbClose()
{
top.close();
}
function AbNewLDAPDirectory()
{
window.openDialog("chrome://messenger/content/addressbook/pref-directory-add.xul",
"",
"chrome,modal=yes,resizable=no,centerscreen",
null);
}
function AbNewAddressBook()
{
var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
getService(Components.interfaces.nsIStringBundleService);
var bundle = strBundleService.createBundle("chrome://messenger/locale/addressbook/addressBook.properties");
var dialogTitle = bundle.GetStringFromName('newAddressBookTitle');
var dialog = window.openDialog(
"chrome://messenger/content/addressbook/abAddressBookNameDialog.xul",
"", "chrome,modal=yes,resizable=no,centerscreen", {title: dialogTitle, okCallback:AbOnCreateNewAddressBook});
}
function AbRenameAddressBook()
{
var selectedABURI = GetSelectedDirectory();
// the rdf service
var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
// the RDF resource URI for LDAPDirectory will be like: "moz-abmdbdirectory://abook-3.mab"
var selectedABDirectory = RDF.GetResource(selectedABURI).QueryInterface(Components.interfaces.nsIAbDirectory);
var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
getService(Components.interfaces.nsIStringBundleService);
var bundle = strBundleService.createBundle("chrome://messenger/locale/addressbook/addressBook.properties");
var dialogTitle = bundle.GetStringFromName('renameAddressBookTitle');
// you can't rename the PAB or the CAB
var canRename = (selectedABURI != kCollectedAddressbookURI && selectedABURI != kPersonalAddressbookURI);
var dialog = window.openDialog(
"chrome://messenger/content/addressbook/abAddressBookNameDialog.xul",
"", "chrome,modal=yes,resizable=no,centerscreen", {title: dialogTitle, canRename: canRename, name: selectedABDirectory.directoryProperties.description,
okCallback:AbOnRenameAddressBook});
}
function AbOnCreateNewAddressBook(aName)
{
var properties = Components.classes["@mozilla.org/addressbook/properties;1"].createInstance(Components.interfaces.nsIAbDirectoryProperties);
properties.description = aName;
properties.dirType = kPABDirectory;
top.addressbook.newAddressBook(properties);
}
function AbOnRenameAddressBook(aName)
{
// When the UI code for renaming addrbooks (bug #17230) is ready, just
// change 'properties.description' setting below and it should just work.
// get select ab
var selectedABURI = GetSelectedDirectory();
//dump("In AbRenameAddressBook() selectedABURI=" + selectedABURI + "\n");
// the rdf service
var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
// get the datasource for the addressdirectory
var addressbookDS = RDF.GetDataSource("rdf:addressdirectory");
// moz-abdirectory:// is the RDF root to get all types of addressbooks.
var parentDir = RDF.GetResource("moz-abdirectory://").QueryInterface(Components.interfaces.nsIAbDirectory);
// the RDF resource URI for LDAPDirectory will be like: "moz-abmdbdirectory://abook-3.mab"
var selectedABDirectory = RDF.GetResource(selectedABURI).QueryInterface(Components.interfaces.nsIAbDirectory);
// Copy existing property items so they won't get reset.
var oldProperties = selectedABDirectory.directoryProperties;
// Create and fill in properties info
var properties = Components.classes["@mozilla.org/addressbook/properties;1"].createInstance(Components.interfaces.nsIAbDirectoryProperties);
properties.URI = selectedABURI;
properties.dirType = oldProperties.dirType;
properties.description = aName;
// Now do the modification.
addressbook.modifyAddressBook(addressbookDS, parentDir, selectedABDirectory, properties);
}
function AbPrintCardInternal(doPrintPreview, msgType)
{
var selectedItems = GetSelectedAbCards();
var numSelected = selectedItems.length;
if (!numSelected)
return;
var addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
var uri = GetSelectedDirectory();
if (!uri)
return;
var statusFeedback;
statusFeedback = Components.classes["@mozilla.org/messenger/statusfeedback;1"].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
var selectionArray = new Array(numSelected);
var totalCard = 0;
for (var i = 0; i < numSelected; i++)
{
var card = selectedItems[i];
var printCardUrl = CreatePrintCardUrl(card);
if (printCardUrl)
{
selectionArray[totalCard++] = printCardUrl;
}
}
if (!gPrintSettings)
{
gPrintSettings = PrintUtils.getPrintSettings();
}
printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
"",
"chrome,dialog=no,all",
totalCard, selectionArray, statusFeedback,
gPrintSettings, doPrintPreview, msgType);
return;
}
function AbPrintCard()
{
AbPrintCardInternal(false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_AB_CARD);
}
function AbPrintPreviewCard()
{
AbPrintCardInternal(true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_AB_CARD);
}
function CreatePrintCardUrl(card)
{
var url = "data:application/xml;base64," + card.convertToBase64EncodedXML();
return url;
}
function AbPrintAddressBookInternal(doPrintPreview, msgType)
{
var addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
var uri = GetSelectedDirectory();
if (!uri)
return;
var statusFeedback;
statusFeedback = Components.classes["@mozilla.org/messenger/statusfeedback;1"].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
/*
turn "moz-abmdbdirectory://abook.mab" into
"addbook://moz-abmdbdirectory/abook.mab?action=print"
*/
var abURIArr = uri.split("://");
var printUrl = "addbook://" + abURIArr[0] + "/" + abURIArr[1] + "?action=print"
if (!gPrintSettings) {
gPrintSettings = PrintUtils.getPrintSettings();
}
printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
"",
"chrome,dialog=no,all",
1, [printUrl], statusFeedback, gPrintSettings, doPrintPreview, msgType);
return;
}
function AbPrintAddressBook()
{
AbPrintAddressBookInternal(false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_ADDRBOOK);
}
function AbPrintPreviewAddressBook()
{
AbPrintAddressBookInternal(true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_ADDRBOOK);
}
function AbExport()
{
try {
var selectedABURI = GetSelectedDirectory();
if (!selectedABURI) return;
var directory = GetDirectoryFromURI(selectedABURI);
addressbook.exportAddressBook(window, directory);
}
catch (ex) {
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
if (promptService) {
var message;
switch (ex.result) {
case Components.results.NS_ERROR_FILE_ACCESS_DENIED:
message = gAddressBookBundle.getString("failedToExportMessageFileAccessDenied");
break;
case Components.results.NS_ERROR_FILE_NO_DEVICE_SPACE:
message = gAddressBookBundle.getString("failedToExportMessageNoDeviceSpace");
break;
default:
message = ex.message;
break;
}
promptService.alert(window,
gAddressBookBundle.getString("failedToExportTitle"),
message);
}
}
}
function AbDeleteDirectory()
{
var selectedABURI = GetSelectedDirectory();
if (!selectedABURI)
return;
var parentArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
if (!parentArray)
return;
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
var parentRow = dirTree.view.getParentIndex(dirTree.currentIndex);
var parentId = (parentRow == -1) ? "moz-abdirectory://" : dirTree.builderView.getResourceAtIndex(parentRow).Value;
var parentDir = GetDirectoryFromURI(parentId);
parentArray.AppendElement(parentDir);
var directory = GetDirectoryFromURI(selectedABURI);
var confirmDeleteMessage;
var clearPrefsRequired = false;
if (directory.isMailList)
confirmDeleteMessage = gAddressBookBundle.getString("confirmDeleteMailingList");
else {
// Check if this address book is being used for collection
if (gPrefs.getCharPref("mail.collect_addressbook") == selectedABURI &&
(gPrefs.getBoolPref("mail.collect_email_address_outgoing") ||
gPrefs.getBoolPref("mail.collect_email_address_incoming") ||
gPrefs.getBoolPref("mail.collect_email_address_newsgroup"))) {
var brandShortName = document.getElementById("bundle_brand").getString("brandShortName");
confirmDeleteMessage = gAddressBookBundle.getFormattedString("confirmDeleteCollectionAddressbook", [brandShortName]);
clearPrefsRequired = true;
}
else {
confirmDeleteMessage = gAddressBookBundle.getString("confirmDeleteAddressbook");
}
}
if (!promptService.confirm(window,
gAddressBookBundle.getString(
directory.isMailList ?
"confirmDeleteMailingListTitle" :
"confirmDeleteAddressbookTitle"),
confirmDeleteMessage))
return;
// First clear all the prefs if required
if (clearPrefsRequired) {
gPrefs.setBoolPref("mail.collect_email_address_outgoing", false);
gPrefs.setBoolPref("mail.collect_email_address_incoming", false);
gPrefs.setBoolPref("mail.collect_email_address_newsgroup", false);
// Also reset the displayed value so that we don't get a blank item in the
// prefs dialog if it gets enabled.
gPrefs.setCharPref("mail.collect_addressbook", kPersonalAddressbookURI);
}
var resourceArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
var selectedABResource = GetDirectoryFromURI(selectedABURI).QueryInterface(Components.interfaces.nsIRDFResource);
resourceArray.AppendElement(selectedABResource);
top.addressbook.deleteAddressBooks(dirTree.database, parentArray, resourceArray);
}
function SetStatusText(total)
{
if (!gStatusText)
gStatusText = document.getElementById('statusText');
try {
var statusText;
if (gSearchInput.value) {
if (total == 0)
statusText = gAddressBookBundle.getString("noMatchFound");
else
{
if (total == 1)
statusText = gAddressBookBundle.getString("matchFound");
else
statusText = gAddressBookBundle.getFormattedString("matchesFound", [total]);
}
}
else
statusText = gAddressBookBundle.getFormattedString("totalCardStatus", [gAbView.directory.dirName, total]);
gStatusText.setAttribute("label", statusText);
}
catch(ex) {
dump("failed to set status text: " + ex + "\n");
}
}
function AbResultsPaneDoubleClick(card)
{
AbEditCard(card);
}
function onAdvancedAbSearch()
{
var selectedABURI = GetSelectedDirectory();
if (!selectedABURI) return;
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].
getService(Components.interfaces.nsIWindowMediator);
var existingSearchWindow = windowManager.getMostRecentWindow("mailnews:absearch");
if (existingSearchWindow)
existingSearchWindow.focus();
else
window.openDialog("chrome://messenger/content/ABSearchDialog.xul", "",
"chrome,resizable,status,centerscreen,dialog=no",
{directory: selectedABURI});
}
function onEnterInSearchBar()
{
ClearCardViewPane();
if (!gQueryURIFormat)
gQueryURIFormat = gPrefs.getComplexValue("mail.addr_book.quicksearchquery.format",
Components.interfaces.nsIPrefLocalizedString).data;
var searchURI = GetSelectedDirectory();
if (!searchURI) return;
/*
XXX todo, handle the case where the LDAP url
already has a query, like
moz-abldapdirectory://nsdirectory.netscape.com:389/ou=People,dc=netscape,dc=com?(or(Department,=,Applications))
*/
if (gSearchInput.value != "") {
// replace all instances of @V with the escaped version
// of what the user typed in the quick search text input
searchURI += gQueryURIFormat.replace(/@V/g, encodeURIComponent(gSearchInput.value));
}
SetAbView(searchURI, gSearchInput.value != "");
// XXX todo
// this works for synchronous searches of local addressbooks,
// but not for LDAP searches
SelectFirstCard();
}
function SwitchPaneFocus(event)
{
var focusedElement = WhichPaneHasFocus();
var cardViewBox = GetCardViewBox();
var cardViewBoxEmail1 = GetCardViewBoxEmail1();
var searchBox = GetSearchBox();
var dirTree = GetDirTree();
var searchInput = GetSearchInput();
if (event && event.shiftKey)
{
if (focusedElement == gAbResultsTree && searchBox.getAttribute('hidden') != 'true')
searchInput.focus();
else if ((focusedElement == gAbResultsTree || focusedElement == searchBox) && !IsDirPaneCollapsed())
dirTree.focus();
else if (focusedElement != cardViewBox && !IsCardViewAndAbResultsPaneSplitterCollapsed())
{
if(cardViewBoxEmail1)
cardViewBoxEmail1.focus();
else
cardViewBox.focus();
}
else
gAbResultsTree.focus();
}
else
{
if (focusedElement == searchBox)
gAbResultsTree.focus();
else if (focusedElement == gAbResultsTree && !IsCardViewAndAbResultsPaneSplitterCollapsed())
{
if(cardViewBoxEmail1)
cardViewBoxEmail1.focus();
else
cardViewBox.focus();
}
else if (focusedElement != dirTree && !IsDirPaneCollapsed())
dirTree.focus();
else if (searchBox.getAttribute('hidden') != 'true')
searchInput.focus();
else
gAbResultsTree.focus();
}
}
function WhichPaneHasFocus()
{
var cardViewBox = GetCardViewBox();
var searchBox = GetSearchBox();
var dirTree = GetDirTree();
var currentNode = top.document.commandDispatcher.focusedElement;
while (currentNode)
{
var nodeId = currentNode.getAttribute('id');
if(currentNode == gAbResultsTree ||
currentNode == cardViewBox ||
currentNode == searchBox ||
currentNode == dirTree)
return currentNode;
currentNode = currentNode.parentNode;
}
return null;
}
function GetDirTree()
{
if (!gDirTree)
gDirTree = document.getElementById('dirTree');
return gDirTree;
}
function GetSearchInput()
{
if (!gSearchInput)
gSearchInput = document.getElementById('searchInput');
return gSearchInput;
}
function GetSearchBox()
{
if (!gSearchBox)
gSearchBox = document.getElementById('searchBox');
return gSearchBox;
}
function GetCardViewBox()
{
if (!gCardViewBox)
gCardViewBox = document.getElementById('CardViewBox');
return gCardViewBox;
}
function GetCardViewBoxEmail1()
{
if (!gCardViewBoxEmail1)
{
try {
gCardViewBoxEmail1 = document.getElementById('cvEmail1');
}
catch (ex) {
gCardViewBoxEmail1 = null;
}
}
return gCardViewBoxEmail1;
}
function IsDirPaneCollapsed()
{
var dirPaneBox = GetDirTree().parentNode;
return dirPaneBox.getAttribute("collapsed") == "true" ||
dirPaneBox.getAttribute("hidden") == "true";
}
function IsCardViewAndAbResultsPaneSplitterCollapsed()
{
var cardViewBox = document.getElementById('CardViewOuterBox');
try {
return (cardViewBox.getAttribute("collapsed") == "true");
}
catch (ex) {
return false;
}
}
function LaunchUrl(url)
{
// Doesn't matter if this bit fails, window.location contains its own prompts
try {
window.location = url;
}
catch (ex) {}
}
function AbIMSelected()
{
var cards = GetSelectedAbCards();
var count = cards.length;
var screennames;
var screennameCount = 0;
for (var i=0;i<count;i++) {
var screenname = cards[i].aimScreenName;
if (screenname) {
if (screennameCount == 0)
screennames = screenname;
else
screennames += "," + screenname;
screennameCount++
}
}
var url = "aim:";
if (screennameCount == 0)
url += "goim";
else if (screennameCount == 1)
url += "goim?screenname=" + screennames;
else {
url += "SendChatInvite?listofscreennames=" + screennames;
url += "&message=" + gAddressBookBundle.getString("joinMeInThisChat");
}
LaunchUrl(url);
}
function onAllowOnlineCheck(target)
{
// Update the pref
gPrefs.setBoolPref(kPrefOnlineCheckAllowed,
document.getElementById("menu_allow_online_check")
.getAttribute("checked") == "true");
// Now redisplay the card view pane.
UpdateCardView();
}