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

529 строки
19 KiB
JavaScript

/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* ***** 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):
* Alec Flett <alecf@netscape.com>
* Seth Spitzer <sspitzer@netscape.com>
*
* 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 ***** */
//NOTE: gAddressBookBundle must be defined and set or this Overlay won't work
var gPrefs = Components.classes["@mozilla.org/preferences-service;1"];
gPrefs = gPrefs.getService();
gPrefs = gPrefs.QueryInterface(Components.interfaces.nsIPrefBranch);
var gProfileDirURL;
var gMapItURLFormat = gPrefs.getComplexValue("mail.addr_book.mapit_url.format",
Components.interfaces.nsIPrefLocalizedString).data;
var gAddrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession);
var gIOService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var gFileHandler = gIOService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
var zListName;
var zPrimaryEmail;
var zSecondaryEmail;
var zScreenName;
var zNickname;
var zDisplayName;
var zWork;
var zHome;
var zFax;
var zCellular;
var zPager;
var zCustom1;
var zCustom2;
var zCustom3;
var zCustom4;
var cvData;
function OnLoadCardView()
{
zPrimaryEmail = gAddressBookBundle.getString("propertyPrimaryEmail");
zSecondaryEmail = gAddressBookBundle.getString("propertySecondaryEmail");
zScreenName = gAddressBookBundle.getString("propertyScreenName");
zNickname = gAddressBookBundle.getString("propertyNickname");
zDisplayName = gAddressBookBundle.getString("propertyDisplayName");
zListName = gAddressBookBundle.getString("propertyListName");
zWork = gAddressBookBundle.getString("propertyWork");
zHome = gAddressBookBundle.getString("propertyHome");
zFax = gAddressBookBundle.getString("propertyFax");
zCellular = gAddressBookBundle.getString("propertyCellular");
zPager = gAddressBookBundle.getString("propertyPager");
zCustom1 = gAddressBookBundle.getString("propertyCustom1");
zCustom2 = gAddressBookBundle.getString("propertyCustom2");
zCustom3 = gAddressBookBundle.getString("propertyCustom3");
zCustom4 = gAddressBookBundle.getString("propertyCustom4");
var doc = document;
/* data for address book, prefixes: "cvb" = card view box
"cvh" = crad view header
"cv" = card view (normal fields) */
cvData = new Object;
// Card View Box
cvData.CardViewBox = doc.getElementById("CardViewInnerBox");
// Title
cvData.CardTitle = doc.getElementById("CardTitle");
// Name section
cvData.cvbContact = doc.getElementById("cvbContact");
cvData.cvhContact = doc.getElementById("cvhContact");
cvData.cvNickname = doc.getElementById("cvNickname");
cvData.cvDisplayName = doc.getElementById("cvDisplayName");
cvData.cvEmail1Box = doc.getElementById("cvEmail1Box");
cvData.cvEmail1 = doc.getElementById("cvEmail1");
cvData.cvScreennameBox = doc.getElementById("cvScreennameBox");
cvData.cvAimPresence = doc.getElementById("cvAimPresence");
cvData.cvScreenname = doc.getElementById("cvScreenname");
cvData.cvBuddyIcon = doc.getElementById("cvBuddyIcon");
cvData.cvListNameBox = doc.getElementById("cvListNameBox");
cvData.cvListName = doc.getElementById("cvListName");
cvData.cvEmail2Box = doc.getElementById("cvEmail2Box");
cvData.cvEmail2 = doc.getElementById("cvEmail2");
// Home section
cvData.cvbHome = doc.getElementById("cvbHome");
cvData.cvhHome = doc.getElementById("cvhHome");
cvData.cvHomeAddress = doc.getElementById("cvHomeAddress");
cvData.cvHomeAddress2 = doc.getElementById("cvHomeAddress2");
cvData.cvHomeCityStZip = doc.getElementById("cvHomeCityStZip");
cvData.cvHomeCountry = doc.getElementById("cvHomeCountry");
cvData.cvbHomeMapItBox = doc.getElementById("cvbHomeMapItBox");
cvData.cvHomeMapIt = doc.getElementById("cvHomeMapIt");
cvData.cvHomeWebPageBox = doc.getElementById("cvHomeWebPageBox");
cvData.cvHomeWebPage = doc.getElementById("cvHomeWebPage");
// Other section
cvData.cvbOther = doc.getElementById("cvbOther");
cvData.cvhOther = doc.getElementById("cvhOther");
cvData.cvCustom1 = doc.getElementById("cvCustom1");
cvData.cvCustom2 = doc.getElementById("cvCustom2");
cvData.cvCustom3 = doc.getElementById("cvCustom3");
cvData.cvCustom4 = doc.getElementById("cvCustom4");
cvData.cvNotes = doc.getElementById("cvNotes");
// Description section (mailing lists only)
cvData.cvbDescription = doc.getElementById("cvbDescription");
cvData.cvhDescription = doc.getElementById("cvhDescription");
cvData.cvDescription = doc.getElementById("cvDescription");
// Addresses section (mailing lists only)
cvData.cvbAddresses = doc.getElementById("cvbAddresses");
cvData.cvhAddresses = doc.getElementById("cvhAddresses");
cvData.cvAddresses = doc.getElementById("cvAddresses");
// Phone section
cvData.cvbPhone = doc.getElementById("cvbPhone");
cvData.cvhPhone = doc.getElementById("cvhPhone");
cvData.cvPhWork = doc.getElementById("cvPhWork");
cvData.cvPhHome = doc.getElementById("cvPhHome");
cvData.cvPhFax = doc.getElementById("cvPhFax");
cvData.cvPhCellular = doc.getElementById("cvPhCellular");
cvData.cvPhPager = doc.getElementById("cvPhPager");
// Work section
cvData.cvbWork = doc.getElementById("cvbWork");
cvData.cvhWork = doc.getElementById("cvhWork");
cvData.cvJobTitle = doc.getElementById("cvJobTitle");
cvData.cvDepartment = doc.getElementById("cvDepartment");
cvData.cvCompany = doc.getElementById("cvCompany");
cvData.cvWorkAddress = doc.getElementById("cvWorkAddress");
cvData.cvWorkAddress2 = doc.getElementById("cvWorkAddress2");
cvData.cvWorkCityStZip = doc.getElementById("cvWorkCityStZip");
cvData.cvWorkCountry = doc.getElementById("cvWorkCountry");
cvData.cvbWorkMapItBox = doc.getElementById("cvbWorkMapItBox");
cvData.cvWorkMapIt = doc.getElementById("cvWorkMapIt");
cvData.cvWorkWebPageBox = doc.getElementById("cvWorkWebPageBox");
cvData.cvWorkWebPage = doc.getElementById("cvWorkWebPage");
}
// XXX todo
// some similar code (in spirit) already exists, see OnLoadEditList()
// perhaps we could combine and put in abCommon.js?
function GetAddressesFromURI(uri)
{
var addresses = "";
var editList = GetDirectoryFromURI(uri);
var addressList = editList.addressLists;
if (addressList) {
var total = addressList.Count();
if (total > 0)
addresses = addressList.GetElementAt(0).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
for (var i = 1; i < total; i++ ) {
addresses += ", " + addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
}
}
return addresses;
}
function GoIM()
{
LaunchUrl(top.cvData.cvAimPresence.getAttribute("url"));
}
function DisplayCardViewPane(card)
{
var generatedName = gAddrbookSession.generateNameFromCard(card, gPrefs.getIntPref("mail.addr_book.lastnamefirst"));
var data = top.cvData;
var visible;
var titleString;
if (generatedName == "")
titleString = card.primaryEmail; // if no generatedName, use email
else
titleString = generatedName;
// set fields in card view pane
if (card.isMailList)
cvSetNode(data.CardTitle, gAddressBookBundle.getFormattedString("viewListTitle", [generatedName]));
else
cvSetNode(data.CardTitle, gAddressBookBundle.getFormattedString("viewCardTitle", [titleString]));
// Contact section
cvSetNodeWithLabel(data.cvNickname, zNickname, card.nickName);
if (card.isMailList) {
// email1, display name and screenname always hidden when a mailing list.
cvSetVisible(data.cvDisplayName, false);
cvSetVisible(data.cvEmail1Box, false);
cvSetVisible(data.cvScreennameBox, false);
visible = HandleLink(data.cvListName, zListName, card.displayName, data.cvListNameBox, "mailto:" + encodeURIComponent(GenerateAddressFromCard(card))) || visible;
}
else {
// listname always hidden if not a mailing list
cvSetVisible(data.cvListNameBox, false);
cvSetNodeWithLabel(data.cvDisplayName, zDisplayName, card.displayName);
visible = HandleLink(data.cvEmail1, zPrimaryEmail, card.primaryEmail, data.cvEmail1Box, "mailto:" + card.primaryEmail) || visible;
}
var onlineCheckAllowed = gPrefs.getBoolPref("mail.addr_book.im.onlineCheckAllowed");
var goimURL = "aim:goim?screenname=" + card.aimScreenName;
var hasScreenName = HandleLink(data.cvScreenname, zScreenName, card.aimScreenName, data.cvScreennameBox, goimURL);
if (!onlineCheckAllowed || !hasScreenName || gIOService.offline) {
data.cvAimPresence.removeAttribute("src");
data.cvAimPresence.removeAttribute("url");
data.cvAimPresence.setAttribute("width","0");
}
else {
data.cvAimPresence.setAttribute("src","http://big.oscar.aol.com:80/" + card.aimScreenName + "?on_url=http://ncmail.netscape.com/include/nc/images/online.gif&off_url=http://ncmail.netscape.com/include/nc/images/offline.gif");
data.cvAimPresence.setAttribute("url", goimURL);
data.cvAimPresence.setAttribute("width","16");
}
visible = hasScreenName || visible;
visible = HandleLink(data.cvEmail2, zSecondaryEmail, card.secondEmail, data.cvEmail2Box, "mailto:" + card.secondEmail) || visible;
// Home section
visible = cvSetNode(data.cvHomeAddress, card.homeAddress);
visible = cvSetNode(data.cvHomeAddress2, card.homeAddress2) || visible;
visible = cvSetCityStateZip(data.cvHomeCityStZip, card.homeCity, card.homeState, card.homeZipCode) || visible;
visible = cvSetNode(data.cvHomeCountry, card.homeCountry) || visible;
if (visible) {
var homeMapItUrl = CreateMapItURL(card.homeAddress, card.homeAddress2, card.homeCity, card.homeState, card.homeZipCode, card.homeCountry);
if (homeMapItUrl) {
cvSetVisible(data.cvbHomeMapItBox, true);
data.cvHomeMapIt.setAttribute('url', homeMapItUrl);
}
else {
cvSetVisible(data.cvbHomeMapItBox, false);
}
}
else {
cvSetVisible(data.cvbHomeMapItBox, false);
}
visible = HandleLink(data.cvHomeWebPage, "", card.webPage2, data.cvHomeWebPageBox, card.webPage2) || visible;
cvSetVisible(data.cvhHome, visible);
cvSetVisible(data.cvbHome, visible);
if (card.isMailList) {
// Description section
visible = cvSetNode(data.cvDescription, card.notes)
cvSetVisible(data.cvbDescription, visible);
// Addresses section
visible = cvAddAddressNodes(data.cvAddresses, card.mailListURI);
cvSetVisible(data.cvbAddresses, visible);
// Other section, not shown for mailing lists.
cvSetVisible(data.cvbOther, false);
}
else {
// Other section
visible = cvSetNodeWithLabel(data.cvCustom1, zCustom1, card.custom1);
visible = cvSetNodeWithLabel(data.cvCustom2, zCustom2, card.custom2) || visible;
visible = cvSetNodeWithLabel(data.cvCustom3, zCustom3, card.custom3) || visible;
visible = cvSetNodeWithLabel(data.cvCustom4, zCustom4, card.custom4) || visible;
visible = cvSetNode(data.cvNotes, card.notes) || visible;
visible = setBuddyIcon(card, data.cvBuddyIcon) || visible;
cvSetVisible(data.cvhOther, visible);
cvSetVisible(data.cvbOther, visible);
// hide description section, not show for non-mailing lists
cvSetVisible(data.cvbDescription, false);
// hide addresses section, not show for non-mailing lists
cvSetVisible(data.cvbAddresses, false);
}
// Phone section
visible = cvSetNodeWithLabel(data.cvPhWork, zWork, card.workPhone);
visible = cvSetNodeWithLabel(data.cvPhHome, zHome, card.homePhone) || visible;
visible = cvSetNodeWithLabel(data.cvPhFax, zFax, card.faxNumber) || visible;
visible = cvSetNodeWithLabel(data.cvPhCellular, zCellular, card.cellularNumber) || visible;
visible = cvSetNodeWithLabel(data.cvPhPager, zPager, card.pagerNumber) || visible;
cvSetVisible(data.cvhPhone, visible);
cvSetVisible(data.cvbPhone, visible);
// Work section
visible = cvSetNode(data.cvJobTitle, card.jobTitle);
visible = cvSetNode(data.cvDepartment, card.department) || visible;
visible = cvSetNode(data.cvCompany, card.company) || visible;
var addressVisible = cvSetNode(data.cvWorkAddress, card.workAddress);
addressVisible = cvSetNode(data.cvWorkAddress2, card.workAddress2) || addressVisible;
addressVisible = cvSetCityStateZip(data.cvWorkCityStZip, card.workCity, card.workState, card.workZipCode) || addressVisible;
addressVisible = cvSetNode(data.cvWorkCountry, card.workCountry) || addressVisible;
if (addressVisible) {
var workMapItUrl = CreateMapItURL(card.workAddress, card.workAddress2, card.workCity, card.workState, card.workZipCode, card.workCountry);
data.cvWorkMapIt.setAttribute('url', workMapItUrl);
if (workMapItUrl) {
cvSetVisible(data.cvbWorkMapItBox, true);
data.cvWorkMapIt.setAttribute('url', workMapItUrl);
}
else {
cvSetVisible(data.cvbWorkMapItBox, false);
}
}
else {
cvSetVisible(data.cvbWorkMapItBox, false);
}
visible = HandleLink(data.cvWorkWebPage, "", card.webPage1, data.cvWorkWebPageBox, card.webPage1) || addressVisible || visible;
cvSetVisible(data.cvhWork, visible);
cvSetVisible(data.cvbWork, visible);
// make the card view box visible
cvSetVisible(top.cvData.CardViewBox, true);
}
function setBuddyIcon(card, buddyIcon)
{
try {
var myScreenName = gPrefs.getCharPref("aim.session.screenname");
if (myScreenName && card.primaryEmail) {
if (!gProfileDirURL) {
// lazily create these file urls, and keep them around
var dirService = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
var profileDir = dirService.get("ProfD", Components.interfaces.nsIFile);
gProfileDirURL = gIOService.newFileURI(profileDir);
}
// if we did have a buddy icon on disk for this screenname, this would be the file url spec for it
var iconURLStr = gProfileDirURL.spec + "/NIM/" + myScreenName + "/picture/" + card.aimScreenName + ".gif";
// check if the file exists
var file = gFileHandler.getFileFromURLSpec(iconURLStr);
// check if the file exists
// is this a perf hit? (how expensive is stat()?)
if (file.exists()) {
buddyIcon.setAttribute("src", iconURLStr);
return true;
}
}
}
catch (ex) {
// can get here if no screenname
}
buddyIcon.setAttribute("src", "");
return false;
}
function ClearCardViewPane()
{
cvSetVisible(top.cvData.CardViewBox, false);
}
function cvSetNodeWithLabel(node, label, text)
{
if (text) {
if (label)
return cvSetNode(node, label + ": " + text);
else
return cvSetNode(node, text);
}
else
return cvSetNode(node, "");
}
function cvSetCityStateZip(node, city, state, zip)
{
var text = "";
if ( city )
{
text = city;
if ( state || zip )
text += ", ";
}
if ( state )
text += state + " ";
if ( zip )
text += zip;
return cvSetNode(node, text);
}
function cvSetNode(node, text)
{
if ( node )
{
if ( !node.hasChildNodes() )
{
var textNode = document.createTextNode(text);
node.appendChild(textNode);
}
else if ( node.childNodes.length == 1 )
node.childNodes[0].nodeValue = text;
var visible;
if ( text )
visible = true;
else
visible = false;
cvSetVisible(node, visible);
}
return visible;
}
function cvAddAddressNodes(node, uri)
{
var visible = false;
if ( node )
{
var displayName = "";
var address = "";
var editList = GetDirectoryFromURI(uri);
var addressList = editList.addressLists;
if (addressList) {
var total = addressList.Count();
if (total > 0) {
while (node.hasChildNodes()) {
node.removeChild(node.lastChild);
}
for (i = 0; i < total; i++ ) {
var descNode = document.createElement("description");
address = addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
displayName = addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).displayName;
descNode.setAttribute("class", "CardViewLink");
node.appendChild(descNode);
var linkNode = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
linkNode.setAttribute("id", "addr#" + i);
linkNode.setAttribute("href", "mailto:" + address);
descNode.appendChild(linkNode);
var textNode = document.createTextNode(displayName + " <" + address + ">");
linkNode.appendChild(textNode);
}
visible = true;
}
}
cvSetVisible(node, visible);
}
return visible;
}
function cvSetVisible(node, visible)
{
if ( visible )
node.removeAttribute("collapsed");
else
node.setAttribute("collapsed", "true");
}
function HandleLink(node, label, value, box, link)
{
var visible = cvSetNodeWithLabel(node, label, value);
if (visible)
node.setAttribute('href', link);
cvSetVisible(box, visible);
return visible;
}
function MapIt(id)
{
var button = document.getElementById(id);
openTopWin(button.getAttribute('url'));
}
function CreateMapItURL(address1, address2, city, state, zip, country)
{
if (!gMapItURLFormat)
return null;
var urlFormat = gMapItURLFormat.replace("@A1", encodeURIComponent(address1));
urlFormat = urlFormat.replace("@A2", encodeURIComponent(address2));
urlFormat = urlFormat.replace("@CO", encodeURIComponent(country));
urlFormat = urlFormat.replace("@CI", encodeURIComponent(city));
urlFormat = urlFormat.replace("@ST", encodeURIComponent(state));
urlFormat = urlFormat.replace("@ZI", encodeURIComponent(zip));
return urlFormat;
}
function openLink(id)
{
openTopWin(document.getElementById(id).getAttribute("href"));
// return false, so we don't load the href in the addressbook window
return false;
}