summaryrefslogtreecommitdiffstats
path: root/comm/suite/mailnews/components/addrbook/content/abCardViewOverlay.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/mailnews/components/addrbook/content/abCardViewOverlay.js')
-rw-r--r--comm/suite/mailnews/components/addrbook/content/abCardViewOverlay.js527
1 files changed, 527 insertions, 0 deletions
diff --git a/comm/suite/mailnews/components/addrbook/content/abCardViewOverlay.js b/comm/suite/mailnews/components/addrbook/content/abCardViewOverlay.js
new file mode 100644
index 0000000000..e9edfbfbe4
--- /dev/null
+++ b/comm/suite/mailnews/components/addrbook/content/abCardViewOverlay.js
@@ -0,0 +1,527 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//NOTE: gAddressBookBundle must be defined and set or this Overlay won't work
+
+var gMapItURLFormat;
+
+var gPhotoDisplayHandlers = {};
+
+var zListName;
+var zPrimaryEmail;
+var zSecondaryEmail;
+var zNickname;
+var zDisplayName;
+var zWork;
+var zHome;
+var zFax;
+var zCellular;
+var zPager;
+var zBirthday;
+var zCustom1;
+var zCustom2;
+var zCustom3;
+var zCustom4;
+var zYahoo;
+var zSkype;
+var zQQ;
+var zMSN;
+var zICQ;
+var zXMPP;
+var zIRC;
+
+var cvData;
+
+function OnLoadCardView()
+{
+ gMapItURLFormat = GetLocalizedStringPref("mail.addr_book.mapit_url.format");
+
+ zPrimaryEmail = gAddressBookBundle.getString("propertyPrimaryEmail");
+ zSecondaryEmail = gAddressBookBundle.getString("propertySecondaryEmail");
+ 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");
+ zBirthday = gAddressBookBundle.getString("propertyBirthday");
+ zCustom1 = gAddressBookBundle.getString("propertyCustom1");
+ zCustom2 = gAddressBookBundle.getString("propertyCustom2");
+ zCustom3 = gAddressBookBundle.getString("propertyCustom3");
+ zCustom4 = gAddressBookBundle.getString("propertyCustom4");
+ zYahoo = gAddressBookBundle.getString("propertyYahoo");
+ zSkype = gAddressBookBundle.getString("propertySkype");
+ zQQ = gAddressBookBundle.getString("propertyQQ");
+ zMSN = gAddressBookBundle.getString("propertyMSN");
+ zICQ = gAddressBookBundle.getString("propertyICQ");
+ zXMPP = gAddressBookBundle.getString("propertyXMPP");
+ zIRC = gAddressBookBundle.getString("propertyIRC");
+
+ 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.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.cvBirthday = doc.getElementById("cvBirthday");
+ 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");
+ cvData.cvbPhoto = doc.getElementById("cvbPhoto");
+ cvData.cvPhoto = doc.getElementById("cvPhoto");
+ // Chat section
+ cvData.cvbChat = doc.getElementById("cvbChat");
+ cvData.cvhChat = doc.getElementById("cvhChat");
+ cvData.cvYahoo = doc.getElementById("cvYahoo");
+ cvData.cvSkype = doc.getElementById("cvSkype");
+ cvData.cvQQ = doc.getElementById("cvQQ");
+ cvData.cvMSN = doc.getElementById("cvMSN");
+ cvData.cvICQ = doc.getElementById("cvICQ");
+ cvData.cvXMPP = doc.getElementById("cvXMPP");
+ cvData.cvIRC = doc.getElementById("cvIRC");
+}
+
+// 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.length;
+ if (total > 0)
+ addresses = addressList.queryElementAt(0, Ci.nsIAbCard).primaryEmail;
+ for (var i = 1; i < total; i++ ) {
+ addresses += ", " + addressList.queryElementAt(i, Ci.nsIAbCard).primaryEmail;
+ }
+ }
+ return addresses;
+}
+
+function DisplayCardViewPane(realCard)
+{
+ var generatedName = realCard.generateName(Services.prefs.getIntPref("mail.addr_book.lastnamefirst"));
+
+ let data = top.cvData;
+ let visible = false;
+
+ let card = { getProperty : function (prop) {
+ return realCard.getProperty(prop, "");
+ },
+ primaryEmail : realCard.primaryEmail,
+ displayName : realCard.displayName,
+ isMailList : realCard.isMailList,
+ mailListURI : realCard.mailListURI
+ };
+
+ // Contact photo
+ displayPhoto(card, cvData.cvPhoto);
+
+ let 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, titleString);
+
+ // Contact section
+ cvSetNodeWithLabel(data.cvNickname, zNickname, card.getProperty("NickName"));
+
+ if (card.isMailList) {
+ // email1 and display name always hidden when a mailing list.
+ cvSetVisible(data.cvDisplayName, false);
+ cvSetVisible(data.cvEmail1Box, false);
+
+ visible = HandleLink(data.cvListName, zListName, card.displayName, data.cvListNameBox, "mailto:" + encodeURIComponent(GenerateAddressFromCard(card)));
+ }
+ 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 = HandleLink(data.cvEmail2, zSecondaryEmail, card.getProperty("SecondEmail"), data.cvEmail2Box, "mailto:" + card.getProperty("SecondEmail")) || visible;
+
+ // Home section
+ visible = cvSetNode(data.cvHomeAddress, card.getProperty("HomeAddress"));
+ visible = cvSetNode(data.cvHomeAddress2, card.getProperty("HomeAddress2")) || visible;
+ visible = cvSetCityStateZip(data.cvHomeCityStZip, card.getProperty("HomeCity"), card.getProperty("HomeState"), card.getProperty("HomeZipCode")) || visible;
+ visible = cvSetNode(data.cvHomeCountry, card.getProperty("HomeCountry")) || visible;
+
+ let mapURLList = data.cvHomeMapIt.firstChild;
+ if (visible)
+ mapURLList.initMapAddressFromCard(card, "Home");
+
+ cvSetVisible(data.cvbHomeMapItBox, visible && !!mapURLList.mapURL);
+
+ visible = HandleLink(data.cvHomeWebPage, "", card.getProperty("WebPage2"), data.cvHomeWebPageBox, card.getProperty("WebPage2")) || visible;
+
+ cvSetVisible(data.cvhHome, visible);
+ cvSetVisible(data.cvbHome, visible);
+ if (card.isMailList) {
+ // Description section
+ visible = cvSetNode(data.cvDescription, card.getProperty("Notes"))
+ cvSetVisible(data.cvbDescription, visible);
+
+ // Addresses section
+ visible = cvAddAddressNodes(data.cvAddresses, card.mailListURI);
+ cvSetVisible(data.cvbAddresses, visible);
+
+ // Other and Chat sections, not shown for mailing lists.
+ cvSetVisible(data.cvbOther, false);
+ cvSetVisible(data.cvbChat, false);
+ }
+ else {
+ // Other section
+ /// setup the birthday information
+ let day = card.getProperty("BirthDay", null);
+ let month = card.getProperty("BirthMonth", null);
+ let year = card.getProperty("BirthYear", null);
+ let dateStr;
+ if (day > 0 && day < 32 && month > 0 && month < 13) {
+ let date;
+ let formatter;
+ if (year) {
+ // use UTC-based calculations to avoid off-by-one day
+ // due to time zone/dst discontinuity
+ date = new Date(Date.UTC(year, month - 1, day));
+ date.setUTCFullYear(year); // to handle two-digit years properly
+ formatter = new Services.intl.DateTimeFormat(undefined,
+ { dateStyle: "long", timeZone: "UTC" });
+ }
+ // if the year doesn't exist, display Month DD (ex. January 1)
+ else {
+ date = new Date(Date.UTC(saneBirthYear(year), month - 1, day));
+ formatter = new Services.intl.DateTimeFormat(undefined,
+ { month: "long", day: "numeric", timeZone: "UTC" });
+ }
+ dateStr = formatter.format(date);
+ }
+ else if (year) {
+ dateStr = year;
+ }
+
+ visible = cvSetNodeWithLabel(data.cvBirthday, zBirthday, dateStr);
+
+ visible = cvSetNodeWithLabel(data.cvCustom1, zCustom1, card.getProperty("Custom1")) || visible;
+ visible = cvSetNodeWithLabel(data.cvCustom2, zCustom2, card.getProperty("Custom2")) || visible;
+ visible = cvSetNodeWithLabel(data.cvCustom3, zCustom3, card.getProperty("Custom3")) || visible;
+ visible = cvSetNodeWithLabel(data.cvCustom4, zCustom4, card.getProperty("Custom4")) || visible;
+ visible = cvSetNode(data.cvNotes, card.getProperty("Notes")) || visible;
+
+ cvSetVisible(data.cvhOther, visible);
+ cvSetVisible(data.cvbOther, visible);
+
+ // Chat section
+ visible = cvSetNodeWithLabel(data.cvYahoo, zYahoo,
+ card.getProperty("_Yahoo"));
+ visible = cvSetNodeWithLabel(data.cvSkype, zSkype,
+ card.getProperty("_Skype")) || visible;
+ visible = cvSetNodeWithLabel(data.cvQQ, zQQ,
+ card.getProperty("_QQ")) || visible;
+ visible = cvSetNodeWithLabel(data.cvMSN, zMSN,
+ card.getProperty("_MSN")) || visible;
+ visible = cvSetNodeWithLabel(data.cvICQ, zICQ,
+ card.getProperty("_ICQ")) || visible;
+ visible = cvSetNodeWithLabel(data.cvXMPP, zXMPP,
+ card.getProperty("_JabberId")) || visible;
+ visible = cvSetNodeWithLabel(data.cvIRC, zIRC,
+ card.getProperty("_IRC")) || visible;
+ cvSetVisible(data.cvhChat, visible);
+ cvSetVisible(data.cvbChat, 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.getProperty("WorkPhone"));
+ visible = cvSetNodeWithLabel(data.cvPhHome, zHome, card.getProperty("HomePhone")) || visible;
+ visible = cvSetNodeWithLabel(data.cvPhFax, zFax, card.getProperty("FaxNumber")) || visible;
+ visible = cvSetNodeWithLabel(data.cvPhCellular, zCellular, card.getProperty("CellularNumber")) || visible;
+ visible = cvSetNodeWithLabel(data.cvPhPager, zPager, card.getProperty("PagerNumber")) || visible;
+ cvSetVisible(data.cvhPhone, visible);
+ cvSetVisible(data.cvbPhone, visible);
+
+ // Work section
+ visible = cvSetNode(data.cvJobTitle, card.getProperty("JobTitle"));
+ visible = cvSetNode(data.cvDepartment, card.getProperty("Department")) || visible;
+ visible = cvSetNode(data.cvCompany, card.getProperty("Company")) || visible;
+
+ let addressVisible = cvSetNode(data.cvWorkAddress, card.getProperty("WorkAddress"));
+ addressVisible = cvSetNode(data.cvWorkAddress2, card.getProperty("WorkAddress2")) || addressVisible;
+ addressVisible = cvSetCityStateZip(data.cvWorkCityStZip, card.getProperty("WorkCity"), card.getProperty("WorkState"), card.getProperty("WorkZipCode")) || addressVisible;
+ addressVisible = cvSetNode(data.cvWorkCountry, card.getProperty("WorkCountry")) || addressVisible;
+
+ mapURLList = data.cvWorkMapIt.firstChild;
+ if (addressVisible)
+ mapURLList.initMapAddressFromCard(card, "Work");
+
+ cvSetVisible(data.cvbWorkMapItBox, addressVisible && !!mapURLList.mapURL);
+
+ visible = HandleLink(data.cvWorkWebPage, "", card.getProperty("WebPage1"), data.cvWorkWebPageBox, card.getProperty("WebPage1")) || addressVisible || visible;
+
+ cvSetVisible(data.cvhWork, visible);
+ cvSetVisible(data.cvbWork, visible);
+
+ // make the card view box visible
+ cvSetVisible(top.cvData.CardViewBox, true);
+}
+
+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)
+{
+ let text = "";
+
+ if (city && state && zip)
+ text = gAddressBookBundle.getFormattedString("cityAndStateAndZip",
+ [city, state, zip]);
+ else if (city && state && !zip)
+ text = gAddressBookBundle.getFormattedString("cityAndStateNoZip",
+ [city, state]);
+ else if (zip && ((!city && state) || (city && !state)))
+ text = gAddressBookBundle.getFormattedString("cityOrStateAndZip",
+ [city + state, zip]);
+ else {
+ // Only one of the strings is non-empty so contatenating them produces that string.
+ text = city + state + zip;
+ }
+
+ return cvSetNode(node, text);
+}
+
+function cvSetNode(node, text)
+{
+ if (!node)
+ return false;
+
+ node.textContent = text;
+ let visible = !!text;
+ cvSetVisible(node, visible);
+
+ return visible;
+}
+
+function cvAddAddressNodes(node, uri)
+{
+ var visible = false;
+
+ if (node) {
+ var editList = GetDirectoryFromURI(uri);
+ var addressList = editList.addressLists;
+
+ if (addressList) {
+ var total = addressList.length;
+ if (total > 0) {
+ while (node.hasChildNodes()) {
+ node.lastChild.remove();
+ }
+ for (i = 0; i < total; i++ ) {
+ var descNode = document.createElement("description");
+ var card = addressList.queryElementAt(i, Ci.nsIAbCard);
+
+ 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:" + card.primaryEmail);
+ descNode.appendChild(linkNode);
+
+ var textNode = document.createTextNode(card.displayName + " <" + card.primaryEmail + ">");
+ 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 openLink(aEvent)
+{
+ openAsExternal(aEvent.target.getAttribute("href"));
+ // return false, so we don't load the href in the addressbook window
+ return false;
+}
+
+function openLinkWithUrl(aUrl)
+{
+ if (aUrl)
+ openAsExternal(aUrl);
+ // return false, so we don't load the href in the addressbook window
+ return false;
+}
+
+/* Display the contact photo from the nsIAbCard in the IMG element.
+ * If the photo cannot be displayed, show the generic contact
+ * photo.
+ */
+function displayPhoto(aCard, aImg)
+{
+ var type = aCard.getProperty("PhotoType", "");
+ if (!gPhotoDisplayHandlers[type] ||
+ !gPhotoDisplayHandlers[type](aCard, aImg))
+ gPhotoDisplayHandlers["generic"](aCard, aImg);
+}
+
+/* In order to display the contact photos in the card view, there
+ * must be a registered photo display handler for the card photo
+ * type. The generic, file, and web photo types are handled
+ * by default.
+ *
+ * A photo display handler is a function that behaves as follows:
+ *
+ * function(aCard, aImg):
+ * The function is responsible for determining how to retrieve
+ * the photo from nsIAbCard aCard, and for displaying it in img
+ * img element aImg. Returns true if successful. If it returns
+ * false, the generic photo display handler will be called.
+ *
+ * The following display handlers are for the generic, file and
+ * web photo types.
+ */
+
+var gGenericPhotoDisplayHandler = function(aCard, aImg)
+{
+ aImg.setAttribute("src", defaultPhotoURI);
+ return true;
+};
+
+var gPhotoNameDisplayHandler = function(aCard, aImg)
+{
+ var photoSrc = getPhotoURI(aCard.getProperty("PhotoName"));
+ aImg.setAttribute("src", photoSrc);
+ return true;
+};
+
+/* In order for a photo display handler to be registered for
+ * a particular photo type, it must be registered here.
+ */
+function registerPhotoDisplayHandler(aType, aPhotoDisplayHandler)
+{
+ if (!gPhotoDisplayHandlers[aType])
+ gPhotoDisplayHandlers[aType] = aPhotoDisplayHandler;
+}
+
+registerPhotoDisplayHandler("generic", gGenericPhotoDisplayHandler);
+// File and Web are treated the same, and therefore use the
+// same handler.
+registerPhotoDisplayHandler("file", gPhotoNameDisplayHandler);
+registerPhotoDisplayHandler("web", gPhotoNameDisplayHandler);