home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 October / Gamestar_77_2005-10_dvd.iso / Programy / nsb-install-8-0.exe / chrome / messenger.jar / content / messenger / addressbook / abCardViewOverlay.js < prev    next >
Text File  |  2005-07-29  |  19KB  |  515 lines

  1. /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2.  * The contents of this file are subject to the Netscape Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/NPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is Mozilla Communicator client code, released
  13.  * March 31, 1998.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation. Portions created by Netscape are
  17.  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Original Author:
  21.  *   Paul Hangas <hangas@netscape.com>
  22.  *
  23.  * Contributor(s):
  24.  *   Alec Flett <alecf@netscape.com>
  25.  *   Seth Spitzer <sspitzer@netscape.com>
  26.  */
  27.  
  28. //NOTE: gAddressBookBundle must be defined and set or this Overlay won't work
  29.  
  30. var gPrefs = Components.classes["@mozilla.org/preferences-service;1"];
  31. gPrefs = gPrefs.getService();
  32. gPrefs = gPrefs.QueryInterface(Components.interfaces.nsIPrefBranch);
  33.  
  34. var gProfileDirURL;
  35.  
  36. var gMapItURLFormat = gPrefs.getComplexValue("mail.addr_book.mapit_url.format", 
  37.                                               Components.interfaces.nsIPrefLocalizedString).data;
  38.  
  39. var gAddrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession);
  40.  
  41. var gIOService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  42. var gFileHandler = gIOService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  43.  
  44. var zListName;
  45. var zPrimaryEmail;
  46. var zSecondaryEmail;
  47. var zScreenName;
  48. var zNickname;
  49. var zDisplayName;
  50. var zWork;
  51. var zHome;
  52. var zFax;
  53. var zCellular;
  54. var zPager;
  55. var zCustom1;
  56. var zCustom2;
  57. var zCustom3;
  58. var zCustom4;
  59.  
  60. var cvData;
  61.  
  62. function OnLoadCardView()
  63. {
  64.   zPrimaryEmail = gAddressBookBundle.getString("propertyPrimaryEmail");
  65.   zSecondaryEmail = gAddressBookBundle.getString("propertySecondaryEmail");
  66.   zScreenName = gAddressBookBundle.getString("propertyScreenName");
  67.   zNickname = gAddressBookBundle.getString("propertyNickname");
  68.   zDisplayName = gAddressBookBundle.getString("propertyDisplayName");
  69.   zListName = gAddressBookBundle.getString("propertyListName");
  70.   zWork = gAddressBookBundle.getString("propertyWork");
  71.   zHome = gAddressBookBundle.getString("propertyHome");
  72.   zFax = gAddressBookBundle.getString("propertyFax");
  73.   zCellular = gAddressBookBundle.getString("propertyCellular");
  74.   zPager = gAddressBookBundle.getString("propertyPager");
  75.   zCustom1 = gAddressBookBundle.getString("propertyCustom1");
  76.   zCustom2 = gAddressBookBundle.getString("propertyCustom2");
  77.   zCustom3 = gAddressBookBundle.getString("propertyCustom3");
  78.   zCustom4 = gAddressBookBundle.getString("propertyCustom4");
  79.  
  80.     var doc = document;
  81.     
  82.     /* data for address book, prefixes: "cvb" = card view box
  83.                                         "cvh" = crad view header
  84.                                         "cv"  = card view (normal fields) */
  85.     cvData = new Object;
  86.  
  87.     // Card View Box
  88.     cvData.CardViewBox        = doc.getElementById("CardViewInnerBox");
  89.     // Title
  90.     cvData.CardTitle        = doc.getElementById("CardTitle");
  91.     // Name section
  92.     cvData.cvbContact = doc.getElementById("cvbContact");
  93.     cvData.cvhContact = doc.getElementById("cvhContact");
  94.     cvData.cvNickname        = doc.getElementById("cvNickname");
  95.     cvData.cvDisplayName    = doc.getElementById("cvDisplayName");
  96.     cvData.cvEmail1Box        = doc.getElementById("cvEmail1Box");
  97.     cvData.cvEmail1            = doc.getElementById("cvEmail1");
  98.     cvData.cvScreennameBox        = doc.getElementById("cvScreennameBox");
  99.   cvData.cvAimPresence = doc.getElementById("cvAimPresence");
  100.     cvData.cvScreenname        = doc.getElementById("cvScreenname");
  101.     cvData.cvBuddyIcon              = doc.getElementById("cvBuddyIcon");
  102.     cvData.cvListNameBox        = doc.getElementById("cvListNameBox");
  103.     cvData.cvListName               = doc.getElementById("cvListName");
  104.     cvData.cvEmail2Box        = doc.getElementById("cvEmail2Box");
  105.     cvData.cvEmail2            = doc.getElementById("cvEmail2");
  106.     // Home section
  107.     cvData.cvbHome            = doc.getElementById("cvbHome");
  108.     cvData.cvhHome            = doc.getElementById("cvhHome");
  109.     cvData.cvHomeAddress    = doc.getElementById("cvHomeAddress");
  110.     cvData.cvHomeAddress2    = doc.getElementById("cvHomeAddress2");
  111.     cvData.cvHomeCityStZip    = doc.getElementById("cvHomeCityStZip");
  112.     cvData.cvHomeCountry    = doc.getElementById("cvHomeCountry");
  113.   cvData.cvbHomeMapItBox  = doc.getElementById("cvbHomeMapItBox");
  114.   cvData.cvHomeMapIt = doc.getElementById("cvHomeMapIt");
  115.     cvData.cvHomeWebPageBox = doc.getElementById("cvHomeWebPageBox");
  116.     cvData.cvHomeWebPage    = doc.getElementById("cvHomeWebPage");
  117.     // Other section
  118.     cvData.cvbOther            = doc.getElementById("cvbOther");
  119.     cvData.cvhOther            = doc.getElementById("cvhOther");
  120.     cvData.cvCustom1        = doc.getElementById("cvCustom1");
  121.     cvData.cvCustom2        = doc.getElementById("cvCustom2");
  122.     cvData.cvCustom3        = doc.getElementById("cvCustom3");
  123.     cvData.cvCustom4        = doc.getElementById("cvCustom4");
  124.     cvData.cvNotes            = doc.getElementById("cvNotes");
  125.   // Description section (mailing lists only)
  126.   cvData.cvbDescription            = doc.getElementById("cvbDescription");
  127.     cvData.cvhDescription            = doc.getElementById("cvhDescription");
  128.   cvData.cvDescription            = doc.getElementById("cvDescription");
  129.   // Addresses section (mailing lists only)
  130.   cvData.cvbAddresses            = doc.getElementById("cvbAddresses");
  131.     cvData.cvhAddresses            = doc.getElementById("cvhAddresses");
  132.   cvData.cvAddresses            = doc.getElementById("cvAddresses");
  133.     // Phone section
  134.     cvData.cvbPhone            = doc.getElementById("cvbPhone");
  135.     cvData.cvhPhone            = doc.getElementById("cvhPhone");
  136.     cvData.cvPhWork            = doc.getElementById("cvPhWork");
  137.     cvData.cvPhHome            = doc.getElementById("cvPhHome");
  138.     cvData.cvPhFax            = doc.getElementById("cvPhFax");
  139.     cvData.cvPhCellular        = doc.getElementById("cvPhCellular");
  140.     cvData.cvPhPager        = doc.getElementById("cvPhPager");
  141.     // Work section
  142.     cvData.cvbWork            = doc.getElementById("cvbWork");
  143.     cvData.cvhWork            = doc.getElementById("cvhWork");
  144.     cvData.cvJobTitle        = doc.getElementById("cvJobTitle");
  145.     cvData.cvDepartment        = doc.getElementById("cvDepartment");
  146.     cvData.cvCompany        = doc.getElementById("cvCompany");
  147.     cvData.cvWorkAddress    = doc.getElementById("cvWorkAddress");
  148.     cvData.cvWorkAddress2    = doc.getElementById("cvWorkAddress2");
  149.     cvData.cvWorkCityStZip    = doc.getElementById("cvWorkCityStZip");
  150.     cvData.cvWorkCountry    = doc.getElementById("cvWorkCountry");
  151.   cvData.cvbWorkMapItBox  = doc.getElementById("cvbWorkMapItBox");
  152.   cvData.cvWorkMapIt = doc.getElementById("cvWorkMapIt");
  153.     cvData.cvWorkWebPageBox = doc.getElementById("cvWorkWebPageBox");
  154.     cvData.cvWorkWebPage    = doc.getElementById("cvWorkWebPage");
  155. }
  156.     
  157. // XXX todo
  158. // some similar code (in spirit) already exists, see OnLoadEditList()
  159. // perhaps we could combine and put in abCommon.js?
  160. function GetAddressesFromURI(uri)
  161. {
  162.   var addresses = "";
  163.  
  164.   var editList = GetDirectoryFromURI(uri);
  165.   var addressList = editList.addressLists;
  166.   if (addressList) {
  167.     var total = addressList.Count();
  168.     if (total > 0)
  169.       addresses = addressList.GetElementAt(0).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
  170.     for (var i = 1;  i < total; i++ ) {
  171.       addresses += ", " + addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;
  172.     }
  173.   }
  174.   return addresses;
  175. }
  176.  
  177. function GoIM()
  178. {
  179.   LaunchUrl(top.cvData.cvAimPresence.getAttribute("url"));
  180. }
  181.  
  182. function DisplayCardViewPane(card)
  183. {
  184.   var generatedName = gAddrbookSession.generateNameFromCard(card, gPrefs.getIntPref("mail.addr_book.lastnamefirst"));
  185.         
  186.   var data = top.cvData;
  187.   var visible;
  188.  
  189.   var titleString;
  190.   if (generatedName == "")
  191.     titleString = card.primaryEmail;  // if no generatedName, use email
  192.   else
  193.     titleString = generatedName;
  194.  
  195.   // set fields in card view pane
  196.   if (card.isMailList)
  197.     cvSetNode(data.CardTitle, gAddressBookBundle.getFormattedString("viewListTitle", [generatedName]));
  198.   else
  199.     cvSetNode(data.CardTitle, gAddressBookBundle.getFormattedString("viewCardTitle", [titleString]));
  200.     
  201.   // Contact section
  202.   cvSetNodeWithLabel(data.cvNickname, zNickname, card.nickName);
  203.  
  204.   if (card.isMailList) {
  205.     // email1, display name and screenname always hidden when a mailing list.
  206.     cvSetVisible(data.cvDisplayName, false);
  207.     cvSetVisible(data.cvEmail1Box, false);
  208.     cvSetVisible(data.cvScreennameBox, false);
  209.  
  210.     visible = HandleLink(data.cvListName, zListName, card.displayName, data.cvListNameBox, "mailto:" + encodeURIComponent(GenerateAddressFromCard(card))) || visible;
  211.   }
  212.   else { 
  213.     // listname always hidden if not a mailing list
  214.     cvSetVisible(data.cvListNameBox, false);
  215.  
  216.     cvSetNodeWithLabel(data.cvDisplayName, zDisplayName, card.displayName);
  217.  
  218.     visible = HandleLink(data.cvEmail1, zPrimaryEmail, card.primaryEmail, data.cvEmail1Box, "mailto:" + card.primaryEmail) || visible;
  219.   }
  220.  
  221.   var goimURL = "aim:goim?screenname=" + card.aimScreenName;
  222.   var hasScreenName = HandleLink(data.cvScreenname, zScreenName, card.aimScreenName, data.cvScreennameBox, goimURL);
  223.   
  224.   if (!hasScreenName || gIOService.offline) {
  225.     data.cvAimPresence.removeAttribute("src");
  226.     data.cvAimPresence.removeAttribute("url");
  227.     data.cvAimPresence.setAttribute("width","0");
  228.   }
  229.   else {
  230.     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");   
  231.     data.cvAimPresence.setAttribute("url", goimURL);
  232.     data.cvAimPresence.setAttribute("width","16");
  233.   }
  234.  
  235.   visible = hasScreenName || visible;
  236.   visible = HandleLink(data.cvEmail2, zSecondaryEmail, card.secondEmail, data.cvEmail2Box, "mailto:" + card.secondEmail) || visible;
  237.  
  238.     // Home section
  239.     visible = cvSetNode(data.cvHomeAddress, card.homeAddress);
  240.     visible = cvSetNode(data.cvHomeAddress2, card.homeAddress2) || visible;
  241.     visible = cvSetCityStateZip(data.cvHomeCityStZip, card.homeCity, card.homeState, card.homeZipCode) || visible;
  242.     visible = cvSetNode(data.cvHomeCountry, card.homeCountry) || visible;
  243.         if (visible) {
  244.           var homeMapItUrl = CreateMapItURL(card.homeAddress, card.homeAddress2, card.homeCity, card.homeState, card.homeZipCode, card.homeCountry);
  245.           if (homeMapItUrl) {
  246.         cvSetVisible(data.cvbHomeMapItBox, true);
  247.             data.cvHomeMapIt.setAttribute('url', homeMapItUrl);
  248.           }
  249.           else {
  250.         cvSetVisible(data.cvbHomeMapItBox, false);
  251.           }
  252.         }
  253.         else {
  254.       cvSetVisible(data.cvbHomeMapItBox, false);
  255.         }
  256.  
  257.   visible = HandleLink(data.cvHomeWebPage, "", card.webPage2, data.cvHomeWebPageBox, card.webPage2) || visible;
  258.  
  259.     cvSetVisible(data.cvhHome, visible);
  260.     cvSetVisible(data.cvbHome, visible);
  261.   if (card.isMailList) {
  262.     // Description section
  263.       visible = cvSetNode(data.cvDescription, card.notes)
  264.       cvSetVisible(data.cvbDescription, visible);
  265.  
  266.     // Addresses section
  267.       visible = cvAddAddressNodes(data.cvAddresses, card.mailListURI);
  268.       cvSetVisible(data.cvbAddresses, visible);
  269.  
  270.     // Other section, not shown for mailing lists.
  271.     cvSetVisible(data.cvbOther, false);
  272.   }
  273.   else {
  274.       // Other section
  275.       visible = cvSetNodeWithLabel(data.cvCustom1, zCustom1, card.custom1);
  276.       visible = cvSetNodeWithLabel(data.cvCustom2, zCustom2, card.custom2) || visible;
  277.       visible = cvSetNodeWithLabel(data.cvCustom3, zCustom3, card.custom3) || visible;
  278.       visible = cvSetNodeWithLabel(data.cvCustom4, zCustom4, card.custom4) || visible;
  279.       visible = cvSetNode(data.cvNotes, card.notes) || visible;
  280.     visible = setBuddyIcon(card, data.cvBuddyIcon) || visible;
  281.  
  282.     cvSetVisible(data.cvhOther, visible);
  283.     cvSetVisible(data.cvbOther, visible);
  284.  
  285.     // hide description section, not show for non-mailing lists
  286.     cvSetVisible(data.cvbDescription, false);
  287.  
  288.     // hide addresses section, not show for non-mailing lists
  289.     cvSetVisible(data.cvbAddresses, false);
  290.   }
  291.  
  292.     // Phone section
  293.     visible = cvSetNodeWithLabel(data.cvPhWork, zWork, card.workPhone);
  294.     visible = cvSetNodeWithLabel(data.cvPhHome, zHome, card.homePhone) || visible;
  295.     visible = cvSetNodeWithLabel(data.cvPhFax, zFax, card.faxNumber) || visible;
  296.     visible = cvSetNodeWithLabel(data.cvPhCellular, zCellular, card.cellularNumber) || visible;
  297.     visible = cvSetNodeWithLabel(data.cvPhPager, zPager, card.pagerNumber) || visible;
  298.     cvSetVisible(data.cvhPhone, visible);
  299.     cvSetVisible(data.cvbPhone, visible);
  300.     // Work section
  301.     visible = cvSetNode(data.cvJobTitle, card.jobTitle);
  302.     visible = cvSetNode(data.cvDepartment, card.department) || visible;
  303.     visible = cvSetNode(data.cvCompany, card.company) || visible;
  304.         
  305.         var addressVisible = cvSetNode(data.cvWorkAddress, card.workAddress);
  306.     addressVisible = cvSetNode(data.cvWorkAddress2, card.workAddress2) || addressVisible;
  307.     addressVisible = cvSetCityStateZip(data.cvWorkCityStZip, card.workCity, card.workState, card.workZipCode) || addressVisible;
  308.     addressVisible = cvSetNode(data.cvWorkCountry, card.workCountry) || addressVisible;
  309.  
  310.         if (addressVisible) {
  311.           var workMapItUrl = CreateMapItURL(card.workAddress, card.workAddress2, card.workCity, card.workState, card.workZipCode, card.workCountry);
  312.           data.cvWorkMapIt.setAttribute('url', workMapItUrl);
  313.           if (workMapItUrl) {
  314.         cvSetVisible(data.cvbWorkMapItBox, true);
  315.             data.cvWorkMapIt.setAttribute('url', workMapItUrl);
  316.           }
  317.           else {
  318.         cvSetVisible(data.cvbWorkMapItBox, false);
  319.           }
  320.         }
  321.         else {
  322.       cvSetVisible(data.cvbWorkMapItBox, false);
  323.         }
  324.  
  325.         visible = HandleLink(data.cvWorkWebPage, "", card.webPage1, data.cvWorkWebPageBox, card.webPage1) || addressVisible || visible;
  326.  
  327.     cvSetVisible(data.cvhWork, visible);
  328.     cvSetVisible(data.cvbWork, visible);
  329.  
  330.     // make the card view box visible
  331.     cvSetVisible(top.cvData.CardViewBox, true);
  332. }
  333.  
  334. function setBuddyIcon(card, buddyIcon)
  335. {
  336.   try {
  337.     var myScreenName = gPrefs.getCharPref("aim.session.screenname");
  338.     if (myScreenName && card.primaryEmail) {
  339.       if (!gProfileDirURL) {
  340.         // lazily create these file urls, and keep them around
  341.         var dirService = Components.classes["@mozilla.org/directory_service;1"]
  342.             .getService(Components.interfaces.nsIProperties);
  343.         var profileDir = dirService.get("ProfD", Components.interfaces.nsIFile);
  344.         gProfileDirURL = gIOService.newFileURI(profileDir);
  345.       }
  346.  
  347.       // if we did have a buddy icon on disk for this screenname, this would be the file url spec for it
  348.       var iconURLStr = gProfileDirURL.spec + "/NIM/" + myScreenName + "/picture/" + card.aimScreenName + ".gif";
  349.  
  350.       // check if the file exists
  351.       var file = gFileHandler.getFileFromURLSpec(iconURLStr);
  352.             
  353.       // check if the file exists
  354.       // is this a perf hit?  (how expensive is stat()?)
  355.       if (file.exists()) {
  356.         buddyIcon.setAttribute("src", iconURLStr);
  357.         return true;
  358.       }
  359.     }
  360.   }
  361.   catch (ex) {
  362.     // can get here if no screenname
  363.   }
  364.   
  365.   buddyIcon.setAttribute("src", "");
  366.   return false;
  367. }
  368.  
  369. function ClearCardViewPane()
  370. {
  371.     cvSetVisible(top.cvData.CardViewBox, false);
  372. }
  373.  
  374. function cvSetNodeWithLabel(node, label, text)
  375. {
  376.   if (text) {
  377.     if (label)
  378.       return cvSetNode(node, label + ": " + text);
  379.     else
  380.       return cvSetNode(node, text);
  381.   }
  382.   else
  383.     return cvSetNode(node, "");
  384. }
  385.  
  386. function cvSetCityStateZip(node, city, state, zip)
  387. {
  388.     var text = "";
  389.     
  390.     if ( city )
  391.     {
  392.         text = city;
  393.         if ( state || zip )
  394.             text += ", ";
  395.     }
  396.     if ( state )
  397.         text += state + " ";
  398.     if ( zip )
  399.         text += zip;
  400.     
  401.     return cvSetNode(node, text);
  402. }
  403.  
  404. function cvSetNode(node, text)
  405. {
  406.     if ( node )
  407.     {
  408.         if ( node.childNodes.length == 0 )
  409.         {
  410.             var textNode = document.createTextNode(text);
  411.             node.appendChild(textNode);                               
  412.         }
  413.         else if ( node.childNodes.length == 1 )
  414.             node.childNodes[0].nodeValue = text;
  415.  
  416.         var visible;
  417.         
  418.         if ( text )
  419.             visible = true;
  420.         else
  421.             visible = false;
  422.         
  423.         cvSetVisible(node, visible);
  424.     }
  425.  
  426.     return visible;
  427. }
  428.  
  429. function cvAddAddressNodes(node, uri)
  430. {
  431.   var visible = false;
  432.     if ( node )
  433.     {
  434.     var displayName = ""; 
  435.     var address = "";
  436.  
  437.     var editList = GetDirectoryFromURI(uri);
  438.     var addressList = editList.addressLists;
  439.       
  440.     if (addressList) {
  441.       var total = addressList.Count();
  442.       if (total > 0) {
  443.         for (var i = node.childNodes.length - 1; i >= 0; i--) {
  444.           node.removeChild(node.childNodes[i]);
  445.         }
  446.         for (i = 0;  i < total; i++ ) {
  447.               var descNode = document.createElement("description");   
  448.           address = addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).primaryEmail;    
  449.           displayName = addressList.GetElementAt(i).QueryInterface(Components.interfaces.nsIAbCard).displayName;  
  450.           descNode.setAttribute("class", "CardViewLink");
  451.           node.appendChild(descNode);         
  452.           
  453.           var linkNode = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
  454.           linkNode.setAttribute("id", "addr#" + i);
  455.           linkNode.setAttribute("href", "mailto:" + address);
  456.           descNode.appendChild(linkNode);
  457.           
  458.           var textNode = document.createTextNode(displayName + " <" + address + ">");
  459.           linkNode.appendChild(textNode);
  460.         }
  461.               visible = true;
  462.       }
  463.         }    
  464.         cvSetVisible(node, visible);
  465.     }
  466.     return visible;
  467. }
  468.  
  469. function cvSetVisible(node, visible)
  470. {
  471.     if ( visible )
  472.         node.removeAttribute("collapsed");
  473.     else
  474.         node.setAttribute("collapsed", "true");
  475. }
  476.  
  477. function HandleLink(node, label, value, box, link)
  478. {
  479.   var visible = cvSetNodeWithLabel(node, label, value);
  480.   if (visible)
  481.     node.setAttribute('href', link);
  482.   cvSetVisible(box, visible);
  483.  
  484.   return visible;
  485. }
  486.  
  487. function MapIt(id)
  488. {
  489.   var button = document.getElementById(id);
  490.   openTopWin(button.getAttribute('url'));
  491. }
  492.  
  493. function CreateMapItURL(address1, address2, city, state, zip, country)
  494. {
  495.   if (!gMapItURLFormat)
  496.     return null;
  497.  
  498.   var urlFormat = gMapItURLFormat.replace("@A1", encodeURIComponent(address1));
  499.   urlFormat = urlFormat.replace("@A2", encodeURIComponent(address2));
  500.   urlFormat = urlFormat.replace("@CO", encodeURIComponent(country));
  501.   urlFormat = urlFormat.replace("@CI", encodeURIComponent(city));
  502.   urlFormat = urlFormat.replace("@ST", encodeURIComponent(state));
  503.   urlFormat = urlFormat.replace("@ZI", encodeURIComponent(zip));
  504.   
  505.   return urlFormat;
  506. }
  507.  
  508. function openLink(id)
  509. {
  510.   openTopWin(document.getElementById(id).getAttribute("href"));
  511.   // return false, so we don't load the href in the addressbook window
  512.   return false;
  513. }
  514.  
  515.