home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / komunikace / netscape / nsb-install-8-1-2.exe / chrome / browser.jar / content / browser / browser.js < prev    next >
Text File  |  2006-09-01  |  336KB  |  10,432 lines

  1.  
  2. const NS_ERROR_MODULE_NETWORK = 2152398848;
  3. const NS_NET_STATUS_READ_FROM = NS_ERROR_MODULE_NETWORK + 8;
  4. const NS_NET_STATUS_WROTE_TO  = NS_ERROR_MODULE_NETWORK + 9;
  5. const kXULNS =
  6.     "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  7. const XHTML_NS = "http://www.w3.org/1999/xhtml";
  8.  
  9. const nsCI               = Components.interfaces;
  10. const nsIWebNavigation   = nsCI.nsIWebNavigation;
  11. const nsIHTMLPluginDocument = Components.interfaces.nsIHTMLPluginDocument;
  12. const PRINT_PREVIEW_REQ_WHILE_TRIDENT_LOADING_ERROR = 0;
  13. const PRINT_REQ_WHILE_TRIDENT_LOADING_ERROR = 1;
  14.  
  15. const MAX_HISTORY_MENU_ITEMS = 15;
  16. const TEXTSEARCH_LENGTH = 20;
  17.  
  18. const CONTEXTMENU_TIMEOUT = 100;
  19. const BROWSER_DEBUG = false;
  20.  
  21. // Defines for setting panel of Options dialog. Used in call
  22. // to openPrefs() to set browser.preferences.lastpanel pref.
  23. const PREF_GENERAL         = 0;
  24. const PREF_TABBROWSING     = 1;
  25. const PREF_DOWNLOADS       = 2;
  26. const PREF_ADVANCED        = 3;
  27. const PREF_SITECONTROLS    = 4;
  28. const PREF_SPYWATCH        = 5;
  29. const PREF_BROWSERUPDATE   = 6;
  30. const PREF_AUTOFILL        = 7;
  31. const PREF_PRIVACY         = 8;
  32. const PREF_PROFILES        = 9;
  33. const PREF_SCREENNAME      = 10;
  34. const PREF_IDTHEFT         = 11;
  35.  
  36. //MERC - BH: constant that defines how much
  37. //extra space to make the height of the security
  38. //tool bar when the buttons are resized because
  39. //of mode and/or popup count changes.
  40. const SEC_BAR_EXTRA_HEIGHT = 4;
  41.  
  42. var gRDF = null;
  43. var gGlobalHistory = null;
  44. var gURIFixup = null;
  45. var gPageStyleButton = null;
  46. var gLivemarksButton = null;
  47. var gCharsetMenu = null;
  48. var gLastBrowserCharset = null;
  49. var gPrevCharset = null;
  50. var gURLBar = null;
  51. var gProxyButton = null;
  52. var gProxyFavIcon = null;
  53. var gProxyDeck = null;
  54. var gNavigatorBundle = null;
  55. var gIsLoadingBlank = false;
  56. var gLastValidURLStr = "";
  57. var gLastValidURL = null;
  58. var gHaveUpdatedToolbarState = false;
  59. var gClickSelectsAll = false;
  60. var gIgnoreFocus = false;
  61. var gIgnoreClick = false;
  62. var gMustLoadSidebar = false;
  63. var gProgressMeterPanel = null;
  64. var gProgressCollapseTimer = null;
  65. var gPrefService = null;
  66. var appCore = null;
  67. var gBrowser = null;
  68. var gSidebarCommand = "";
  69. var gReportButton = null;
  70. var gGetTridentDocDefined=true;
  71.  
  72. // Global variable that holds the nsContextMenu instance.
  73. var gContextMenu = null;
  74.  
  75. var gChromeState = null; // chrome state before we went into print preview
  76.  
  77. var gFormFillPrefListener = null;
  78. var gFormHistory = null;
  79. var gFormFillEnabled = true;
  80.  
  81. var gURLBarAutoFillPrefListener = null;
  82.  
  83. var afDataMgr = null;
  84. var gOptout = null;
  85.  
  86. var isButtonToggle = true;
  87.  
  88. var rssFeed= null;
  89. var isSameUri=null;
  90.  
  91. var gPrevSelectedTextForContextMenu = "";
  92. var gContextMenuTimeoutId = -1;
  93. var urlLoadFromBar = false;    // MERC - Stevo : indicates if we are loading the url from the bar for bubble help
  94. var gDownloadObserver = null; // MERC (rpaul) : object which determines if a download has just been completed
  95.  
  96. // MERC (rpaul) : on window resize reposition the security dashboard if open
  97. window.onresize = function onresize() {
  98.     if (dashboard.mDashboardWindow != null) {
  99.         dashboard.mDashboardWindow.RepositionDashboard();
  100.     }
  101. }
  102.  
  103. if (BROWSER_DEBUG) {    
  104.     browserDebug = function(msg){    
  105.         dump('**** -- browser.js: '+msg+'\n');
  106.     }
  107. } else {        
  108.     browserDebug = function (msg) {};
  109. }
  110.  
  111. function showStack() {
  112.     browserDebug("\n STACK DUMP: \n");
  113.     try {
  114.         var borkbork = 1 / 0;
  115.         var foobar;
  116.         foobar.Cannibal;
  117.         throw "foobar";
  118.     } catch (e){
  119.         browserDebug(e.stack);
  120.     }
  121. }
  122.     
  123. // MERC (Stevo) Added so we can thread the updates to the dashboard
  124. // This is used mostly for tab switching since the update can take some time.
  125. function updateDashboard() {
  126.   dashboard.init();
  127.  
  128.     if (dashboard.mDashboardWindow != null) {
  129.         dashboard.debug(dashboard.mDashboardWindow);
  130.         // some hackery so that the script has a chance to load...
  131.         setTimeout('dashboard.mDashboardWindow.UpdateSecurityDashboard()', 50);
  132.     } else {
  133.         // dashboard window isn't open, should we expose it?
  134.         if (dashboard.mCurrentSiteStatus == 'critical' && dashboard.shouldAutoExpose()) {
  135.             OpenDashboardWindow('fade');
  136.         }
  137.     }
  138. }
  139.  
  140. /*** MERC : Stevo Added for bubble help showing on particular URLS ***/
  141. function doFeatureDiscovery(uri)
  142. {
  143.     // MERC - Stevo: do not load bubble help unless we are navigating in the url bar
  144.     if (!urlLoadFromBar) {
  145.         return;
  146.     }
  147.  
  148.  
  149.    // MERC: SL - Is feature discovery enabled?
  150.    // featurediscovery.dat
  151.    //  0   1    2       3     4
  152.    // url|type|element|title|description
  153.    //browserDebug("checking feature for : " + uri + "\n");
  154.    try {
  155.             var fdType = null;
  156.             var elementID = null;
  157.             // If selected component has feature discovery, return its information (e.g. searchbar).
  158.             fdType = featureDiscovery.ProcessFeatureDiscovery(uri);
  159.             if (fdType) {
  160.                 if (fdType[2].substring(0,4) == "spui")
  161.                 {
  162.                     if (spui)
  163.                     {
  164.                         elementID = spui.GetFirstSpuiButtonID(fdType[2]);
  165.                     }
  166.                 } else if (fdType[2].indexOf(":") >= 0) {
  167.                     var tokens = fdType[2].split(':');
  168.                     var parentID = document.getElementById(tokens[0]);
  169.                     if (parentID)
  170.                     {
  171.                         if(tokens[0] == "searchbar" && !isToolbarItemVisible("search-container")) {
  172.                           elementId = null;
  173.                         }
  174.                       else {
  175.                           elementID = document.getAnonymousElementByAttribute(parentID, 'class', tokens[1]);
  176.                         }
  177.                     }
  178.                 } else {
  179.                     elementID = document.getElementById(fdType[2]);
  180.                 }
  181.  
  182.                 if (elementID) {
  183.                     balloonhelp.ShowBalloonHelp(uri, elementID, fdType[3], fdType[4], fdType[1]);
  184.                 }
  185.             }
  186.    } catch (e)
  187.    {
  188.            browserDebug ("Caught Exception: " + e + "\n");
  189.       //browserDebug ("Likely cause: browser.featurediscovery.enabled has unknown value.\n");
  190.    }
  191.  
  192.         // MERC - Stevo: (Reset) flag that says we are loading from the url bar.
  193.         urlLoadFromBar = false;
  194. }
  195. /* **** End MERC ***/
  196.  
  197.  
  198. function isToolbarItemVisible(itemId) {
  199.   var thisItem = document.getElementById(itemId);
  200.   if(!thisItem) {
  201.     return false;
  202.   }
  203.   var theParentNode = thisItem.parentNode;
  204.   if(!theParentNode) {
  205.     return false;
  206.   }
  207.  
  208.   var isVisible = true;
  209.   for(var p = theParentNode; p; p = p.parentNode) {
  210.     try {
  211.       if("false" == String(p.getAttribute("isActive"))
  212.         || p.hidden
  213.         || p.collapsed) {
  214.         isVisible = false;
  215.         break;
  216.       }
  217.     }
  218.     catch(ex) {
  219.     }
  220.   }
  221.  
  222.   if(!isVisible) {
  223.     return isVisible;
  224.   }
  225.  
  226.   isVisible = false;
  227.   // check if the the search bar is truely contained by its parent, or is an overflow item
  228.   for(var i = 0; i < theParentNode.childNodes.length; i++) {
  229.     if(theParentNode.childNodes[i].id == itemId) {
  230.       var thisItem = theParentNode.childNodes[i];
  231.       isVisible = (!thisItem.hidden && !thisItem.getAttribute("toolbaroverflow") && !thisItem.collapsed) ;
  232.       break;
  233.     }
  234.   }
  235.  
  236.   return isVisible;
  237. }
  238.  
  239. /**
  240. * We can avoid adding multiple load event listeners and save some time by adding
  241. * one listener that calls all real handlers.
  242. */
  243.  
  244. function loadEventHandlers(event)
  245. {
  246.     // Filter out events that are not about the document load we are interested in
  247.     if (event.originalTarget == _content.document) {
  248.         try {
  249.             UpdateInternetSearchResults(event); // MERC JA migration ff5->vulpine
  250.         } catch (ex) { }
  251.         checkForDirectoryListing();
  252.         charsetLoadListener(event);
  253.         updatePageLivemarks();
  254.  
  255.     }
  256.  
  257.     // some event handlers want to be told what the original browser/listener is
  258.     var targetBrowser = null;
  259.     var targetListener = null;
  260.     if (gBrowser.mTabbedMode) {
  261.         var targetBrowserIndex = gBrowser.getBrowserIndexForDocument(event.originalTarget);
  262.         if (targetBrowserIndex == -1)
  263.             return;
  264.  
  265.         targetBrowser = gBrowser.getBrowserAtIndex(targetBrowserIndex);
  266.         targetListener = gBrowser.mTabListeners[targetBrowserIndex];
  267.     } else {
  268.         targetBrowser = gBrowser.mCurrentBrowser;
  269.         targetListener = null;      // no listener for non-tabbed-mode
  270.     }
  271.  
  272.     updatePageFavIcon(targetBrowser, targetListener);
  273.  
  274.     // update the last visited date
  275.     if (targetBrowser.currentURI.spec)
  276.         BMSVC.updateLastVisitedDate(targetBrowser.currentURI.spec,
  277.                                     targetBrowser.contentDocument.characterSet);
  278.  
  279. }
  280.  
  281. /**
  282. * This is called in Startup() to append the profile name to the File "Log Out" menu item
  283. */
  284. function setLogOutText()
  285. {
  286.     var profileSrv = Components.classes["@mozilla.org/toolkit/profile-service;1"]
  287.                              .getService(Components.interfaces.nsIToolkitProfileService);
  288.  
  289.     // get the logged in profile
  290.     var profile = null;
  291.     try{
  292.         if (profileSrv.selectedProfileName == ""){
  293.             profile = profileSrv.selectedProfile;            
  294.         } else {
  295.             profile = profileSrv.getProfileByName(profileSrv.selectedProfileName);
  296.         }            
  297.     }catch(e){
  298.         // If an error occurs 
  299.         browserDebug ("setLogOutText() - Caught Exception: " + e.message + "\n");    
  300.         return;    
  301.     }
  302.  
  303.     if (profile) {
  304.         var logOutMenuItem = document.getElementById("logOutMenuitem");
  305.         // append the profile name to the "Log out" text
  306.         // BLT 211334: no displayName defined in 8.0.4
  307.         if(profile.displayName.length == 0)
  308.             profile.displayName = profile.name;
  309.         logOutMenuItem.label = logOutMenuItem.label + " " + profile.displayName;
  310.     }
  311. }
  312.  
  313.  
  314. /**
  315. * Determine whether or not the content area is displaying a page with frames,
  316. * and if so, toggle the display of the 'save frame as' menu item.
  317. **/
  318. function getContentAreaFrameCount()
  319. {
  320.     var iDF = false;
  321.     try
  322.     {
  323.         iDF = isDocumentFrame(document.commandDispatcher.focusedWindow);
  324.     }
  325.     catch(e) { browserDebug ("Caught Exception: " + e + "\n");}
  326.  
  327.     var saveFrameItem = document.getElementById("menu_saveFrame");
  328.     if (!content || !_content.frames.length || !iDF)
  329.     saveFrameItem.setAttribute("hidden", "true");
  330. else
  331.     saveFrameItem.removeAttribute("hidden");
  332. }
  333.  
  334. //////////////////////////////// BOOKMARKS ////////////////////////////////////
  335.  
  336. function UpdateBookmarksLastVisitedDate(event)
  337. {
  338.     var url = getWebNavigation().currentURI.spec;
  339.     if (url) {
  340.         // if the URL is bookmarked, update its "Last Visited" date
  341.         BMSVC.updateLastVisitedDate(url, _content.document.characterSet);
  342.     }
  343. }
  344.  
  345. function HandleBookmarkIcon(iconURL, addFlag)
  346. {
  347.     var url = getWebNavigation().currentURI.spec
  348.     if (url) {
  349.         // update URL with new icon reference
  350.         if (addFlag) {
  351.             // MERC: TODO: ccampbell: This function call should not use nulls.
  352.             // Unfortunately the function spec changed between foxforce5 and vulpine
  353.             // so we will need to do more here in order for this to work properly...
  354.             // See bookmarks.js for example usage.
  355.             if (BMSVC) BMSVC.updateBookmarkIcon(url, null, null, 0);
  356.         } else {
  357.             if (BMSVC) BMSVC.removeBookmarkIcon(url);
  358.         }
  359.     }
  360. }
  361.  
  362. function UpdateBackForwardButtons()
  363. {
  364.     var backBroadcaster = document.getElementById("Browser:Back");
  365.     var forwardBroadcaster = document.getElementById("Browser:Forward");
  366.  
  367.     var webNavigation = gBrowser.webNavigation;
  368.  
  369.     // Avoid setting attributes on broadcasters if the value hasn't changed!
  370.     // Remember, guys, setting attributes on elements is expensive!  They
  371.     // get inherited into anonymous content, broadcast to other widgets, etc.!
  372.     // Don't do it if the value hasn't changed! - dwh
  373.  
  374.     var backDisabled = backBroadcaster.hasAttribute("disabled");
  375.     var backQuasiDisabled = backBroadcaster.hasAttribute("quasiDisabled");
  376.     var forwardDisabled = forwardBroadcaster.hasAttribute("disabled");
  377.  
  378.     // JMC - Performance hit for logic clarity
  379.  
  380.     switch (webNavigation.canGoBack)
  381.     {
  382.         case true:
  383.             if (backDisabled)
  384.             {
  385.                 backBroadcaster.removeAttribute("disabled");
  386.             }
  387.             if (backQuasiDisabled)
  388.             {
  389.                 backBroadcaster.removeAttribute("quasiDisabled");
  390.             }
  391.             break;
  392.  
  393.         case false:
  394.             if (gBrowser.mTabContainer.childNodes.length == 1) // Last tab
  395.             {
  396.                 if (!backDisabled)
  397.                 {
  398.                     backBroadcaster.setAttribute("disabled", true);
  399.                 }
  400.                 if (backQuasiDisabled)
  401.                 {
  402.                     backBroadcaster.removeAttribute("quasiDisabled");
  403.                 }
  404.             } else {
  405.                 if (!backQuasiDisabled)
  406.                 {
  407.                     backBroadcaster.setAttribute("quasiDisabled", true);
  408.                 }
  409.                 if (backDisabled)
  410.                 {
  411.                     backBroadcaster.removeAttribute("disabled");
  412.                 }
  413.             }
  414.             break;
  415.     }
  416.  
  417.     /*
  418.     if (backDisabled == webNavigation.canGoBack) {
  419.         if (backDisabled)
  420.         {
  421.             backBroadcaster.removeAttribute("disabled");
  422.             backBroadcaster.removeAttribute("quasiDisabled");
  423.         }    else {
  424.             backBroadcaster.setAttribute("quasiDisabled");
  425.         }
  426.     }
  427.  
  428.     if (backQuasiDisabled && gBrowser.mTabContainer.childNodes.length == 1) // Last tab
  429.     {
  430.         backBroadcaster.setAttribute("disabled", true);
  431.         backBroadcaster.removeAttribute("quasiDisabled");
  432.     }
  433.  
  434.     if (!backQuasiDisabled && gBrowser.mTabContainer.childNodes.length > 1 && !webNavigation.canGoBack)
  435.     {
  436.             backBroadcaster.setAttribute("quasiDisabled");
  437.     }
  438.     */
  439.  
  440.  
  441.     if (forwardDisabled == webNavigation.canGoForward) {
  442.         if (forwardDisabled)
  443.         forwardBroadcaster.removeAttribute("disabled");
  444.     else
  445.         forwardBroadcaster.setAttribute("disabled", true);
  446.     }
  447. }
  448.  
  449. // MERC - JCH : changed pageReport to removePRIcon to check for icon display
  450. function UpdatePageReport(event)
  451. {
  452.     if (!gReportButton)
  453.         gReportButton = document.getElementById("page-report-button");
  454.  
  455.  
  456.     if (gBrowser.selectedBrowser.showPageReportIcon) {
  457.  
  458.         gReportButton.setAttribute("blocked", "true");
  459.  
  460.         if (gPrefService && gPrefService.getBoolPref("privacy.popups.firstTime")) {
  461.             displayPageReportFirstTime();
  462.  
  463.             // Now set the pref.
  464.             gPrefService.setBoolPref("privacy.popups.firstTime", "false");
  465.         }
  466.  
  467.         if (gPrefService && gPrefService.getBoolPref("privacy.popups.showBrowserMessage")) {
  468.             displayNotificationBar("popup");
  469.         }
  470.     } else {
  471.         gReportButton.removeAttribute("blocked");
  472.     }
  473. }
  474.  
  475.  
  476.  
  477. const gSessionHistoryObserver = {
  478.     observe: function(subject, topic, data)
  479.     {
  480.         if (topic != "browser:purge-session-history")
  481.             return;
  482.  
  483.         var backCommand = document.getElementById("Browser:Back");
  484.         backCommand.setAttribute("disabled", "true");
  485.         var fwdCommand = document.getElementById("Browser:Forward");
  486.         fwdCommand.setAttribute("disabled", "true");
  487.     }
  488. };
  489.  
  490. const gPopupBlockerObserver = {
  491.     _reportButton: null,
  492.     _kIPM: Components.interfaces.nsIPermissionManager,
  493.  
  494.     onUpdatePageReport: function ()
  495.     {
  496.         if (!this._reportButton)
  497.             this._reportButton = document.getElementById("page-report-button");
  498.  
  499.         if (gBrowser.selectedBrowser.pageReport) {
  500.             this._reportButton.setAttribute("blocked", "true");
  501.             if (gPrefService && gPrefService.getBoolPref("privacy.popups.showBrowserMessage")) {
  502.                 displayNotificationBar("popup");
  503.             }
  504.         }
  505.         else
  506.             this._reportButton.removeAttribute("blocked");
  507.     },
  508.  
  509.     toggleAllowPopupsForSite: function (aEvent)
  510.     {
  511.         var currentURI = gBrowser.selectedBrowser.webNavigation.currentURI;
  512.         var pm = Components.classes["@mozilla.org/permissionmanager;1"]
  513.                            .getService(this._kIPM);
  514.         var shouldBlock = aEvent.target.getAttribute("block") == "true";
  515.         var perm = shouldBlock ? this._kIPM.DENY_ACTION : this._kIPM.ALLOW_ACTION;
  516.         pm.add(currentURI, "popup", perm);
  517.  
  518.         hideNotificationBar("popup", gBrowser);
  519.         // gBrowser.hideMessage(gBrowser.selectedBrowser, "top");
  520.     },
  521.  
  522.     fillPopupList: function (aEvent)
  523.     {
  524.         var bundle_browser = document.getElementById("bundle_browser");
  525.         // XXXben - rather than using |currentURI| here, which breaks down on multi-framed sites
  526.         //          we should really walk the pageReport and create a list of "allow for <host>"
  527.         //          menuitems for the common subset of hosts present in the report, this will
  528.         //          make us frame-safe.
  529.         var uri = gBrowser.selectedBrowser.webNavigation.currentURI;
  530.         var blockedPopupAllowSite = document.getElementById("blockedPopupAllowSite");
  531.         try {
  532.             blockedPopupAllowSite.removeAttribute("hidden");
  533.  
  534.             var pm = Components.classes["@mozilla.org/permissionmanager;1"]
  535.                                .getService(this._kIPM);
  536.             if (pm.testPermission(uri, "popup") == this._kIPM.ALLOW_ACTION) {
  537.                 // Offer an item to block popups for this site, if a whitelist entry exists
  538.                 // already for it.
  539.                 var blockString = bundle_browser.getFormattedString("popupBlock", [uri.host]);
  540.                 blockedPopupAllowSite.setAttribute("label", blockString);
  541.                 blockedPopupAllowSite.setAttribute("block", "true");
  542.             }
  543.         else {
  544.             // Offer an item to allow popups for this site
  545.             var allowString = bundle_browser.getFormattedString("popupAllow", [uri.host]);
  546.             blockedPopupAllowSite.setAttribute("label", allowString);
  547.             blockedPopupAllowSite.removeAttribute("block");
  548.         }
  549.     }
  550.     catch (e) {
  551.         blockedPopupAllowSite.setAttribute("hidden", "true");
  552.     }
  553.  
  554.     var item = aEvent.target.lastChild;
  555.     while (item && item.getAttribute("observes") != "blockedPopupsSeparator") {
  556.         var next = item.previousSibling;
  557.         item.parentNode.removeChild(item);
  558.         item = next;
  559.     }
  560.     var pageReport = gBrowser.selectedBrowser.pageReport;
  561.     if (pageReport && pageReport.length > 0) {
  562.         var blockedPopupsSeparator = document.getElementById("blockedPopupsSeparator");
  563.         blockedPopupsSeparator.removeAttribute("hidden");
  564.         for (var i = 0; i < pageReport.length; ++i) {
  565.             var popupURIspec = pageReport[i].popupWindowURI.spec;
  566.             if (popupURIspec == "" || popupURIspec == "about:blank" ||
  567.                 popupURIspec == uri.spec)
  568.             {
  569.                 continue;
  570.             }
  571.  
  572.             var menuitem = document.createElement("menuitem");
  573.             var label = bundle_browser.getFormattedString("popupShowPopupPrefix",
  574.                                                           [popupURIspec]);
  575.             menuitem.setAttribute("label", label);
  576.             menuitem.setAttribute("requestingWindowURI", pageReport[i].requestingWindowURI.spec);
  577.             menuitem.setAttribute("popupWindowURI", popupURIspec);
  578.             menuitem.setAttribute("popupWindowFeatures", pageReport[i].popupWindowFeatures);
  579.             menuitem.setAttribute("oncommand", "gPopupBlockerObserver.showBlockedPopup(event);");
  580.             aEvent.target.appendChild(menuitem);
  581.         }
  582.     }
  583.     else {
  584.         var blockedPopupsSeparator = document.getElementById("blockedPopupsSeparator");
  585.         blockedPopupsSeparator.setAttribute("hidden", "true");
  586.     }
  587.  
  588.     var blockedPopupDontShowMessage = document.getElementById("blockedPopupDontShowMessage");
  589.     var showMessage = gPrefService.getBoolPref("privacy.popups.showBrowserMessage");
  590.     blockedPopupDontShowMessage.setAttribute("checked", !showMessage);
  591.     if (aEvent.target.localName == "popup")
  592.         blockedPopupDontShowMessage.setAttribute("label", bundle_browser.getString("popupWarningDontShowFromMessage"));
  593.     else
  594.         blockedPopupDontShowMessage.setAttribute("label", bundle_browser.getString("popupWarningDontShowFromStatusbar"));
  595. },
  596.  
  597. _findChildShell: function (aDocShell, aSoughtURI)
  598. {
  599.     var webNav = aDocShell.QueryInterface(Components.interfaces.nsIWebNavigation);
  600.     if (webNav.currentURI.spec == aSoughtURI.spec)
  601.     return aDocShell;
  602.  
  603.     var node = aDocShell.QueryInterface(Components.interfaces.nsIDocShellTreeNode);
  604.     for (var i = 0; i < node.childCount; ++i) {
  605.         var docShell = node.getChildAt(i);
  606.         docShell = this._findChildShell(docShell, aSoughtURI);
  607.         if (docShell)
  608.             return docShell;
  609.     }
  610.     return null;
  611. },
  612.  
  613. showBlockedPopup: function (aEvent)
  614. {
  615.     var requestingWindowURI = Components.classes["@mozilla.org/network/standard-url;1"]
  616.                                         .createInstance(Components.interfaces.nsIURI);
  617.     requestingWindowURI.spec = aEvent.target.getAttribute("requestingWindowURI");
  618.     var popupWindowURI = aEvent.target.getAttribute("popupWindowURI");
  619.     var features = aEvent.target.getAttribute("popupWindowFeatures");
  620.  
  621.     var shell = this._findChildShell(gBrowser.selectedBrowser.docShell,
  622.                                      requestingWindowURI);
  623.     if (shell) {
  624.         var ifr = shell.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
  625.         var dwi = ifr.getInterface(Components.interfaces.nsIDOMWindowInternal);
  626.         // XXXben - nsIDOMPopupBlockedEvent needs to store target, too!
  627.         dwi.open(popupWindowURI, "", features);
  628.     }
  629. },
  630.  
  631. editPopupSettings: function ()
  632. {
  633.     var host = "";
  634.     try {
  635.         var uri = gBrowser.selectedBrowser.webNavigation.currentURI;
  636.         host = uri.host;
  637.     }
  638.     catch (e) { }
  639.  
  640.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  641.                        .getService(Components.interfaces.nsIWindowMediator);
  642.     var existingWindow = wm.getMostRecentWindow("exceptions");
  643.     if (existingWindow) {
  644.         existingWindow.setHost(host);
  645.         existingWindow.focus();
  646.     }
  647.     else {
  648.         var params = { blockVisible: false,
  649.                        allowVisible: true,
  650.                        prefilledHost: host,
  651.                        permissionType: "popup" };
  652.         window.openDialog("chrome://browser/content/cookieviewer/CookieExceptions.xul?permission=popup",
  653.                           "_blank", "chrome,modal,resizable=yes", params);
  654.     }
  655. },
  656.  
  657. dontShowMessage: function ()
  658. {
  659.     var showMessage = gPrefService.getBoolPref("privacy.popups.showBrowserMessage");
  660.     var firstTime = gPrefService.getBoolPref("privacy.popups.firstTime");
  661.  
  662.     // If the info message is showing at the top of the window, and the user has never
  663.     // hidden the message before, show an info box telling the user where the info
  664.     // will be displayed.
  665.     if (showMessage && firstTime)
  666.         this._displayPageReportFirstTime();
  667.  
  668.     gPrefService.setBoolPref("privacy.popups.showBrowserMessage", !showMessage);
  669.  
  670.     hideNotificationBar("popup", gBrowser);
  671. },
  672.  
  673. _displayPageReportFirstTime: function ()
  674. {
  675.     window.openDialog("chrome://browser/content/pageReportFirstTime.xul", "_blank",
  676.     "dependent");
  677. }
  678. };
  679.  
  680. const gXPInstallObserver = {
  681.     _findChildShell: function (aDocShell, aSoughtShell)
  682.     {
  683.         if (aDocShell == aSoughtShell)
  684.             return aDocShell;
  685.  
  686.         var node = aDocShell.QueryInterface(Components.interfaces.nsIDocShellTreeNode);
  687.         for (var i = 0; i < node.childCount; ++i) {
  688.             var docShell = node.getChildAt(i);
  689.             docShell = this._findChildShell(docShell, aSoughtShell);
  690.             if (docShell == aSoughtShell)
  691.                 return docShell;
  692.         }
  693.         return null;
  694.     },
  695.  
  696.     _getBrowser: function (aDocShell)
  697.     {
  698.         var tabbrowser = getBrowser();
  699.         for (var i = 0; i < tabbrowser.browsers.length; ++i) {
  700.             var browser = tabbrowser.getBrowserAtIndex(i);
  701.             var soughtShell = aDocShell;
  702.             var shell = this._findChildShell(browser.docShell, soughtShell);
  703.             if (shell)
  704.                 return browser;
  705.         }
  706.         return null;
  707.     },
  708.  
  709.     observe: function (aSubject, aTopic, aData)
  710.     {
  711.         var brandBundle = document.getElementById("bundle_brand");
  712.         var browserBundle = document.getElementById("bundle_browser");
  713.         switch (aTopic) {
  714.         case "xpinstall-install-blocked":
  715.             var shell = aSubject.QueryInterface(Components.interfaces.nsIDocShell);
  716.             browser = this._getBrowser(shell);
  717.             if (browser) {
  718.                 var extraData = new Array();
  719.                 extraData.push(shell);
  720.                 displayNotificationBar("xpi", extraData);
  721.             }
  722.             break;
  723.  
  724.         case "xpinstall-install-edit-prefs":
  725.             var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  726.                                .getService(Components.interfaces.nsIWindowMediator);
  727.             var optionsWindow = wm.getMostRecentWindow("Browser:Options");
  728.             if (optionsWindow) {
  729.                 optionsWindow.focus();
  730.                 optionsWindow.switchPage("catFeaturesbutton");
  731.             }
  732.             else
  733.                 openDialog("chrome://browser/content/pref/pref.xul", "PrefWindow",
  734.                            "chrome,titlebar,resizable,modal", "catFeaturesbutton");
  735.             var tabbrowser = getBrowser();
  736.             // tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  737.             hideNotificationBar("xpi", tabbrowser);
  738.             break;
  739.  
  740.         case "xpinstall-install-edit-permissions":
  741.             var browser = this._getBrowser(aSubject.QueryInterface(Components.interfaces.nsIDocShell));
  742.             if (browser) {
  743.                 var webNav = aSubject.QueryInterface(Components.interfaces.nsIWebNavigation);
  744.                 var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  745.                                    .getService(Components.interfaces.nsIWindowMediator);
  746.                 var existingWindow = wm.getMostRecentWindow("exceptions");
  747.                 if (existingWindow) {
  748.                     existingWindow.setHost(webNav.currentURI.host);
  749.                     existingWindow.focus();
  750.                 }
  751.                 else {
  752.                     var params = { blockVisible:    false,
  753.                     allowVisible:    true,
  754.                     prefilledHost:   webNav.currentURI.host,
  755.                     permissionType:  "install" };
  756.                     window.openDialog("chrome://browser/content/cookieviewer/CookieExceptions.xul?permission=install",
  757.                                       "_blank", "chrome,modal,resizable=yes", params);
  758.                 }
  759.                 var tabbrowser = getBrowser();
  760.                 // tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  761.                 hideNotificationBar("xpi", tabbrowser);
  762.             }
  763.             break;
  764.         }
  765.     }
  766. };
  767.  
  768. function Startup()
  769. {
  770.     browserDebug("Startup()\n");
  771.     document.ApplyPersistentAttributes();
  772.     gBrowser = document.getElementById("content");
  773.  
  774.     // Allows Trident to update security (SSL) state; see nsHTMLPluginDocument.cpp.
  775.     // We can easily get fields from the window, but not from the browser object.
  776.     window.securityUI = gBrowser.securityUI;
  777.  
  778.     gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
  779.                              .getService(Components.interfaces.nsIPrefBranch);
  780.  
  781.     titlebar.init();
  782.     moveMenubar();
  783.  
  784.     // Mercurial START
  785.     sitecontrols.initServices();
  786.     perfmon.initServices();
  787.     search.Init();
  788.     TabHistoryList.Init();
  789.  
  790. /*
  791.     // MERC: NAJ Removed to expose desktop search consistiently in the UI
  792.     // MERC: RT Hide the desktop search menu when appropriate
  793.     manageToolsMenuForDesktopSearch();
  794. */
  795.  
  796.     // MERC: SL Is feature discovery enabled?
  797.     try {
  798.         if (gPrefService.getPrefType("browser.featurediscovery.enabled") &&
  799.             gPrefService.getBoolPref("browser.featurediscovery.enabled"))
  800.         {
  801.             featureDiscovery.Init();
  802.         }
  803.     } catch(e) {
  804.         browserDebug ("Caught exception: " + e + "\n");
  805.         browserDebug ("Likely cause: browser.featurediscovery.enabled set to unknown value.\n");
  806.     }
  807.  
  808.     try {
  809.         balloonhelp.Init('BalloonHelpTip');
  810.         var balloonHelpOn = balloonhelp.GetBalloonHelpPreference();
  811.         var balloonMenu = document.getElementById("balloonHelpMenu");
  812.         if (balloonMenu) {
  813.             if (balloonHelpOn)
  814.                 balloonMenu.setAttribute("checked", true);
  815.             else
  816.                 balloonMenu.removeAttribute("checked");
  817.         }
  818.         // Update the broadcaster
  819.         var balloonBroadcaster = document.getElementById('balloonBroadcaster');
  820.         if (balloonBroadcaster) {
  821.             balloonBroadcaster.setAttribute('showballoon', balloonHelpOn ? "true" : "false");
  822.         }
  823.     } catch (e) {
  824.         browserDebug ("Caught exception: " + e + "\n");
  825.     }
  826.  
  827.     passcardUtilsInit();
  828.  
  829.     // need to set up this observer early to deal with field highlighting in Passcards/Datacards
  830.     var docIsFillable=new docEndObserver();
  831.     var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  832.     os.addObserver(docIsFillable, "EndDocumentLoad", false);
  833.  
  834.     // Mercurial END
  835.  
  836.     var uriToLoad = null;
  837.     // Check for window.arguments[0]. If present, use that for uriToLoad.
  838.     if ("arguments" in window && window.arguments.length >= 1 && window.arguments[0])
  839.         uriToLoad = window.arguments[0];
  840.     // Bug #298255
  841.  
  842.     //Merc BH: fix for Moz bug 301073 (blt#194660), chrome home pages broken (cannot startup successfully if homepage is set to a chrome:// url)
  843.     //replace any home pages set to chrome urls to about:blank
  844.     try {
  845.         //cycle throught the URIs and replace any chrome ones with about:blank
  846.         var uriList = uriToLoad.split('|');
  847.         var currentUrl = null;
  848.         for(var i = 0;i<uriList.length;i++)
  849.         {
  850.             try
  851.             {
  852.                 //if the url is not properly formatted an exception will be raised.
  853.                 //skip it and go on to the next one.
  854.                 currentUrl = makeURL(uriList[i]);
  855.             }
  856.             catch(ex)
  857.             {
  858.                 continue;
  859.             }
  860.             if(currentUrl.schemeIs("chrome"))
  861.             {
  862.                 browserDebug("Preventing external load of chrome: URI\n");
  863.                 //set the uriToLoad to about:blank
  864.                 uriList[i] = 'about:blank';
  865.             }
  866.         }
  867.  
  868.         //update the uri string
  869.         uriToLoad = uriList.join('|');
  870.  
  871.     } catch(e) {}
  872.  
  873.     // MERC (DP): on first startup of browser, we show the Netscape welcome page
  874.     pref = Components.classes["@mozilla.org/preferences-service;1"]
  875.                      .getService(Components.interfaces.nsIPrefBranch);
  876.     // JMC: Fix this, it causes no pages on startup bug
  877.     var firstTime = pref.getBoolPref("browser.startup.firsttime");
  878.     if (firstTime) {
  879.         uriToLoad = uriToLoad + '|' + pref.getCharPref("browser.startup.welcomepage");
  880.         pref.setBoolPref("browser.startup.firsttime", false);
  881.     }
  882.  
  883.     // MERC (rpaul) if window shaping is define, move the menu to the left and move
  884.     // the throbber to the right
  885.  
  886.     // read the property from the properties file
  887.     // N.B. for future themers this file should be placed in the theme jar
  888.     var windowShapingBundle = document.getElementById("drawOsBorder");
  889.     var drawOsWindowBorder = windowShapingBundle.getString("ShowOSTitleBar");
  890.  
  891.     if (drawOsWindowBorder) {
  892.         if (drawOsWindowBorder == 1) {
  893.             gPrefService.setBoolPref("browser.menu_in_titlebar", false);
  894.             moveMenubar();
  895.  
  896.             // remove toggle menu bar position from context menu
  897.             var toggleMenuItem = document.getElementById('menuitem_toggleMenuBar');
  898.             if (toggleMenuItem) {
  899.                 document.getElementById('toolbar-context-menu').removeChild(toggleMenuItem);
  900.             }
  901.  
  902.             // remove the throbber from the top-box
  903.             var throbber = document.getElementById('throbber-box');
  904.             if (throbber) {
  905.                 document.getElementById('topstack').removeChild(throbber);
  906.             }
  907.  
  908.         } else {
  909.             // not window shaping, so remove throbber as a toolbar item
  910.             var toolbox = document.getElementById('navigator-toolbox');
  911.             var navBar = document.getElementById('nav-bar');
  912.             var throbberToolbarItem = document.getElementById('throbber-button');
  913.             if (toolbox && throbberToolbarItem){
  914.                 for (var i = toolbox.firstChild; i; i = i.nextSibling) {
  915.                     if (i.localName == 'toolbar') {
  916.                         try {
  917.                             i.removeChild(throbberToolbarItem);
  918.                         } catch (ex) {}
  919.                     } else if (i.localName == 'multibar') {
  920.                         for (var j=i.firstChild;j;j=j.nextSibling) {
  921.                             if (j.localName == "multibartray") {
  922.                                 try {
  923.                                     j.removeChild(throbberToolbarItem);
  924.                                 } catch (ex) {}
  925.                             }
  926.                         }
  927.                     }
  928.                 }
  929.             }
  930.             if (navBar && throbberToolbarItem) {
  931.                 // remove from default toolbar set
  932.                 var defaultSet = navBar.getAttribute('defaultset');
  933.                 var strPos;
  934.                 strPos = defaultSet.indexOf('throbber-button');
  935.                 if (strPos != -1) {
  936.                         if (defaultSet.length > strPos + 15)
  937.                             navBar.setAttribute('defaultset', defaultSet.substring(0, strPos-1) + defaultSet.substring(strPos+15));
  938.                         else
  939.                             navBar.setAttribute('defaultset', defaultSet.substring(0, strPos-1));
  940.                 }
  941.             }
  942.         }
  943.     }
  944.  
  945.     gIsLoadingBlank = uriToLoad == "about:blank";
  946.  
  947.     if (!gIsLoadingBlank)
  948.         prepareForStartup();
  949.  
  950.  
  951.     // only load url passed in when we're not page cycling
  952.     if (uriToLoad && !gIsLoadingBlank) {
  953.         if ("arguments" in window && window.arguments.length >= 3)
  954.             loadURI(uriToLoad, window.arguments[2], null);
  955.         else
  956.         {
  957.             loadOneOrMoreURIs(uriToLoad);
  958.             // MERC (DP): select the about tab browsing tab on first time
  959.             if (firstTime)
  960.             {
  961.                 var browserTabs = gBrowser.mTabContainer.childNodes;
  962.                 gBrowser.selectedTab = browserTabs[browserTabs.length - 1];
  963.             }
  964.         }
  965.     }
  966.  
  967.  
  968.         // Determine whether to show the sidebar
  969.         var sidebarBox = document.getElementById("sidebar-box");
  970.         var sidebarSplitter = document.getElementById("sidebar-splitter");
  971.         var sidebarCmd = null;
  972.  
  973.         if (window.opener && !window.opener.closed) {
  974.             if (window.opener.gFindMode == FIND_NORMAL) {
  975.                 var openerFindBar = window.opener.document.getElementById("FindToolbar");
  976.                 if (openerFindBar && !openerFindBar.hidden)
  977.                 openFindBar();
  978.             }
  979.  
  980.             var openerSidebarBox = window.opener.document.getElementById("sidebar-box");
  981.             // The opener can be the hidden window too, if we're coming from the state
  982.             // where no windows are open, and the hidden window has no sidebar box.
  983.             if (openerSidebarBox && !openerSidebarBox.hidden) {
  984.                 sidebarBox.setAttribute("width", openerSidebarBox.boxObject.width);
  985.                 if (openerSidebarBox.hasAttribute("sidebarcommand")) {
  986.                     sidebarCmd = openerSidebarBox.getAttribute("sidebarcommand");
  987.                     sidebarBox.setAttribute("sidebarcommand", sidebarCmd);
  988.                 }
  989.             } else {
  990.                 // The opener sidebar-box is either hidden or non-existent
  991.                 sidebarBox.hidden = true;
  992.                 sidebarSplitter.hidden = true;
  993.             }
  994.         } else {
  995.             // There is no opener
  996.             if (sidebarBox.hasAttribute("sidebarcommand"))
  997.             sidebarCmd = sidebarBox.getAttribute("sidebarcommand");
  998.         }
  999.         if (sidebarCmd) {
  1000.             gMustLoadSidebar = true;
  1001.             sidebarBox.hidden = false;
  1002.             sidebarSplitter.hidden = false;
  1003.             document.getElementById(sidebarCmd).setAttribute("checked", "true");
  1004.         }
  1005.  
  1006.         // Certain kinds of automigration rely on this notification to complete their
  1007.         // tasks BEFORE the browser window is shown.
  1008.         var obs = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1009.         obs.notifyObservers(null, "browser-window-before-show", "");
  1010.  
  1011.         // Set a sane starting width/height for all resolutions on new profiles.
  1012.         if (!document.documentElement.hasAttribute("width")) {
  1013.             var defaultWidth = 994, defaultHeight;
  1014.             if (screen.availHeight <= 600) {
  1015.                 document.documentElement.setAttribute("sizemode", "maximized");
  1016.                 defaultWidth = 610;
  1017.                 defaultHeight = 450;
  1018.             }
  1019.         else {
  1020.             // Create a narrower window for large or wide-aspect displays, to suggest
  1021.             // side-by-side page view.
  1022.             if ((screen.availWidth / 2) >= 800)
  1023.                 defaultWidth = (screen.availWidth / 2) - 20;
  1024.             defaultHeight = screen.availHeight - 10;
  1025.         }
  1026.         document.documentElement.setAttribute("width", defaultWidth);
  1027.         document.documentElement.setAttribute("height", defaultHeight);
  1028.     }
  1029.  
  1030.     // Initialize optout list
  1031.     if (!gOptout)
  1032.     {
  1033.         var optoutInstance = Components.classes['@mozilla.org/optout;1'].getService();
  1034.         gOptout = optoutInstance.QueryInterface(Components.interfaces.nsIOptOutService);
  1035.         if (!gOptout)
  1036.             browserDebug('gOptout has NOT been initialized!\n\n\n');
  1037.     }
  1038.  
  1039.     if (gOptout)
  1040.         gOptout.RefreshSiteList();
  1041.  
  1042.     // update tab chrome
  1043.     gBrowser.updateChromeWhenLastTab();
  1044.  
  1045.  
  1046.  
  1047.     gDownloadObserver = new gDownloads();
  1048.     gDownloadObserver.register();
  1049.  
  1050.     // MERC (DP): append the profile name to the "Log out" File menu item
  1051.     setLogOutText();
  1052.  
  1053.     setTimeout(delayedStartup, 0);
  1054. }
  1055.  
  1056.     function manageToolsMenuForDesktopSearch() {
  1057.  
  1058.         var toolsDesktopSearchCommand = document.getElementById("Tools:DesktopSearch");
  1059.         var desktopSearchMenuItem = document.getElementById("menu_Tools_DesktopSearch");
  1060.  
  1061.         //NAJ - this should be visible at all times per DRD 1.7.5 Diagram 1.11.1
  1062.     //if (desktopSearch.isDesktopSearchAvailable()){
  1063.         toolsDesktopSearchCommand.setAttribute("disabled", "false");
  1064.         desktopSearchMenuItem.setAttribute("hidden", "false");
  1065.     /*
  1066.     } else {
  1067.         toolsDesktopSearchCommand.setAttribute("disabled", "true");
  1068.         desktopSearchMenuItem.setAttribute("hidden", "true");
  1069.     }
  1070.     */
  1071. }
  1072.  
  1073. function prepareForStartup()
  1074. {
  1075.     browserDebug ("prepareForStartup()\n");
  1076.     gURLBar = document.getElementById("urlbar");
  1077.     gNavigatorBundle = document.getElementById("bundle_browser");
  1078.     gProgressMeterPanel = document.getElementById("statusbar-progresspanel");
  1079.     //gBrowser.addEventListener("DOMUpdatePageReport", gPopupBlockerObserver.onUpdatePageReport, false);
  1080.     gBrowser.addEventListener("DOMUpdatePageReport", UpdatePageReport, false);
  1081.     gBrowser.addEventListener("DOMLinkAdded", livemarkOnLinkAdded, false);
  1082.     gBrowser.addEventListener("PluginNotFound", gMissingPluginInstaller.newMissingPlugin, false);
  1083.  
  1084.     var webNavigation;
  1085.     try {
  1086.         // Create the browser instance component.
  1087.         appCore = Components.classes["@mozilla.org/appshell/component/browser/instance;1"]
  1088.         .createInstance(Components.interfaces.nsIBrowserInstance);
  1089.         if (!appCore)
  1090.         throw "couldn't create a browser instance";
  1091.  
  1092.         webNavigation = getWebNavigation();
  1093.         if (!webNavigation)
  1094.         throw "no XBL binding for browser";
  1095.     } catch (e) {
  1096.         alert("Error launching browser window:" + e);
  1097.         window.close(); // Give up.
  1098.         return;
  1099.     }
  1100.  
  1101.     // initialize observers and listeners
  1102.     // and give C++ access to gBrowser
  1103.     window.XULBrowserWindow = new nsBrowserStatusHandler();
  1104.     window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  1105.     .getInterface(Components.interfaces.nsIWebNavigation)
  1106.     .QueryInterface(Components.interfaces.nsIDocShellTreeItem).treeOwner
  1107.     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  1108.     .getInterface(Components.interfaces.nsIXULWindow)
  1109.     .XULBrowserWindow = window.XULBrowserWindow;
  1110.     gBrowser.docShell
  1111.     .QueryInterface(nsCI.nsIDocShellTreeItem)
  1112.     .rootTreeItem
  1113.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  1114.     .getInterface(nsCI.nsIDOMWindow)
  1115.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  1116.     .getInterface(nsCI.nsIDOMWindowUtils)
  1117.     .browserDOMWindow = new nsBrowserAccess();
  1118.  
  1119.     window.browserContentListener =
  1120.     new nsBrowserContentListener(window, gBrowser);
  1121.  
  1122.     // set default character set if provided
  1123.     if ("arguments" in window && window.arguments.length > 1 && window.arguments[1]) {
  1124.         if (window.arguments[1].indexOf("charset=") != -1) {
  1125.             var arrayArgComponents = window.arguments[1].split("=");
  1126.             if (arrayArgComponents) {
  1127.                 //we should "inherit" the charset menu setting in a new window
  1128.                 getMarkupDocumentViewer().defaultCharacterSet = arrayArgComponents[1];
  1129.             }
  1130.         }
  1131.     }
  1132.  
  1133.     // Initialize browser instance..
  1134.     appCore.setWebShellWindow(window);
  1135.  
  1136.     // Wire up session and global history before any possible
  1137.     // progress notifications for back/forward button updating
  1138.     webNavigation.sessionHistory = Components.classes["@mozilla.org/browser/shistory;1"]
  1139.     .createInstance(Components.interfaces.nsISHistory);
  1140.  
  1141.     // enable global history
  1142.     gBrowser.docShell.QueryInterface(Components.interfaces.nsIDocShellHistory).useGlobalHistory = true;
  1143.  
  1144.     const selectedBrowser = gBrowser.selectedBrowser;
  1145.     if (selectedBrowser.securityUI)
  1146.     selectedBrowser.securityUI.init(selectedBrowser.contentWindow);
  1147.  
  1148.     // hook up UI through progress listener
  1149.     gBrowser.addProgressListener(window.XULBrowserWindow, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
  1150.  
  1151. }
  1152.  
  1153. //Added by SLiu, for customize bookmarks toolbar
  1154. function populateBookmarks()
  1155. {
  1156.     var bt = document.getElementById("bookmarks-ptf");
  1157.     if (bt)
  1158.     {
  1159.         var btf = BMSVC.getBookmarksToolbarFolder().Value;
  1160.         bt.ref = btf;
  1161.         document.getElementById("bookmarks-chevron").ref = btf;
  1162.         bt.database.AddObserver(BookmarksToolbarRDFObserver);
  1163.         bt.controllers.appendController(BookmarksMenuController);
  1164.         bt.builder.rebuild();
  1165.     }
  1166.     var bm = document.getElementById("bookmarks-menu");
  1167.     bm.controllers.appendController(BookmarksMenuController);
  1168. }
  1169.  
  1170. function ShowPhishingSiteWarning() {
  1171.     displayNotificationBar("phishing");
  1172. }
  1173. function ShowSpywareSiteWarning() {
  1174.     displayNotificationBar("spyware");
  1175. }
  1176.  
  1177. function docEndObserver()
  1178. {
  1179. }
  1180.  
  1181. docEndObserver.prototype =
  1182. {
  1183.     // Data is a URL
  1184.     // Subject is ?
  1185.     // MSD -> subject is a window for EndDocumentLoad
  1186.     observe: function (subject, topic, data)
  1187.     {
  1188.         if (topic == "EndDocumentLoad") {
  1189. //             browserDebug ("EndDocumentLoad... \n");
  1190.             // JMC: Check to attach formfill controller, if required.
  1191.             gBrowser.attachFormFill();
  1192.  
  1193.             // JMC - disabling 404
  1194.             //if (this.checkRoll(subject, data))
  1195.             //    return;
  1196.             var docType = String(subject.document.contentType);
  1197. //            browserDebug("content type = '"+docType+"'\n");
  1198.             if (docType.indexOf("/xml") > 0)
  1199.             {
  1200.                 var isRss = true;
  1201.                 // First try to process RSS Pretty Print output
  1202.                 var baseElem = subject.document.firstChild;
  1203.                 // find the first element that has child nodes
  1204.                 while (baseElem && !baseElem.hasChildNodes()) {
  1205.                     baseElem = baseElem.nextSibling;
  1206.                 }
  1207.                 var myRssElem = subject.document.getAnonymousElementByAttribute(baseElem,"anonid","rsslinklist");
  1208.                   if (myRssElem) {
  1209. //                      browserDebug("in myRSSElem\n");
  1210.                        var myRssTotal = 0;
  1211.                        var myRssCount = 0;
  1212.                     var myRssNodeList = myRssElem.childNodes;
  1213.                     if (myRssNodeList && myRssNodeList.length) {
  1214.                         for (var i = 0; i<myRssNodeList.length;i++) {
  1215.                             if (myRssNodeList[i].localName == "rsslink") {
  1216.                                 myRssTotal++;
  1217.                                 var tempURL = myRssNodeList[i].getAttribute("thislink");
  1218.                                 if (tempURL) {
  1219. //                                    browserDebug("check global history for "+tempURL+"\n");
  1220.                                     var tempuri = Components.classes["@mozilla.org/network/standard-url;1"]
  1221.                                     .createInstance(Components.interfaces.nsIURI);
  1222.                           try {
  1223.                               tempuri.spec = tempURL;
  1224.                                         if(gGlobalHistory.isVisited(tempuri)) {
  1225.                                             myRssCount++;
  1226.                    //                     else {
  1227.                                             // make the corresponding checkmark appear
  1228. //                                            browserDebug("attempting to show checkmark\n");
  1229.                                             var tempImage = subject.document.getAnonymousElementByAttribute(baseElem,"aref",tempURL);
  1230.                                             if (tempImage) {
  1231. //                                                browserDebug("setting style for checkmark\n");
  1232.                                                 tempImage.removeAttribute("style");
  1233.                                             }
  1234.                                         }
  1235.                                     } catch (e) {}
  1236.                                 }
  1237.                             }
  1238.                         }
  1239.                     }
  1240.                     var myRssTitleElem = null;
  1241.                     myRssTitleElem = subject.document.getAnonymousElementByAttribute(baseElem,"id","rsstitle");
  1242.                     if (! myRssTitleElem) myRssTitle="Unknown Feed";
  1243.                     else myRssTitle=myRssTitleElem.getAttribute("label");
  1244.                     if (myRssTitle.length > 40) {
  1245.                         myRssTitle = myRssTitle.substr(0,40) + "...";
  1246.                     }
  1247.                     var myURI = getWebNavigation().currentURI.spec;
  1248.                     if ((myURI.indexOf("feed:") != 0) && (myURI.indexOf("feeds:") != 0)) {
  1249.                         myURI = "feed:" + myURI;
  1250.                     }
  1251.                          var browser = gBrowser.getBrowserAtIndex(gBrowser.getBrowserIndexForDocument(subject.document));
  1252.                     displayNotificationBar("rsspretty",[myRssTitle,myRssTotal-myRssCount,myRssTotal,myURI]);
  1253.                     subject.document.title = myRssTitle;
  1254.                        BMSVC.updateAllLivemarks();
  1255.                   } else {
  1256.  
  1257.                     if (getWebNavigation().currentURI.spec.indexOf(".rdf") > -1) ;
  1258.                     else if(getWebNavigation().currentURI.spec.indexOf(".rss") > -1) ;
  1259.                     else if(gBrowser.contentDocument.getElementsByTagName('rss').length) ;
  1260.                     else if (gBrowser.contentDocument.getElementsByTagNameNS('http://purl.org/rss/1.0/','channel').length) ; // version 1.0
  1261.                     else if (gBrowser.contentDocument.getElementsByTagNameNS('http://my.netscape.com/rdf/simple/0.9/','channel').length) ; // version 0.9
  1262.                     else if (gBrowser.contentDocument.getElementsByTagNameNS('http://purl.org/atom/ns#draft-ietf-atompub-format-08', 'entry').length) ; // atom version
  1263.                     else {
  1264.                         isRss = false;
  1265.                     }
  1266.  
  1267.                     if(isRss) {
  1268.                         displayNotificationBar('rss');
  1269.                     }
  1270.                   }
  1271.             }
  1272.             this.endDocLoad(subject);
  1273.         }
  1274.     },
  1275.  
  1276.     checkRoll : function (aWindow, aURL)
  1277.     {
  1278.             if (aWindow)
  1279.             {
  1280.                 var titleNodes = gBrowser.contentDocument.getElementsByTagName('title');
  1281.                 for (var i=0; i < titleNodes.length; i++)
  1282.                 {
  1283.                     for (j=0; j < titleNodes.item(i).childNodes.length; j++)
  1284.                     {
  1285.                         if (titleNodes.item(i).childNodes[j].nodeValue.indexOf("404") > -1)
  1286.                         {
  1287.  
  1288.                             // Find an h2 node with the text 'Error 404'
  1289.                             var h2Nodes = gBrowser.contentDocument.getElementsByTagName('h2');
  1290.                             browserDebug ("ROLL: Found " + h2Nodes.length + " h2 nodes\n");
  1291.                             for (var i=0; i < h2Nodes.length; i++)
  1292.                             {
  1293.                                 for (j=0; j < h2Nodes.item(i).childNodes.length; j++)
  1294.                                 {
  1295.                                         if (h2Nodes.item(i).childNodes[j].nodeValue.indexOf("Error 404") > -1)
  1296.                                         {
  1297.                                             var newURL = gPrefService.getCharPref('browser.redirect404.URL');
  1298.                                             newURL += aURL;
  1299.                                             loadURI(newURL, null, null);
  1300.                                             return true;
  1301.                                         }
  1302.                                 }
  1303.                             }
  1304.  
  1305.                             var h1Nodes = gBrowser.contentDocument.getElementsByTagName('h1');
  1306.                             for (var i=0; i < h1Nodes.length; i++)
  1307.                             {
  1308.                                 for (j=0; j < h1Nodes.item(i).childNodes.length; j++)
  1309.                                 {
  1310.                                     if ((h1Nodes.item(i).childNodes[j].nodeValue.indexOf("Error 404") > -1) ||
  1311.                                     (h1Nodes.item(i).childNodes[j].nodeValue == "Not Found"))
  1312.                                         {
  1313.                                             var newURL = gPrefService.getCharPref('browser.redirect404.URL');
  1314.                                             newURL += aURL;
  1315.                                             loadURI(newURL, null, null);
  1316.                                             return true;
  1317.                                         }
  1318.                                 }
  1319.                             }
  1320.                         }
  1321.                     }
  1322.                 }
  1323.             }
  1324.             return false;
  1325.         },
  1326.  
  1327.     endDocLoad : function (aWindow)
  1328.     {
  1329.         //browserDebug('***** EndDocLoad: gCurrentNotificationBar: ' + gCurrentNotificationBar + '\n');
  1330.         // MERC JVL: should not set to null before the message bar can clean itself up
  1331.         //gCurrentNotificationBar = null;
  1332.  
  1333.         if (blacklistUtils.IsSiteInPhishList(gBrowser.currentURI)) {
  1334.             displayNotificationBar("phishing",[gBrowser.currentURI]);
  1335.             // ShowPhishingSiteWarning();
  1336.         } else if (blacklistUtils.IsSiteInSpywareList(gBrowser.currentURI)) {
  1337.             displayNotificationBar("spyware",[gBrowser.currentURI]);
  1338.         }
  1339.  
  1340.         // MERC - JCH: When page has finished loading, check for password fields
  1341.         // If we invoke the passcard notification bar, don't do the form fill check
  1342.         var bIsPasscardable = CheckForPasscardField();
  1343.  
  1344.         var hpDoc = getTridentDocument();
  1345.         if (!hpDoc)
  1346.         {
  1347.             // TODO JVL : see note in isPasscardHighlight()
  1348.             if (bIsPasscardable && isPasscardHighlight() &&
  1349.                 !PasscardIsSiteBlacklisted(gBrowser.currentURI))
  1350.             {
  1351.                 passcardDebug('highlighting in GECKO\n');
  1352.                 // highlight passcard fields in the root document,
  1353.                 // then the ones in each frame
  1354.                 this.highlightPasscardFields(gBrowser.contentDocument);
  1355.             }
  1356.         }
  1357.         // Check if page datacard fillable
  1358.  
  1359.         if (!bIsPasscardable)
  1360.             datacardUtils.DoPageLoadedCheck();
  1361.  
  1362.     }, // observe
  1363.  
  1364.     // highlight passcard fields in the current document
  1365.     highlightPasscardFields : function (doc)        // JMC/JVL
  1366.     {
  1367.         if (!doc)
  1368.             return;
  1369.  
  1370.         // highlight if we have a Passcard for the site
  1371.         var domain = new Object();
  1372.         gPasscardMgr.getDomain(gBrowser.currentURI, domain);
  1373.         passcardDebug('HighlightPasscardFields() - host: ' + gBrowser.currentURI.host + ', domain: ' + domain.value + '\n');
  1374.         if (!GetFirstPasscardForSite(domain.value))
  1375.         {
  1376.             var defaultPasscard = GetDefaultPasscard();
  1377.             if (!defaultPasscard)
  1378.                 return;
  1379.  
  1380.             // do not highlight if the Default Passcard's
  1381.             // username and password fields are blank
  1382.             if (defaultPasscard.user.length < 1 ||
  1383.                 defaultPasscard.password.length < 1)
  1384.             {
  1385.                 return;
  1386.             }
  1387.         }
  1388.  
  1389.         var kBackgroundColor = "#ffff66";
  1390.         var usernameField;
  1391.         var tagList = doc.getElementsByTagName('input');
  1392.         for (var i = 0; i < tagList.length; i++)
  1393.         {
  1394.             var tag = tagList.item(i);
  1395.             if (tag)
  1396.             {
  1397.                 if (tag.getAttribute('type') == 'text' ||
  1398.                 tag.getAttribute('type') == null)
  1399.                 {
  1400.                     usernameField = tag;
  1401.                 }
  1402.  
  1403.                 if (tag.getAttribute('type') == 'password')
  1404.                 {
  1405.                     tag.style.backgroundColor = kBackgroundColor;
  1406.  
  1407.                     if (usernameField)
  1408.                     {
  1409.                         usernameField.style.backgroundColor = kBackgroundColor;
  1410.                         usernameField = null;
  1411.                     }
  1412.                 }
  1413.             }
  1414.         }
  1415.  
  1416.         this.highlightPasscardFieldsInFrames(doc, 'iframe');
  1417.         this.highlightPasscardFieldsInFrames(doc, 'frame');
  1418.         this.highlightPasscardFieldsInFrames(doc, 'object');
  1419.     },
  1420.  
  1421.     // highlight passcard fields in each 'frame' ('iframe' and 'object' as well) document
  1422.     highlightPasscardFieldsInFrames : function(doc, elementName)
  1423.     {
  1424.         var iframeElements = doc.getElementsByTagName(elementName);
  1425.         for (var i = 0; i < iframeElements.length; i++)
  1426.         {
  1427.             var iframeElement = iframeElements.item(i);
  1428.             if (iframeElement)
  1429.             {
  1430.                 this.highlightPasscardFields(iframeElement.contentDocument);
  1431.             }
  1432.         }
  1433.     }
  1434. }; // end docEndObserver
  1435.  
  1436.  
  1437. function toggleMenubar()
  1438. {
  1439.     // True = Right, False = Left
  1440.     gPrefService.setBoolPref("browser.menu_in_titlebar", gPrefService.getBoolPref("browser.menu_in_titlebar") != true);
  1441.     moveMenubar();
  1442. }
  1443.  
  1444. function moveMenubar()
  1445. {
  1446.     var mainMenu = document.getElementById('titlebar-menu-stack');
  1447.     var menuSpacer = document.getElementById('titlebar-menu-replacement');
  1448.  
  1449.     if (!gPrefService.getPrefType("browser.menu_in_titlebar")) return;
  1450.  
  1451.     if (gPrefService.getBoolPref("browser.menu_in_titlebar")
  1452.         != (mainMenu.parentNode.localName == 'toolbox')) return;
  1453.  
  1454.     var menuWidth=mainMenu.boxObject.width;
  1455.     mainMenu.parentNode.removeChild(mainMenu);
  1456.     var titlebarContainer = document.getElementById('titlebar-container');
  1457.     if (gPrefService.getBoolPref("browser.menu_in_titlebar")) {
  1458.         // browserDebug(' Moving from toolbox to titlebar\n');
  1459.         if (menuSpacer) menuSpacer.parentNode.removeChild(menuSpacer);
  1460.         titlebarContainer.appendChild(mainMenu);
  1461.         //    document.getElementById('mainMenuPopupBroadcaster').setAttribute('position', 'after_end');
  1462.     } else {
  1463.         // browserDebug(' Moving from titlebar to toolbox\n');
  1464.         var toolbox = document.getElementById('navigator-toolbox');
  1465.         toolbox.insertBefore(mainMenu, toolbox.firstChild);
  1466.         menuSpacer=document.createElement("spacer");
  1467.         menuSpacer.setAttribute("width",menuWidth + "");
  1468.         menuSpacer.setAttribute("id","titlebar-menu-replacement");
  1469.         menuSpacer.setAttribute("class",'titlebar-menu-stack');
  1470.         titlebarContainer.appendChild(menuSpacer);
  1471.         //document.getElementById('mainMenuPopupBroadcaster').setAttribute('position', 'after_start');
  1472.     }
  1473. }
  1474.  
  1475. function delayedStartup()
  1476. {
  1477.     browserDebug ("delayedStartup()\n");
  1478.   // MREC (Stevo) moved here to reduce the load time of the browser (since not a critical service)
  1479.     // MERC (rpaul) initialize the security dashboard threats queue
  1480.     threatsQueue.init();
  1481.     //initialize the dashboard
  1482.     dashboard.init();
  1483.     // start the daily autoexposure timer
  1484.     dashboard.makeDailyAutoExposureTimer();
  1485.     // register the dashboard global threat observers
  1486.     try {
  1487.         var dbGlobalThreatObs = new GlobalThreatObserver();
  1488.         dbGlobalThreatObs.register();
  1489.     } catch (ex) {
  1490.         dashboard.debug(ex);
  1491.     }
  1492.     var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1493.     os.addObserver(gSessionHistoryObserver, "browser:purge-session-history", false);
  1494.  
  1495.     // We have to do this because we manually hook up history for the first browser in prepareForStartup
  1496.     os.addObserver(gBrowser.browsers[0], "browser:purge-session-history", false);
  1497.     os.addObserver(gXPInstallObserver, "xpinstall-install-blocked", false);
  1498.     os.addObserver(gXPInstallObserver, "xpinstall-install-edit-prefs", false);
  1499.     os.addObserver(gXPInstallObserver, "xpinstall-install-edit-permissions", false);
  1500.     os.addObserver(gMissingPluginInstaller, "missing-plugin", false);
  1501.  
  1502.     // MERC - JCH : To check if history is cleared
  1503.     if (!gGlobalHistory)
  1504.     gGlobalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
  1505.                                .getService(Components.interfaces.nsIBrowserHistory);
  1506.     SetHistoryButton(); // JMC: Set anonymous mode button state
  1507.     BrowserOffline.init();
  1508.  
  1509.     if (gURLBar && document.documentElement.getAttribute("chromehidden").indexOf("toolbar") != -1) {
  1510.         gURLBar.setAttribute("readonly", "true");
  1511.         gURLBar.setAttribute("enablehistory", "false");
  1512.     }
  1513.  
  1514.     if (gIsLoadingBlank)
  1515.         prepareForStartup();
  1516.  
  1517.     if (gURLBar)
  1518.         gURLBar.addEventListener("dragdrop", URLBarOnDrop, true);
  1519.  
  1520. //    resizeSearchBar(); // JMC Disabled for beta
  1521.     // loads the services
  1522.     initServices();
  1523.  
  1524.     // Initialize SPUI
  1525.     if (spui) {
  1526.         // spui.RefreshComponentList();
  1527.         setTimeout( "spui.RefreshComponentList()", 0);  // this was causing crashes!
  1528.     } else browserDebug('SPUI has NOT been initialized!\n\n\n');
  1529.  
  1530.     initBMService();
  1531.     gBrowser.addEventListener("load", function(evt) { setTimeout(loadEventHandlers, 0, evt); }, true);
  1532.  
  1533.     // JMC - Do this earlier
  1534.     if (window.windowState == window.STATE_MAXIMIZED) {
  1535.         // call it, as we deal with the foxy theme in nsWindow
  1536.         window.maximize();        // MERC - Stevo (removed to fix bug with missing title bar on foxy
  1537.                                 //  theme when closed in maximized state and restarted.
  1538.         document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  1539.         document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  1540.         isButtonToggle = false;
  1541.     }
  1542.  
  1543.     window.addEventListener("keypress", ctrlNumberTabSelection, false);
  1544.  
  1545.     //if (gMustLoadSidebar) {
  1546.     //  var sidebar = document.getElementById("sidebar");
  1547.     //  var sidebarBox = document.getElementById("sidebar-box");
  1548.     //  sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
  1549.     //}
  1550.  
  1551.     initFindBar();
  1552.  
  1553.     // now load bookmarks
  1554.     BMSVC.readBookmarks();
  1555.     var bt = document.getElementById("bookmarks-ptf");
  1556.     if (bt) {
  1557.         var btf = BMSVC.getBookmarksToolbarFolder().Value;
  1558.         bt.ref = btf;
  1559.         document.getElementById("bookmarks-chevron").ref = btf;
  1560.         bt.database.AddObserver(BookmarksToolbarRDFObserver);
  1561.         bt.controllers.appendController(BookmarksMenuController);
  1562.     }
  1563.     var bm = document.getElementById("bookmarks-menu");
  1564.     bm.controllers.appendController(BookmarksMenuController);
  1565.  
  1566.     //JA ff5->vulp //<Modified by SLiu
  1567.     populateBookmarks();
  1568.     //SLiu>
  1569.  
  1570.     window.addEventListener("resize", onWindowResize, false);
  1571.  
  1572.     // called when we go into full screen, even if it is
  1573.     // initiated by a web page script
  1574.     window.addEventListener("fullscreen", onFullScreen, false);
  1575.  
  1576.     var element;
  1577.     if (gIsLoadingBlank && gURLBar && !gURLBar.hidden && !gURLBar.parentNode.parentNode.collapsed)
  1578.         element = gURLBar;
  1579.     else
  1580.         element = _content;
  1581.  
  1582.     // This is a redo of the fix for jag bug 91884
  1583.     var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
  1584.                        .getService(Components.interfaces.nsIWindowWatcher);
  1585.     if (window == ww.activeWindow) {
  1586.         // JMC - URLBar Focus issue debugging
  1587.         browserDebug ("delayed Startup, setting focus to " + element.id + "\n");
  1588.         element.focus();
  1589.     } else {
  1590.         // set the element in command dispatcher so focus will restore properly
  1591.         // when the window does become active
  1592.         if (element instanceof Components.interfaces.nsIDOMWindow) {
  1593.             document.commandDispatcher.focusedWindow = element;
  1594.             document.commandDispatcher.focusedElement = null;
  1595.         } else if (element instanceof Components.interfaces.nsIDOMElement) {
  1596.             document.commandDispatcher.focusedWindow = element.ownerDocument.defaultView;
  1597.             document.commandDispatcher.focusedElement = element;
  1598.         }
  1599.     }
  1600.  
  1601.     // This trashes the urlbar favicon so carefully set up in tabbrowser.xml...
  1602.     //SetPageProxyState("invalid", null);
  1603.  
  1604.     var toolbox = document.getElementById("navigator-toolbox");
  1605.     toolbox.customizeDone = BrowserToolboxCustomizeDone;
  1606.  
  1607.     // Enable/Disable Form Fill
  1608.     gFormFillPrefListener = new FormFillPrefListener();
  1609.     var pbi = gPrefService.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  1610.     pbi.addObserver(gFormFillPrefListener.domain, gFormFillPrefListener, false);
  1611.     gFormFillPrefListener.toggleFormFill();
  1612.  
  1613.     // Enable/Disable URL Bar Auto Fill
  1614.     gURLBarAutoFillPrefListener = new URLBarAutoFillPrefListener();
  1615.     pbi.addObserver(gURLBarAutoFillPrefListener.domain, gURLBarAutoFillPrefListener, false);
  1616.  
  1617.     pbi.addObserver(gHomeButton.prefDomain, gHomeButton, false);
  1618.     //gHomeButton.updateTooltip(); DO NOT USE..this is set in the browser.xul file
  1619.  
  1620.     // Initialize Plugin Overrides
  1621.     const kOverridePref = "browser.download.pluginOverrideTypes";
  1622.     if (gPrefService.prefHasUserValue(kOverridePref)) {
  1623.         var types = gPrefService.getCharPref(kOverridePref);
  1624.         types = types.split(",");
  1625.  
  1626.         const kPluginOverrideTypesNotHandled = "browser.download.pluginOverrideTypesNotHandled";
  1627.  
  1628.         var catman = Components.classes["@mozilla.org/categorymanager;1"].getService(Components.interfaces.nsICategoryManager);
  1629.         var typesNotHandled = "";
  1630.         for (var i = 0; i < types.length; ++i) {
  1631.             // Keep track of all overrides for plugins that aren't actually installed,
  1632.             // so we know not to show them in the plugin configuration dialog BUT
  1633.             // don't delete the overrides such that when the user actually installs the
  1634.             // plugin in this build their preferences are remembered.
  1635.             try {
  1636.                 var catEntry = catman.getCategoryEntry("Gecko-Content-Viewers", types[i]);
  1637.             }
  1638.             catch (e) {
  1639.                 catEntry = "";
  1640.             }
  1641.             if (catEntry == "")
  1642.             typesNotHandled += types[i] + ",";
  1643.  
  1644.             catman.deleteCategoryEntry("Gecko-Content-Viewers", types[i], false);
  1645.         }
  1646.  
  1647.         if (typesNotHandled) {
  1648.             typesNotHandled = typesNotHandled.substr(0, typesNotHandled.length - 1);
  1649.             gPrefService.setCharPref(kPluginOverrideTypesNotHandled, typesNotHandled);
  1650.         }
  1651.         else if (gPrefService.prefHasUserValue(kPluginOverrideTypesNotHandled))
  1652.             gPrefService.clearUserPref(kPluginOverrideTypesNotHandled);
  1653.     }
  1654.  
  1655.     gClickSelectsAll = gPrefService.getBoolPref("browser.urlbar.clickSelectsAll");
  1656.  
  1657.     clearObsoletePrefs();
  1658.  
  1659.     // Perform default browser checking (after window opens).
  1660.     var shell = getShellService();
  1661.     if (shell) {
  1662.         var shouldCheck = shell.shouldCheckDefaultBrowser;
  1663.         if (shouldCheck && !shell.isDefaultBrowser(true)) {
  1664.             var brandBundle = document.getElementById("bundle_brand");
  1665.             var shellBundle = document.getElementById("bundle_shell");
  1666.  
  1667.             var brandShortName = brandBundle.getString("brandShortName");
  1668.             var promptTitle = shellBundle.getString("setDefaultBrowserTitle");
  1669.             var promptMessage = shellBundle.getFormattedString("setDefaultBrowserMessage",
  1670.                 [brandShortName]);
  1671.             var checkboxLabel = shellBundle.getFormattedString("setDefaultBrowserDontAsk",
  1672.                 [brandShortName]);
  1673.             const IPS = Components.interfaces.nsIPromptService;
  1674.             var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  1675.                                .getService(IPS);
  1676.             var checkEveryTime = { value: shouldCheck };
  1677.             var rv = ps.confirmEx(window, promptTitle, promptMessage,
  1678.                                   (IPS.BUTTON_TITLE_YES * IPS.BUTTON_POS_0) +
  1679.                                  (IPS.BUTTON_TITLE_NO * IPS.BUTTON_POS_1),
  1680.                                  null, null, null, checkboxLabel, checkEveryTime);
  1681.             if (rv == 0)
  1682.                 shell.setDefaultBrowser(true, false);
  1683.             shell.shouldCheckDefaultBrowser = checkEveryTime.value;
  1684.         }
  1685.     } else {
  1686.         // We couldn't get the shell service; go hide the mail toolbar button.
  1687.         var mailbutton = document.getElementById("mail-button");
  1688.         if (mailbutton)
  1689.         mailbutton.hidden = true;
  1690.     }
  1691.  
  1692.     // START Mercurial
  1693.  
  1694.     // Initialize Webmail
  1695.     webmail.Init();
  1696.     // For toolbar overflow
  1697.     var nb = document.getElementById('nav-bar');
  1698.     nb.enableOverflowMenu = true;
  1699.     var pt = document.getElementById('PersonalToolbar');
  1700.     if (pt) { pt.enableOverflowMenu = true; }
  1701.     // TODO: This form submission observer should really be singleton
  1702.     // (ie., one-per-application, not one-per-browser-window)
  1703.     datacardUtils.InitSubmitObserver();
  1704.  
  1705.     // END Mercurial
  1706.  
  1707.     var updatePanel = document.getElementById("softwareupdate");
  1708.     try {
  1709.         updatePanel.init();
  1710.     }
  1711.     catch (e) { browserDebug("updatePanel failed with " + e + "\n"); }
  1712.  
  1713.     // BiDi UI
  1714.     if (isBidiEnabled()) {
  1715.         document.getElementById("documentDirection-separator").hidden = false;
  1716.         document.getElementById("documentDirection-swap").hidden = false;
  1717.         document.getElementById("textfieldDirection-separator").hidden = false;
  1718.         document.getElementById("textfieldDirection-swap").hidden = false;
  1719.     }
  1720.  
  1721.     // display the correct engine on startup
  1722.     UpdateStatusBarEngineIcon();
  1723.  
  1724.     // MERC - Stevo : Added for spyware scanner
  1725.     // Check if spyware scanner is install and invoke installer if not
  1726.     try
  1727.     {
  1728.       // Ensure pref settings are initialized
  1729.       if ( spyWareScanner.init() ) {
  1730.  
  1731.           // MERC - NAJ: Per BLT#211812 : Removed call to the first scan.  This should not change any other
  1732.           // logic around the spyware scanning, but ensures that the scan is manually invoked
  1733.           // thru the UI.
  1734.  
  1735.             // MERC - AAM: if we couldn't run the full scan, do the update
  1736.             // We don't want to kick off the update if the scanner is already active
  1737.             // for some time.
  1738.             spyWareScanner.update();
  1739.             // Note that the update mechanism is time based, there for not affected by the BLT#211812 change
  1740.  
  1741.         }
  1742.     } catch (err) {
  1743.         browserDebug("spyWareScanner Full Scan failed with " + err + "\n");
  1744.     }
  1745. }
  1746.  
  1747. function resizeSearchBar()
  1748. {
  1749.     var searchBar = document.getElementById("searchbar");
  1750.     if(searchBar) {
  1751.         searchBar.addEventListener("dragdrop", SearchBarOnDrop, true);
  1752.         if (gPrefService.getPrefType("browser.search.size")) {
  1753.             var searchSize = gPrefService.getCharPref("browser.search.size");
  1754.             // this.parentNode.style.width = searchSize;
  1755.             // browserDebug("SEARCH: Setting the checked attribute for search size\n");
  1756.             var sizeMenuItem = document.getAnonymousElementByAttribute(searchBar, "value", searchSize);
  1757.             if (sizeMenuItem) {
  1758.                 // browserDebug("SEARCH: Calling doCommand on the sizeMenuItem\n");
  1759.                 sizeMenuItem.doCommand();
  1760.                 // sizeMenuItem.setAttribute('checked', 'true');
  1761.             }
  1762.         }
  1763.     }
  1764. }
  1765.  
  1766. function Shutdown()
  1767. {
  1768.     var os = Components.classes["@mozilla.org/observer-service;1"]
  1769.                        .getService(Components.interfaces.nsIObserverService);
  1770.     os.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
  1771.     os.removeObserver(gBrowser.browsers[0], "browser:purge-session-history");
  1772.     os.removeObserver(gXPInstallObserver, "xpinstall-install-blocked");
  1773.     os.removeObserver(gXPInstallObserver, "xpinstall-install-edit-permissions");
  1774.     os.removeObserver(gXPInstallObserver, "xpinstall-install-edit-prefs");
  1775.     os.removeObserver(gMissingPluginInstaller, "missing-plugin");
  1776.     gDownloadObserver.unregister();
  1777.  
  1778.     try {
  1779.         gBrowser.removeProgressListener(window.XULBrowserWindow);
  1780.     } catch (ex) {
  1781.     }
  1782.  
  1783.     var bt = document.getElementById("bookmarks-ptf");
  1784.     if (bt) {
  1785.         try {
  1786.             bt.database.RemoveObserver(BookmarksToolbarRDFObserver);
  1787.             bt.controllers.removeController(BookmarksMenuController);
  1788.         } catch (ex) {
  1789.         }
  1790.     }
  1791.  
  1792.     try {
  1793.         var bm = document.getElementById("bookmarks-menu");
  1794.         bm.controllers.removeController(BookmarksMenuController);
  1795.     } catch (ex) {
  1796.     }
  1797.  
  1798.     try {
  1799.         var pbi = gPrefService.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  1800.         pbi.removeObserver(gFormFillPrefListener.domain, gFormFillPrefListener);
  1801.         pbi.removeObserver(gURLBarAutoFillPrefListener.domain, gURLBarAutoFillPrefListener);
  1802.         pbi.removeObserver(gHomeButton.prefDomain, gHomeButton);
  1803.     } catch (ex) {
  1804.     }
  1805.  
  1806.     BrowserOffline.uninit();
  1807.  
  1808.     uninitFindBar();
  1809.  
  1810.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  1811.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  1812.     var enumerator = windowManagerInterface.getEnumerator(null);
  1813.     enumerator.getNext();
  1814.     if (!enumerator.hasMoreElements()) {
  1815.         document.persist("sidebar-box", "sidebarcommand");
  1816.         document.persist("sidebar-box", "width");
  1817.         document.persist("sidebar-box", "src");
  1818.         document.persist("sidebar-title", "value");
  1819.     }
  1820.  
  1821.     window.XULBrowserWindow.destroy();
  1822.     window.XULBrowserWindow = null;
  1823.     window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  1824.     .getInterface(Components.interfaces.nsIWebNavigation)
  1825.     .QueryInterface(Components.interfaces.nsIDocShellTreeItem).treeOwner
  1826.     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  1827.     .getInterface(Components.interfaces.nsIXULWindow)
  1828.     .XULBrowserWindow = null;
  1829.     gBrowser.docShell
  1830.     .QueryInterface(nsCI.nsIDocShellTreeItem)
  1831.     .rootTreeItem
  1832.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  1833.     .getInterface(nsCI.nsIDOMWindow)
  1834.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  1835.     .getInterface(nsCI.nsIDOMWindowUtils)
  1836.     .browserDOMWindow = null;
  1837.  
  1838.     window.browserContentListener.close();
  1839.     // Close the app core.
  1840.     if (appCore)
  1841.     appCore.close();
  1842. }
  1843.  
  1844. function FormFillPrefListener()
  1845. {
  1846.     gBrowser.attachFormFill();
  1847. }
  1848.  
  1849. FormFillPrefListener.prototype =
  1850. {
  1851.     domain: "browser.formfill.enable",
  1852.     observe: function (aSubject, aTopic, aPrefName)
  1853.     {
  1854.         if (aTopic != "nsPref:changed" || aPrefName != this.domain)
  1855.         return;
  1856.  
  1857.         this.toggleFormFill();
  1858.     },
  1859.  
  1860.     toggleFormFill: function ()
  1861.     {
  1862.         try {
  1863.             gFormFillEnabled = gPrefService.getBoolPref(this.domain);
  1864.         }
  1865.         catch (e) {
  1866.         }
  1867.         var formController = Components.classes["@mozilla.org/satchel/form-fill-controller;1"].getService(Components.interfaces.nsIAutoCompleteInput);
  1868.         formController.disableAutoComplete = !gFormFillEnabled;
  1869.  
  1870.         var searchBar = document.getElementsByTagName("searchbar");
  1871.         for (var i=0; i<searchBar.length;i++) {
  1872.             if (gFormFillEnabled)
  1873.             searchBar[i].removeAttribute("disableautocomplete");
  1874.         else
  1875.             searchBar[i].setAttribute("disableautocomplete", "true");
  1876.         }
  1877.     }
  1878. }
  1879.  
  1880. function URLBarAutoFillPrefListener()
  1881. {
  1882.     this.toggleAutoFillInURLBar();
  1883. }
  1884.  
  1885. URLBarAutoFillPrefListener.prototype =
  1886. {
  1887.     domain: "browser.urlbar.autoFill",
  1888.     observe: function (aSubject, aTopic, aPrefName)
  1889.     {
  1890.         if (aTopic != "nsPref:changed" || aPrefName != this.domain)
  1891.         return;
  1892.  
  1893.         this.toggleAutoFillInURLBar();
  1894.     },
  1895.  
  1896.     toggleAutoFillInURLBar: function ()
  1897.     {
  1898.         if (!gURLBar)
  1899.         return;
  1900.  
  1901.         var prefValue = false;
  1902.         try {
  1903.             prefValue = gPrefService.getBoolPref(this.domain);
  1904.         }
  1905.         catch (e) {
  1906.         }
  1907.  
  1908.         if (prefValue)
  1909.         gURLBar.setAttribute("completedefaultindex", "true");
  1910.     else
  1911.         gURLBar.removeAttribute("completedefaultindex");
  1912.     }
  1913. }
  1914.  
  1915. function ctrlNumberTabSelection(event)
  1916. {
  1917.     if (event.altKey && event.keyCode == KeyEvent.DOM_VK_RETURN) {
  1918.         // XXXblake Proper fix is to just check whether focus is in the urlbar. However, focus with the autocomplete widget is all
  1919.         // hacky and broken and there's no way to do that right now. So this just patches it to ensure that alt+enter works when focus
  1920.         // is on a link.
  1921.     if (!(document.commandDispatcher.focusedElement instanceof HTMLAnchorElement)) {
  1922.             // Don't let winxp beep on ALT+ENTER, since the URL bar uses it.
  1923.             event.preventDefault();
  1924.             return;
  1925.         }
  1926.     }
  1927.  
  1928.         if (!event.ctrlKey)
  1929.         return;
  1930.         //JA
  1931.         const MAX_TABS = 80;//defined in nsGUIEvent.h
  1932.         var index = event.charCode - 49;//49 == '0'
  1933.         if (index < 0 || (index > 8 && (index<0x0700 || index>0x0700+MAX_TABS)) )
  1934.         return;
  1935.         if(index>=0x0700)
  1936.         index = index-0x0700;
  1937.         //JA end
  1938.         if (index >= gBrowser.tabContainer.childNodes.length)
  1939.         return;
  1940.  
  1941.         var oldTab = gBrowser.selectedTab;
  1942.         var newTab = gBrowser.tabContainer.childNodes[index];
  1943.         if (newTab != oldTab) {
  1944.             oldTab.selected = false;
  1945.             gBrowser.selectedTab = newTab;
  1946.         }
  1947.  
  1948.         event.preventDefault();
  1949.         event.preventBubble();
  1950.         event.preventCapture();
  1951.         event.stopPropagation();
  1952.     }
  1953.  
  1954. function gotoHistoryIndex(aEvent)
  1955. {
  1956.     var index = aEvent.target.getAttribute("index");
  1957.     if (!index)
  1958.         return false;
  1959.  
  1960.     var docshell = getWebNavigation();
  1961.     var sessionHistory = docshell.sessionHistory;
  1962.  
  1963.     // Try to get handle on Trident
  1964.     var hpDoc = getTridentDocument();
  1965.     var fromEngine = 'Gecko';
  1966.     if (hpDoc)
  1967.         fromEngine = 'Trident';
  1968.  
  1969.     var uri = sessionHistory.getEntryAtIndex(index, false).URI;
  1970.     // browserDebug('  To page is ==> '+uri.spec+'\n');
  1971.     var site = sitecontrols.SCSVC.getResourceForURI(uri.spec);
  1972.     var toEngine = sitecontrols.SCSVC.readSiteControlResource(site, 'displayEngine');
  1973.     getWebNavigation().browserEngine = toEngine;
  1974.     if (fromEngine == 'Trident')
  1975.     {
  1976.         sessionHistory.setCurrentIndex(index);
  1977.         UpdateBackForwardButtons();
  1978.         if (toEngine == 'Gecko')
  1979.         {
  1980.             try
  1981.             {
  1982.                 hpDoc.geckoLoadURI(uri, Components.interfaces.nsIDocShellLoadInfo.loadBypassHistory);
  1983.                 // remove engine attribute from tab
  1984.                 gBrowser.mCurrentTab.removeAttribute("engine");
  1985.                 UpdateStatusBarEngineIcon();
  1986.             }
  1987.             catch(ex){browserDebug("gotoHistoryIndex geckoLoadURI failed!!!\n");}
  1988.         }
  1989.         else
  1990.         {
  1991.             try
  1992.             {
  1993.                 gBrowser.mCurrentTab.setAttribute("engine", "Trident");
  1994.                 hpDoc.goCmd(-index);
  1995.             }
  1996.             catch(ex){browserDebug("gotoHistoryIndex goCmd failed!!!\n");}
  1997.         }
  1998.     }/*Mercurial Finish*/
  1999.     else
  2000.     {
  2001.         var where = whereToOpenLink(aEvent);
  2002.         if (where == "current")
  2003.         {
  2004.             // Normal click.  Go there in the current tab and update session history.
  2005.             try {
  2006.                 getWebNavigation().gotoIndex(index);
  2007.             }
  2008.             catch(ex) {
  2009.                 return false;
  2010.             }
  2011.             return true;
  2012.         }
  2013.         else
  2014.         {
  2015.             // Modified click.  Go there in a new tab/window.
  2016.             // This code doesn't copy history or work well with framed pages.
  2017.  
  2018.             var sessionHistory = getWebNavigation().sessionHistory;
  2019.             var entry = sessionHistory.getEntryAtIndex(index, false);
  2020.             var url = entry.URI.spec;
  2021.             openUILinkIn(url, where);
  2022.             return true;
  2023.         }
  2024.     }
  2025. }
  2026.  
  2027. function BrowserForward(aEvent, aIgnoreAlt)
  2028. {
  2029.     var docshell = getWebNavigation();
  2030.     var sessionHistory = docshell.sessionHistory;
  2031.     var count = sessionHistory.count;
  2032.     var index = sessionHistory.index;
  2033.  
  2034.     //JA ff5->vulp + modif
  2035.     if (index >= count-1) {
  2036.         UpdateBackForwardButtons();
  2037.         return;//error call
  2038.     }
  2039.  
  2040.     // Try to get handle on Trident
  2041.     var hpDoc = getTridentDocument();
  2042.     var fromEngine = 'Gecko';
  2043.     if (hpDoc)
  2044.     fromEngine = 'Trident';
  2045.  
  2046.  
  2047.     index++;
  2048.     var uri = sessionHistory.getEntryAtIndex(index, false).URI;
  2049.     // browserDebug('  To page is ==> '+uri.spec+'\n');
  2050.     var site = sitecontrols.SCSVC.getResourceForURI(uri.spec);
  2051.     var toEngine = sitecontrols.SCSVC.readSiteControlResource(site, 'displayEngine');
  2052.     docshell.browserEngine = toEngine;
  2053.  
  2054.     if (fromEngine == 'Trident')
  2055.     {
  2056.         sessionHistory.setCurrentIndex(index);
  2057.         UpdateBackForwardButtons();
  2058.         if (toEngine == 'Gecko'){
  2059.             // browserDebug('BrowserForward: Trident=>Gecko\n');
  2060.             hpDoc.geckoLoadURI(uri, Components.interfaces.nsIDocShellLoadInfo.loadBypassHistory);
  2061.             gBrowser.mCurrentTab.removeAttribute("engine");
  2062.             UpdateStatusBarEngineIcon();
  2063.         } else {
  2064.             // browserDebug('BrowserForward: Trident ==> Trident\n');
  2065.             hpDoc.goCmd(2);
  2066.         }
  2067.     }
  2068. else//original code
  2069.     {
  2070.         var where = whereToOpenLink(aEvent, false, aIgnoreAlt);
  2071.  
  2072.         if (where == "current") {
  2073.             try {
  2074.                 docshell.goForward();
  2075.             }
  2076.             catch(ex) { browserDebug ("Caught Exception: " + ex + "\n");}
  2077.         }
  2078.         else {
  2079.             //JA var sessionHistory = getWebNavigation().sessionHistory;
  2080.             //JA var currentIndex = sessionHistory.index;
  2081.             //JA var entry = sessionHistory.getEntryAtIndex(currentIndex + 1, false);
  2082.             //JA var uri = entry.URI.spec;
  2083.             openUILinkIn(uri, where);
  2084.         }
  2085.     }
  2086. }
  2087.  
  2088. function BrowserBack(aEvent, aIgnoreAlt)
  2089. {
  2090.     var docshell = getWebNavigation();
  2091.     var sessionHistory = docshell.sessionHistory;
  2092.     var index = sessionHistory.index;
  2093.  
  2094.     // JMC - New feature, if back history is empty, close tab and return focus to last tab.
  2095.     if (index <= 0)
  2096.     {
  2097.         // Merc - Thomas
  2098.         // Because we can click faster than the code can react we can get an
  2099.         // index of 0, but since we only have 1 tab we don't want to remove it.
  2100.         if(gBrowser.mTabContainer.childNodes.length > 1)
  2101.             gBrowser.removeTab(gBrowser.mCurrentTab);
  2102.         UpdateBackForwardButtons();
  2103.         return;
  2104.     }
  2105.  
  2106.  
  2107.     // Try to get handle on Trident
  2108.     var hpDoc = getTridentDocument();
  2109.     var fromEngine = 'Gecko';
  2110.     if (hpDoc)
  2111.     fromEngine = 'Trident';
  2112.  
  2113.     index--;
  2114.     var uri = sessionHistory.getEntryAtIndex(index, false).URI;
  2115.     // browserDebug('  To page is ==> '+uri.spec+'\n');
  2116.     var site = sitecontrols.SCSVC.getResourceForURI(uri.spec);
  2117.     var toEngine = sitecontrols.SCSVC.readSiteControlResource(site, 'displayEngine');
  2118.     getWebNavigation().browserEngine = toEngine;
  2119.     if (fromEngine == 'Trident')
  2120.     {
  2121.         sessionHistory.setCurrentIndex(index);
  2122.         UpdateBackForwardButtons();
  2123.         if (toEngine == 'Gecko')
  2124.         {
  2125.             // browserDebug('BrowserBack: Trident ==> Gecko\n');
  2126.             hpDoc.geckoLoadURI(uri, Components.interfaces.nsIDocShellLoadInfo.loadBypassHistory);
  2127.             // remove engine attribute from tab
  2128.             gBrowser.mCurrentTab.removeAttribute("engine");
  2129.             UpdateStatusBarEngineIcon();
  2130.         } else {
  2131.             // browserDebug('BrowserBack: Trident ==> Trident\n');
  2132.             gBrowser.mCurrentTab.setAttribute("engine", "Trident");
  2133.             hpDoc.goCmd(1);
  2134.         }
  2135.     }
  2136.     else//Gecko, original code
  2137.         {
  2138.  
  2139.             var where = whereToOpenLink(aEvent, false, aIgnoreAlt);
  2140.  
  2141.             if (where == "current") {
  2142.                 try {
  2143.                     getWebNavigation().goBack();
  2144.                 }
  2145.                 catch(ex) { browserDebug ("Caught Exception: " + ex + "\n");     }
  2146.             }
  2147.         else {
  2148.             //JA var sessionHistory = getWebNavigation().sessionHistory;
  2149.             //JA var currentIndex = sessionHistory.index;
  2150.             //JA var entry = sessionHistory.getEntryAtIndex(currentIndex - 1, false);
  2151.             //JA var uri = entry.URI.spec;
  2152.             openUILinkIn(uri, where);
  2153.         }
  2154.     }
  2155. }
  2156.  
  2157. function BrowserHandleBackspace()
  2158. {
  2159.     BrowserBack();
  2160. }
  2161.  
  2162. function BrowserBackMenu(event)
  2163. {
  2164.     return FillHistoryMenu(event.target, "back");
  2165. }
  2166.  
  2167. function BrowserForwardMenu(event)
  2168. {
  2169.     return FillHistoryMenu(event.target, "forward");
  2170. }
  2171.  
  2172. // MERC (DP): fill in the home button dropdown with a each home page item
  2173. function BrowserHomeMenu(menu) {
  2174.     var homePage = gHomeButton.getHomePage();
  2175.     var urls = homePage.split("|");
  2176.     var separator;
  2177.     var referenceNodeList = menu.getElementsByTagName("menuseparator");
  2178.     var referenceNode = null;
  2179.  
  2180.     var children = menu.childNodes;
  2181.  
  2182.     for (var j = 0; j < children.length; j++) {
  2183.         // clear old menuitems
  2184.         try {
  2185.             var tmpElement = children[j].QueryInterface(Components.interfaces.nsIDOMElement);
  2186.             if(!tmpElement.hasAttribute("nodelete")) { //avoid deleting separators
  2187.                 menu.removeChild(children[j]);
  2188.             }
  2189.         }
  2190.         catch(e){
  2191.             browserDebug ("Caught Exception : "+e+"\n");
  2192.             //we may still want to delete this node?
  2193.         }
  2194.  
  2195.     }
  2196.  
  2197.     //find the first separator to insert the page links before
  2198.     if (referenceNodeList.length > 0){
  2199.         referenceNode = referenceNodeList[0];
  2200.     }
  2201.  
  2202.     for (var i = 0; i < urls.length; i++) {
  2203.         var menuitem = document.createElement( "menuitem" );
  2204.         menuitem.setAttribute("label", urls[i]);
  2205.         //var tmpStr = "gBrowser.addTab('" +  urls[i] + "')";
  2206.         var tmpStr = "loadURIWithOpenPref('" +  urls[i] + "', 'browser.tabs.homepage.open');";
  2207.         menuitem.setAttribute("oncommand", tmpStr);
  2208.         menuitem.setAttribute("tooltiptext", "Go to this page");
  2209.         if (referenceNodeList.length > 0){
  2210.             menu.insertBefore( menuitem, referenceNode );
  2211.         } else  {
  2212.             menu.appendChild( menuitem );
  2213.         }
  2214.     }
  2215. }
  2216. // <MERC
  2217.  
  2218. function BrowserStop()
  2219. {
  2220.     var hpDoc = getTridentDocument();
  2221.  
  2222.     if(hpDoc)
  2223.     {
  2224.         //var stopbutton = document.getElementById("stop-button");
  2225.         //stopbutton.setAttribute("disabled", "true");
  2226. /*        var stopReloadBtn = document.getElementById("stop-reload-button");
  2227.         if (stopReloadBtn) {
  2228.             // JCH: Need to set label according to state
  2229.             stopReloadBtn.setAttribute("label","Reload");
  2230.             stopReloadBtn.setAttribute("state","reload");
  2231.             stopReloadBtn.removeAttribute("command");
  2232.             stopReloadBtn.setAttribute("oncommand","BrowserStopReload(event);");
  2233.         }*/
  2234.       var webProgress = gBrowser.webProgress;
  2235.         window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_STOP | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  2236.         hpDoc.cancelNavigation();
  2237.     } else  {
  2238.         try
  2239.         {
  2240.             const stopFlags = nsIWebNavigation.STOP_ALL;
  2241.             getWebNavigation().stop(stopFlags);
  2242.         }
  2243.         catch(ex) { browserDebug ("Caught Exception: " + ex + "\n");}
  2244.     }
  2245. }
  2246. //MERC/>
  2247.  
  2248.  
  2249. /**
  2250. * MERC: ccampbell
  2251. * Added this function to differentiate between the way Find works in
  2252. * Gecko (a.k.a Find Bar) and Trident (old fashioned dialog)
  2253. **/
  2254. function findCommand(again) {
  2255. /*
  2256.     var hpDoc = getTridentDocument();
  2257.     if (hpDoc) {
  2258.         // The current tab is in Trident
  2259.         gBrowser.find();
  2260.     } else {*/
  2261.  
  2262.         try {
  2263.             // The current tab is in Gecko
  2264.             if (again)
  2265.                 onFindAgainCmd();
  2266.             else
  2267.                 onFindCmd();
  2268.         } catch(ex) { browserDebug ("Caught Exception: " + ex + "\n"); }
  2269.     //}
  2270. }
  2271.  
  2272.  
  2273. ///////////////////////////////////////////////////////////////////////////////////////
  2274. //                       POPUPBLOCK BUTTON GENERAL FUNCTIONALITY                     //
  2275. ///////////////////////////////////////////////////////////////////////////////////////
  2276.  
  2277. // MERC - JCH
  2278. // Increment the global popup blocked count
  2279. function IncrementPopupsBlocked(windowDoc)
  2280. {
  2281.     if (!gBrowser)
  2282.         return;
  2283.  
  2284.     // Get the index of the relevant tab document object
  2285.     var foundIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  2286.  
  2287.     if (foundIndex < 0)
  2288.         return;
  2289.  
  2290.     // Get ref to target tab
  2291.     var browserTabs = gBrowser.mTabContainer.childNodes;
  2292.     var targetTab = browserTabs[foundIndex];
  2293.  
  2294.     // Modify the global count
  2295.     ++gBrowser.numberBlocked;
  2296.  
  2297.     // Get the browser object of the current tab
  2298.     var browserForCurrentTab = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  2299.  
  2300.     // Get the browser object of the target tab
  2301.     var browserForTargetTab = gBrowser.getBrowserForTab(targetTab);
  2302.  
  2303.     // Compare browser that has popup with the current browser
  2304.     // If they are not the same don't update the UI
  2305.     if (browserForTargetTab != browserForCurrentTab)
  2306.     {
  2307.         return;
  2308.     }
  2309.  
  2310.     // Update UI
  2311.     SetPopupBlockToggle();
  2312.  
  2313.     // Get a handle to the button element
  2314.     var button = document.getElementById("popupblocker-button");
  2315.  
  2316.     // JMC added sanity check for when button is removed from toolbar
  2317.     if (button) {
  2318.         // Change icon for two seconds when popups are blocked
  2319.         button.setAttribute("popupDetected","true");
  2320.         // Show popup block icon for two seconds
  2321.         setTimeout("RestorePBB()", 2000);
  2322.     }
  2323. }
  2324.  
  2325.  
  2326. // MERC - JCH : Restore the look of the button
  2327. function RestorePBB()
  2328. {
  2329.     // browserDebug("\nIn RestorePBB -> Show image\n");
  2330.  
  2331.     // Get a handle to the button element
  2332.     var button = document.getElementById("popupblocker-button");
  2333.     if (button) {
  2334.         button.setAttribute("popupDetected","false");
  2335.         SetPopupBlockToggle();
  2336.     }
  2337. }
  2338.  
  2339.  
  2340. // MERC - JCH : Determine whether blocking is on
  2341. // Called from nsGlobalWindow.cpp and nsHTMLPluginDocument.cpp
  2342. function PopupBlockingOn(windowDoc)
  2343. {
  2344.     // Get the index of the relevant tab document object
  2345.     var foundIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  2346.  
  2347.     // browserDebug(">>>>>>  In PopupBlockingOn() foundIndex is: " + foundIndex + "\n");
  2348.     if (foundIndex < 0)
  2349.     return;
  2350.  
  2351.     // Get controlling site resource
  2352.     var site = GetSiteControlResource(gBrowser.getBrowserAtIndex(foundIndex));
  2353.  
  2354.     // If site is illegitimate and uncontrollable then block pop-ups
  2355.     if (!site)
  2356.     return false;
  2357.  
  2358.     // Get the value of the setting associated with popup blocking
  2359.     var popupsAllowed = sitecontrols.SCSVC.readSiteControlResource(site,"allowPopups");
  2360.  
  2361.     // Return whether to block popups or not
  2362.     // Assume no blocking
  2363.     var blockPopups = false;
  2364.     if (popupsAllowed.indexOf("false") > -1)
  2365.     blockPopups = true;
  2366.  
  2367.     return blockPopups;
  2368. }
  2369.  
  2370.  
  2371. // MERC - JCH : determine whether blocking sound is on
  2372. // Called from nsGlobalWindow.cpp and nsHTMLPluginDocument.cpp
  2373. function BlockingSoundOn(windowDoc)
  2374. {
  2375.     if (!gBrowser)
  2376.     return;
  2377.  
  2378.     // Get the index of the relevant tab browser object
  2379.     var foundIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  2380.  
  2381.     // browserDebug("@@@@@ in BlockingSoundOn with index: " + foundIndex + "\n");
  2382.  
  2383.     if (foundIndex < 0)
  2384.         return false;
  2385.  
  2386.     // Get the browser object of the current tab
  2387.     var browserForTab = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  2388.  
  2389.     // Compare browser that has popup with the current browser
  2390.     // If they are not the same don't play sound
  2391.     if (gBrowser.getBrowserAtIndex(foundIndex) != browserForTab)
  2392.         return false;
  2393.  
  2394.     if (!gPrefService)
  2395.         return false;
  2396.  
  2397.     return gPrefService.getBoolPref("privacy.popups.sound_enabled");
  2398. }
  2399.  
  2400. /**
  2401. * Returns the RDF resource for the site control applicable to the
  2402. * given browser object, or else to the current tab's if no object
  2403. * is specified
  2404. **/
  2405. function GetSiteControlResource(browser) {
  2406.     // browserDebug('enter >> GetSiteControlResource()\n');
  2407.  
  2408.     // Grab the right browser object
  2409.     if (!browser)
  2410.         browser = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  2411.  
  2412.     // Pull out the URI for that tab/browser
  2413.     var uri;
  2414.     if (!browser.currentURI) uri = '';
  2415.     else uri = browser.currentURI.spec;
  2416.     //browserDebug('         uri: '+uri+'\n');
  2417.  
  2418.     // The URI must either be for a controllable site (including local files)
  2419.     // or else 'about:blank'.  Otherwise, exit without doing anything.
  2420.     if ((uri != 'about:blank') && (!sitecontrols.SCSVC.isControllableURI(uri)))
  2421.     {
  2422.         // if the site is controlled, it's rendered with Gecko, so update statusbar
  2423.         //UpdateStatusBarEngineIcon();
  2424.         // browserDebug('         '+uri+' is not a controllable uri\n');
  2425.         return null;
  2426.     }
  2427.  
  2428.     // Site 'about:blank' is treated as if it's a DEFAULT site.
  2429.     // This should be SiteControls:Default resource.
  2430.     if (uri == 'about:blank')
  2431.     {
  2432.         //UpdateStatusBarEngineIcon();
  2433.         // browserDebug('         '+uri+' will use default settings\n');
  2434.         uri = '';
  2435.     }
  2436.  
  2437.     // Return the RDF resource
  2438.     // Note that if site is not explicitly controlled
  2439.     // the default resource is returned
  2440.     return sitecontrols.SCSVC.getResourceForURI(uri);
  2441. }
  2442.  
  2443.  
  2444. // MERC - JCH : Updates XUL related to the popupblock button
  2445. function SetPopupBlockToggle()
  2446. {
  2447.     //browserDebug('SetPopupBlockToggle()\n');
  2448.  
  2449.     // Get current url in proper format
  2450.     var site = GetSiteControlResource();
  2451.  
  2452.     // If site is not controllable we will use default settings for xul
  2453.     if (!site)
  2454.     site = sitecontrols.SCSVC.getResourceForURI('');
  2455.  
  2456.     // browserDebug(">>>>>>  In SetPopupBlockToggle() site is: " + site + "\n");
  2457.  
  2458.     // Get the value of the site controls associated with popup blocking
  2459.     var popupsAllowed = sitecontrols.SCSVC.readSiteControlResource(site,"allowPopups");
  2460.  
  2461.     // Get a handle to the button element
  2462.     var button = document.getElementById("popupblocker-button");
  2463.     if (!button) return; // JMC Sanity check when button is removed from toolbar
  2464.     var popupDetected = button.getAttribute("popupDetected");
  2465.  
  2466.     // Get handles to menu checkboxes
  2467.     // Don't need sanity checks for these since they are tied to the button
  2468.     // and that's been checked above
  2469.     var menuItemBlock = document.getElementById("popupblocker-onoff");
  2470.     var menuItemCount = document.getElementById("popupblocker-showcount");
  2471.     var menuItemSound = document.getElementById("popupblocker-playsound");
  2472.  
  2473.     // Don't change icon if the blocked popup icon has not finished showing
  2474.     if (popupDetected.indexOf("false") > -1) {
  2475.         var bundle_browser = document.getElementById("bundle_browser");
  2476.  
  2477.         // Check if the value is true, in which case popups are allowed
  2478.         if (popupsAllowed.indexOf("true") > -1) {
  2479.             button.setAttribute("popupblocking","off");
  2480.             menuItemBlock.setAttribute("label", "Enable pop-up blocker");
  2481.             //MERC - TO
  2482.             //BLT 204390
  2483.             //Need to set tooltip for menuitem
  2484.             menuItemBlock.setAttribute("tooltiptext", bundle_browser.getString("popupBlockerEnableTooltip"));
  2485.             //MERC - BH
  2486.             //BLT 208515
  2487.             //set button tooltip variable to appropriate value
  2488.             button.setAttribute("tttext", bundle_browser.getString("popupBlockerEnableTooltip"));
  2489.         } else {
  2490.             button.setAttribute("popupblocking","on");
  2491.             menuItemBlock.setAttribute("label", "Disable pop-up blocker");
  2492.             //MERC - TO
  2493.             //BLT 204390
  2494.             //Need to set tooltip for menuitem
  2495.             menuItemBlock.setAttribute("tooltiptext", bundle_browser.getString("popupBlockerDisableTooltip"));
  2496.             //MERC - BH
  2497.             //BLT 208515
  2498.             //set button tooltip variable to appropriate value
  2499.             button.setAttribute("tttext", bundle_browser.getString("popupBlockerDisableTooltip"));
  2500.         }
  2501.     }
  2502.  
  2503.     if (!gPrefService)
  2504.         return;
  2505.  
  2506.     // Pop-up count is a global pref
  2507.     var showCount = gPrefService.getBoolPref("privacy.popups.show_count");
  2508.  
  2509.     // Check if we show count of popups blocked
  2510.     if (showCount) {
  2511.         // Get number of popups blocked
  2512.         var numBlocked = gBrowser.numberBlocked;
  2513.         button.setAttribute("label", " Blocked: "+numBlocked);
  2514.         // Need to set this property so that in browser.css can override
  2515.         // no text in icons mode
  2516.         button.setAttribute("showCount", "true");
  2517.         menuItemCount.setAttribute("checked", "true");
  2518.     } else {
  2519.         // If we don't show count we show a default text if in full or text modes
  2520.         button.setAttribute("showCount", "false");
  2521.         // Get the navbar and check what mode it's in
  2522.  
  2523.         if (popupsAllowed.indexOf("true") > -1) {
  2524.             button.setAttribute("label", " Allowed");
  2525.         }
  2526.         // If popups are not allowed
  2527.         else {
  2528.             button.setAttribute("label", " Blocked");
  2529.         }
  2530.  
  2531.         // Uncheck the show count menu item
  2532.         menuItemCount.setAttribute("checked", "false");
  2533.     }
  2534.  
  2535.     // Pop-up sound is a global pref
  2536.     var playSound = gPrefService.getBoolPref("privacy.popups.sound_enabled");
  2537.  
  2538.     // Update sound menu checkbox
  2539.     if (playSound)
  2540.         menuItemSound.setAttribute("checked", "true");
  2541.     else
  2542.         menuItemSound.setAttribute("checked", "false");
  2543.  
  2544.     //Merc - BH: make sure the buttons are displayed properly
  2545.     ResizeSecurityBar();
  2546. }
  2547.  
  2548. //MERC - BH: resize the security toolbar to accomodate the change in size
  2549. //of the buttons because of labeling, block counting, etc.
  2550. function ResizeSecurityBar()
  2551. {
  2552.     var pbb = document.getElementById('popupblocker-button');
  2553.     var secBarItem = document.getElementById('securitycenter-item');
  2554.     var secSlider = document.getElementById('securitySlider');
  2555.  
  2556.     if(pbb && secBarItem && secSlider)
  2557.     {
  2558.         var tallest = -1;
  2559.         var itemHeight = -1;
  2560.         var secIndex
  2561.         for(var i = 0;i < secSlider.childNodes.length;i++)
  2562.         {
  2563.             itemHeight = secSlider.childNodes[i].childNodes[0].boxObject.height;
  2564.             if(itemHeight > tallest)
  2565.             {
  2566.                 tallest = itemHeight;
  2567.             }
  2568.         }
  2569.         secBarItem.height = tallest + SEC_BAR_EXTRA_HEIGHT;
  2570.  
  2571.         for(var j = 0;j < secSlider.childNodes.length;j++)
  2572.         {
  2573.             secChild = secSlider.childNodes[j];
  2574.             secChildBox = secChild.boxObject;
  2575.             secChild.top = (tallest - secChildBox.height) / 2;
  2576.         }
  2577.     }
  2578. }
  2579.  
  2580. // MERC - JCH : Handle updating site controls.
  2581. // When the button is clicked or the sound or count menu item is checked the
  2582. // update proceeds as follows: If the site is uncontrollable and not about:blank,
  2583. // then do nothing; if the site is about:blank, update default settings; if the
  2584. // site is either explicitly controlled or a local-file type uri, then update the
  2585. // corresponding SC settings; if the site is controlled by the default settings,
  2586. // then add the site to SCs and update the newly added settings.
  2587. function PBBUpdateSiteControls(controlName)
  2588. {
  2589.     if (!gBrowser)
  2590.         return;
  2591.  
  2592.     // Get current url in proper format
  2593.     var uri = gBrowser.currentURI.spec;
  2594.  
  2595.     if (!sitecontrols)
  2596.         return;
  2597.  
  2598.     // If the site is an illegitimate uncontrollable site, do nothing but return.
  2599.     if ((uri != 'about:blank') && (!sitecontrols.SCSVC.isControllableURI(uri)))
  2600.         return;
  2601.  
  2602.     // Get resource related to uri
  2603.     var siteResource = sitecontrols.SCSVC.getResourceForURI(uri);
  2604.  
  2605.     // If the site is about:blank, modify default settings.
  2606.     if (uri == 'about:blank') {
  2607.         siteResource = sitecontrols.SCSVC.getResourceForURI('');
  2608.     }
  2609.  
  2610.     // Remaining cases are local file, explicitly controlled site,
  2611.     // and the various default site types. If site is controlled by a default setting
  2612.     // it must be added as an explicitly controlled site.
  2613.     if ((uri != 'about:blank') && (siteResource.Value == sitecontrols.SC_VERIFIED_DEFAULT ||
  2614.                                    siteResource.Value == sitecontrols.SC_NOT_VERIFIED_DEFAULT ||
  2615.                                    siteResource.Value == sitecontrols.SC_WARNING_DEFAULT))
  2616.     {
  2617.         var host = sitecontrols.getStrippedHostFromURL(uri);
  2618.         sitecontrols.SCSVC.addControlledSite(host);
  2619.         siteResource = sitecontrols.SCSVC.getResourceForURI(host);
  2620.     }
  2621.  
  2622.     // Get current site control setting
  2623.     var controlValue =  sitecontrols.SCSVC.readSiteControlResource(siteResource, controlName);
  2624.  
  2625.  
  2626.     var invVal;
  2627.     if (controlValue.indexOf("true") > -1) invVal = "false";
  2628.     else invVal = "true";
  2629.  
  2630.     // Assign negation of current control value
  2631.     sitecontrols.SCSVC.updateSiteControlResource(siteResource, controlName, invVal);
  2632. }
  2633.  
  2634. /////////////////////////////////////////////////////////////////////////////////
  2635. //                POPUPBLOCK BUTTON MENU ITEMS FUNCTIONALITY                   //
  2636. /////////////////////////////////////////////////////////////////////////////////
  2637.  
  2638. // MERC - JCH: Popups are about to be allowed so disable showing count and sound
  2639. // in both the pbb drop-down menu and in the options-advanced-browsing
  2640. function DisableSoundCountDisplay() {
  2641.     //browserDebug('DisableSoundCountDisplay()\n');
  2642.  
  2643.     // Get current url in proper format
  2644.     var ctrlSite = GetSiteControlResource();
  2645.  
  2646.     // If site is not controllable we will use default settings for xul
  2647.     if (!ctrlSite)
  2648.     ctrlSite = sitecontrols.SCSVC.getResourceForURI('');
  2649.  
  2650.     // Notation: "rg = range = array"
  2651.     var rgMenuSoundAndCount = new Array('popupblocker-showcount','popupblocker-playsound');
  2652.  
  2653.     // browserDebug("\n####### Well here we are in the zone ######\n");
  2654.     for (var i=0; i<2; i++)
  2655.     {
  2656.         // Disable the menu item
  2657.         menuItem = document.getElementById(rgMenuSoundAndCount[i]);
  2658.         if (menuItem)
  2659.         menuItem.setAttribute('disabled','true');
  2660.     }
  2661. }
  2662.  
  2663.  
  2664. // MERC - JCH : When you click on the pop-up blocking button or the sound or
  2665. // count menu items, you first check if the dialog is supposed to show. It will
  2666. // retrieve the user's decision to change site controls. If the dialog has been
  2667. // disabled, then site controls are changed without prompting.
  2668. function DoPBBAction(event, controlName)
  2669. {
  2670.     //browserDebug('DoPBBAction()\n');
  2671.  
  2672.     // Assume we are going to update site control settings
  2673.     var updateSite = true;
  2674.  
  2675.     if (!gPrefService) {
  2676.         event.preventBubble();
  2677.         return;
  2678.     }
  2679.  
  2680.     // Pop-up count is now a global pref
  2681.     if (controlName == "showBlockedCount") {
  2682.         var showCount = gPrefService.getBoolPref("privacy.popups.show_count");
  2683.         gPrefService.setBoolPref("privacy.popups.show_count", !showCount);
  2684.         SetPopupBlockToggle();
  2685.         event.preventBubble();
  2686.       var securitySlider = document.getElementById('securitySlider');
  2687.       if(securitySlider) {
  2688.         securitySlider.adjust();
  2689.       }
  2690.  
  2691.         //Merc - BH: make sure the buttons are displayed properly
  2692.         ResizeSecurityBar();
  2693.  
  2694.         return;
  2695.     }
  2696.  
  2697.     // Pop-up sound is now a global pref
  2698.     if (controlName == "playBlockedSound") {
  2699.         var playSound = gPrefService.getBoolPref("privacy.popups.sound_enabled");
  2700.         gPrefService.setBoolPref("privacy.popups.sound_enabled", !playSound);
  2701.         SetPopupBlockToggle();
  2702.         event.preventBubble();
  2703.         return;
  2704.     }
  2705.  
  2706.     // Check if we show site controls info dialog and get user's choice if we do
  2707.     if (gPrefService.getBoolPref("show.popupblockbutton.dialog"))
  2708.     {
  2709.         // Get current raw url
  2710.         if (!gBrowser) {
  2711.             event.preventBubble();
  2712.             return;
  2713.         }
  2714.  
  2715.         var uri = gBrowser.currentURI.spec;
  2716.  
  2717.         if (!sitecontrols) {
  2718.             event.preventBubble();
  2719.             return;
  2720.         }
  2721.  
  2722.         var siteString;
  2723.  
  2724.         // Get resource related to uri
  2725.         var site = sitecontrols.SCSVC.getResourceForURI(uri);
  2726.  
  2727.         // Check for about:blank URI
  2728.         if (uri == 'about:blank')
  2729.         {
  2730.             siteString = "Default Settings";
  2731.         }
  2732.         else if (site.Value == sitecontrols.SC_LOCAL)
  2733.         {
  2734.             siteString = "Local File Settings";
  2735.         }
  2736.         // If the site value is null then the site in not controllable
  2737.         else if (!site)
  2738.         {
  2739.             event.preventBubble();
  2740.             return;
  2741.         }
  2742.         // The site is controllable and not a local file, so, since we
  2743.         // are going to add it to SC, show it's stripped domain on the dialog
  2744.         else
  2745.         {
  2746.             siteString = sitecontrols.getStrippedHostFromURL(uri);
  2747.         }
  2748.  
  2749.         // Pass in the site string and the boolean set to update SC.
  2750.         // The boolean may be modified by the user depending on how
  2751.         // they respond to dialog prompt
  2752.         var args = new Object();
  2753.         args.doupdate = updateSite;
  2754.         args.site = siteString;
  2755.  
  2756.         updateSite = ShowPBBInfoDialog(args);
  2757.     }
  2758.  
  2759.     // User wants to change site control settings
  2760.     if (updateSite)
  2761.     {
  2762.         PBBUpdateSiteControls(controlName);
  2763.         SetPopupBlockToggle();
  2764.     }
  2765.  
  2766.     event.preventBubble();
  2767.     return;
  2768. }
  2769.  
  2770.  
  2771. // MERC - JCH: Invoke dialog explaining how to properly change SCs. The user can
  2772. // cancel the action as well as deactivate the dialog.
  2773. function ShowPBBInfoDialog(args)
  2774. {
  2775.  
  2776.     window.openDialog("chrome://browser/content/pbbDecisionDialog.xul",
  2777.     "Decision",
  2778.     "modal,centerscreen,chrome,resizable=no",
  2779.     args);
  2780.  
  2781.     return args.doupdate;
  2782. }
  2783.  
  2784. // MERC - JCH: open list of blocked domains with option to make a controlled site
  2785. function BlockerShowList(event)
  2786. {
  2787.     try {
  2788.         window.openDialog("chrome://browser/content/pageReport.xul", "_blank",
  2789.         "modal,resizable,centerscreen");
  2790.  
  2791.         event.preventBubble();
  2792.         return;
  2793.     } catch(ex) { browserDebug("Exception in BlockerShowList\n" + ex + "\n"); }
  2794. }
  2795.  
  2796. // MERC - JCH: open site controls dialog with pertinent site selected
  2797. function BlockerShowSCDialog(event)
  2798. {
  2799.     // not in tabbed mode, ignore this action
  2800.     if (gPrefService.getBoolPref("browser.tabs.autoHide") &&  gBrowser.mTabContainer.childNodes.length < 2)
  2801.         return;
  2802.  
  2803.     var myTab = gBrowser.mCurrentTab;
  2804.  
  2805.     // if we're not in tabbed mode, then do nothing
  2806.     if (!myTab) return;
  2807.  
  2808.     var siteControlPopup = document.getElementById('SiteControlsPopup');
  2809.  
  2810.     // MERC - JCH: For BLT# 147538, set the site controls popup to open the advanced tab when it opens
  2811.     var scTabbox = document.getElementById('scp_tabbox');
  2812.     if (scTabbox)
  2813.         scTabbox.selectedIndex=1;
  2814.  
  2815.     // wrap around a timeout function to avoid conflicting popup focuses
  2816.     if (siteControlPopup) {
  2817.         setTimeout("document.getElementById('SiteControlsPopup').showPopup(gBrowser.mCurrentTab, -1, -1, 'popup', 'bottomleft', 'topleft');",100);
  2818.     }
  2819.     event.preventBubble();
  2820. }
  2821.  
  2822. // MERC - JCH: Zero the popups blocked count
  2823. function ClearPopupCount(event)
  2824. {
  2825.     if (!gBrowser)
  2826.     return;
  2827.     gBrowser.numberBlocked = 0;
  2828.  
  2829.     SetPopupBlockToggle();
  2830.     event.preventBubble();
  2831.     return;
  2832. }
  2833.  
  2834. ////////////////////////////////////////////////////////////////////////////////////
  2835. ////////////////////////////////////////////////////////////////////////////////////
  2836.  
  2837. function OpenClosedTab()
  2838. {
  2839.     TabHistoryList.RestoreLastDeletedTab();
  2840. }
  2841.  
  2842. // MERC (DP): Fired when clear histories button clicked. Will warn the user
  2843. // via a dialog that they are clearing histories.
  2844. function ClearHistoriesButtonClick(event, historyLabel)
  2845. {
  2846.     // Assume we are going to update site control settings
  2847.     var flagval = "true";
  2848.  
  2849.     // Check if we show site controls info dialog
  2850.     if (!gPrefService.getBoolPref("clearhistories.button.dialog"))
  2851.     flagval = ShowClearHistoriesInfoDialog(historyLabel);
  2852.  
  2853.     // User wants to clear histories
  2854.     if (flagval.indexOf("true") > -1) {
  2855.         PrivacyPanel.clearData['history'](false);
  2856.         SetHistoryButton();
  2857.     }
  2858.  
  2859.     event.preventBubble();
  2860.     return;
  2861. }
  2862.  
  2863. // MERC (DP): Invoke dialog explaining that user about to clear histories
  2864. function ShowClearHistoriesInfoDialog(historyLabel)
  2865. {
  2866.     // Pass "doUpdate" into dialog. If it returns 'true' then clear
  2867.     var doUpdate = new String();
  2868.     doUpdate.value = "false";
  2869.  
  2870.     window.openDialog("chrome://browser/content/clearHistoriesDecisionDialog.xul",
  2871.     "Decision",
  2872.     "modal,centerscreen,chrome,resizable=no",
  2873.     doUpdate,
  2874.     historyLabel);
  2875.  
  2876.     return doUpdate.value;
  2877. }
  2878.  
  2879. // MERC - JCH : Update the history button.
  2880. function SetHistoryButton()
  2881. {
  2882.     try {
  2883.         var button = document.getElementById("clearhistories-button");
  2884.         if (!button)
  2885.         return;
  2886.  
  2887.         if (gGlobalHistory == null)
  2888.         return;
  2889.  
  2890.         if (gPrefService == null)
  2891.         return;
  2892.  
  2893.         var isAnonymous = gPrefService.getBoolPref("privacy.anonMode.enabled");
  2894.  
  2895.         var anonMenuItem = document.getElementById("clearHistoryAnonymousMode");
  2896.         anonMenuItem.setAttribute('checked', isAnonymous);
  2897.         if (isAnonymous) {
  2898.             // browserDebug("browser.js SetHistoryButton(): isAnonymous is " +isAnonymous+ "\n");
  2899.             button.setAttribute("historyEmpty", "anon");
  2900.             return;
  2901.         }
  2902.  
  2903.         //browserDebug("browser.js SetHistoryButton(): gGlobalHistory.count is " +gGlobalHistory.count+ "\n");
  2904.  
  2905.         if (gGlobalHistory != null && gGlobalHistory.count == 0) {
  2906.             button.setAttribute("historyEmpty", "true");
  2907.         } else {
  2908.             button.setAttribute("historyEmpty", "false");
  2909.         }
  2910.     } catch(ex) { browserDebug("Exception in SetHistoryButton\n" + ex + "\n"); }
  2911. }
  2912.  
  2913. ////////////////////////////////////////////////////////////////////////////////////////////
  2914.  
  2915. //JA ff5->vulp
  2916. function BrowserReload()
  2917. {
  2918.     const reloadFlags = nsIWebNavigation.LOAD_FLAGS_NONE;
  2919.  
  2920.     // MERC (DP): we really only need to call this when the engine is Trident.
  2921.     // if Gecko, it is taken care of in the onLocationChange handler in
  2922.     // tabbrowser.xml
  2923.     try {
  2924.         UpdateSiteControlIcon();
  2925.     } catch (ex) {}
  2926.  
  2927.     UpdateStatusBarEngineIcon();
  2928.  
  2929.     return BrowserReloadWithFlags(reloadFlags);
  2930. }
  2931. //JA/>
  2932.  
  2933. // MERC (ccampbell) - command for merged stop-reload-button
  2934. function BrowserStopReload(evt) {
  2935.     var btn = document.getElementById('stop-reload-button');
  2936.     if (!btn)
  2937.     return;
  2938.  
  2939.     if (btn.getAttribute('state') == 'stop')
  2940.     {
  2941.     } // JMC- hackish fix for coming back from customize dialog, loses state
  2942. // Else if (btn.getAttribute('state') == 'reload')
  2943. else // if (btn.getAttribute('state') == 'reload')
  2944. {
  2945.     if (evt.shiftKey) BrowserReloadSkipCache();
  2946. else BrowserReload();
  2947. }
  2948. }
  2949.  
  2950. // MERC (ccampbell) - execute command for overflow toolbar item
  2951. function OverflowMenuCommand(btnId) {
  2952.     var btn = document.getElementById(btnId);
  2953.     if (!btn) return;
  2954.     if (btn.hasAttribute('overflowcommand')) {
  2955.         setTimeout(btn.getAttribute('overflowcommand'), 1);
  2956.     } else if (btn.hasAttribute('oncommand')) {
  2957.         btn.doCommand();
  2958.     } else if (btn.hasAttribute('command')) {
  2959.         var cmd = document.getElementById(btn.getAttribute('command'));
  2960.         cmd.doCommand();
  2961.     } else {
  2962.         browserDebug('NOTHING TO DO FOR OVERFLOW MENU ITEM: '+btnId+'\n');
  2963.     }
  2964. }
  2965.  
  2966. // MERC (rpaul) - update the statusbar icon to reflect which engine we're currently in
  2967. function UpdateStatusBarEngineIcon() {
  2968.     var engineBroadcaster = document.getElementById("currentEngineBroadcaster");
  2969.     var currentEngine;
  2970.  
  2971.     // hide the engine icon if the pref isn't set
  2972.     if (!gPrefService.getBoolPref("browser.show_engine_icon")) {
  2973.         engineBroadcaster.setAttribute("collapsed", "true");
  2974.     } else {
  2975.         engineBroadcaster.removeAttribute("collapsed");
  2976.     }
  2977.  
  2978.     // MERC (rpaul)if we have a handle on a tab and we're in tabbed mode, get the current engine
  2979.     // from the tab
  2980.     if (gBrowser.mTabbedMode) {
  2981.         //currentEngine = gBrowser.getBrowserForTab(tab).docShell.browserEngine;
  2982.         currentEngine = gBrowser.mCurrentTab.getAttribute("engine");
  2983.  
  2984.         if (!currentEngine) currentEngine = "Gecko";
  2985.         else currentEngine = "Trident";
  2986.  
  2987. } else {
  2988.         // browser isn't in tabbed mode
  2989.     if (!gBrowser.mTabbedMode) {
  2990.         var currentTab = gBrowser.mCurrentTab;
  2991.         if (currentTab)
  2992.             currentEngine = gBrowser.getBrowserForTab(currentTab).docShell.browserEngine;
  2993.     }
  2994. }
  2995.  
  2996.     if (currentEngine == "Gecko") {
  2997.         engineBroadcaster.setAttribute("src", "chrome://browser/skin/firefox-dropmarker-16px.png");
  2998.         engineBroadcaster.setAttribute("value", "Gecko");
  2999.  
  3000.         //enable "Toggle Rendering engines in View menu"
  3001.       document.getElementById('viewMenuToggleRenderingEngine').removeAttribute('disabled');
  3002.  
  3003.         //uncheck "Display Like Internet Explorer" in status bar engine menu
  3004.         document.getElementById('displayLikeIE').removeAttribute('checked');
  3005.         document.getElementById('displayLikeIE').removeAttribute('disabled');
  3006.  
  3007.         // check "Display Like Firefox" in status bar engine menu
  3008.         document.getElementById('displayLikeFirefox').setAttribute('checked', 'true');
  3009.         document.getElementById('displayLikeFirefox').setAttribute('disabled', 'true');
  3010.  
  3011.         // disable "Display like firefox in view->rendering engines menu
  3012.         document.getElementById('engineIsFirefoxBroadcaster').setAttribute('disabled', 'true');
  3013.         document.getElementById('engineIsIEBroadcaster').removeAttribute('disabled');
  3014.  
  3015.     } else if (currentEngine == "Trident") {
  3016.         engineBroadcaster.setAttribute("src", "chrome://browser/skin/ie_icon-dropmarker.gif");
  3017.         engineBroadcaster.setAttribute("value", "IE");
  3018.  
  3019.         //enable "Toggle Rendering engines in View menu"
  3020.       document.getElementById('viewMenuToggleRenderingEngine').removeAttribute('disabled');
  3021.  
  3022.         //uncheck "Display Like Firefox" in status bar engine menu
  3023.         document.getElementById('displayLikeFirefox').removeAttribute('checked');
  3024.         document.getElementById('displayLikeFirefox').removeAttribute('disabled');
  3025.  
  3026.         // check "Display Like Internet Explorer" in status bar engine menu
  3027.         document.getElementById('displayLikeIE').setAttribute('checked', 'true');
  3028.         document.getElementById('displayLikeIE').setAttribute('disabled', 'true');
  3029.  
  3030.         // disable "Display like IE in view->rendering engines menu
  3031.         document.getElementById('engineIsIEBroadcaster').setAttribute('disabled', 'true');
  3032.         document.getElementById('engineIsFirefoxBroadcaster').removeAttribute('disabled');
  3033.  
  3034.     } else {
  3035.         browserDebug("Unknown engine name: " + currentEngine + "\n");
  3036.     }
  3037. }
  3038.  
  3039. function UpdateStatusbarEngineIconTrident() {
  3040.     var engineBroadcaster = document.getElementById("currentEngineBroadcaster");
  3041.  
  3042.     engineBroadcaster.setAttribute("src", "chrome://browser/skin/ie_icon-dropmarker.gif");
  3043.     engineBroadcaster.setAttribute("value", "IE");
  3044.  
  3045.     //enable "Toggle Rendering engines in View menu"
  3046.   document.getElementById('viewMenuToggleRenderingEngine').removeAttribute('disabled');
  3047.  
  3048.     //uncheck "Display Like Firefox" in status bar engine menu
  3049.     document.getElementById('displayLikeFirefox').removeAttribute('checked');
  3050.     document.getElementById('displayLikeFirefox').removeAttribute('disabled');
  3051.  
  3052.     // check "Display Like Internet Explorer" in status bar engine menu
  3053.     document.getElementById('displayLikeIE').setAttribute('checked', 'true');
  3054.     document.getElementById('displayLikeIE').setAttribute('disabled', 'true');
  3055.  
  3056.     // disable "Display like IE in view->rendering engines menu
  3057.     document.getElementById('engineIsIEBroadcaster').setAttribute('disabled', 'true');
  3058.     document.getElementById('engineIsFirefoxBroadcaster').removeAttribute('disabled');
  3059. }
  3060.  
  3061. // MERC (DP): populates partner icons (if any) into the status bar
  3062. function UpdateStatusbarPartnerIcons() {
  3063.     var iconContainer = document.getElementById('partner-icons-container');
  3064.  
  3065.     // clear the partner icons
  3066.     while(iconContainer.firstChild) {
  3067.         iconContainer.removeChild(iconContainer.firstChild);
  3068.     }
  3069.  
  3070.     var sc = sitecontrols.SCSVC;
  3071.     var url = gBrowser.getBrowserForTab(gBrowser.mCurrentTab).currentURI.spec;
  3072.  
  3073.     var urlArray;
  3074.     var iconArray;
  3075.     switch(sc.getSiteTrustLevel(url)) {
  3076.         case 0:
  3077.             // whitelisted
  3078.             var whiteListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_WHITELIST_IDX);
  3079.             var urlStr = sc.getSiteTrustProviderURL(whiteListCode);
  3080.             urlArray = urlStr.split('|');
  3081.             var iconStr = sc.getSiteTrustProviderIcon(whiteListCode);
  3082.             iconArray = iconStr.split('|');
  3083.             break;
  3084.         case 2:
  3085.             // phish
  3086.             var phishListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_PHISHLIST_IDX);
  3087.             var urlStr = sc.getSiteTrustProviderURL(phishListCode);
  3088.             urlArray = urlStr.split('|');
  3089.             var iconStr = sc.getSiteTrustProviderIcon(phishListCode);
  3090.             iconArray = iconStr.split('|');
  3091.             break;
  3092.         case 4:
  3093.             // spy
  3094.             var spyListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_SPYLIST_IDX);
  3095.             var urlStr = sc.getSiteTrustProviderURL(spyListCode);
  3096.             urlArray = urlStr.split('|');
  3097.             var iconStr = sc.getSiteTrustProviderIcon(spyListCode);
  3098.             iconArray = iconStr.split('|');
  3099.             break;
  3100.         case 6:
  3101.             var phishListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_PHISHLIST_IDX);
  3102.             var plistStr = sc.getSiteTrustProviderName(phishListCode);
  3103.             var plistArray = plistStr.split('|');
  3104.             var purlStr = sc.getSiteTrustProviderURL(phishListCode);
  3105.             var purlArray = purlStr.split('|');
  3106.             var piconStr = sc.getSiteTrustProviderIcon(phishListCode);
  3107.             var piconArray = piconStr.split('|');
  3108.  
  3109.             var spyListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_SPYLIST_IDX);
  3110.             var slistStr = sc.getSiteTrustProviderName(spyListCode);
  3111.             var slistArray = slistStr.split('|');
  3112.             var surlStr = sc.getSiteTrustProviderURL(spyListCode);
  3113.             var surlArray = surlStr.split('|');
  3114.             var siconStr = sc.getSiteTrustProviderIcon(spyListCode);
  3115.             var siconArray = siconStr.split('|');
  3116.  
  3117.             var combinedURLArray = purlArray;
  3118.             var combinedIconArray = piconArray;
  3119.             var found;
  3120.  
  3121.             for(var arrayItem in slistArray) {
  3122.                 found = false;
  3123.                 for(var k = 0; k < plistArray.length; k++) {
  3124.                     if(slistArray[arrayItem] == plistArray[k]) {
  3125.                         found = true;
  3126.                         break;
  3127.                     }
  3128.                 }
  3129.                 if(!found) {
  3130.                     combinedURLArray.push(surlArray[arrayItem]);
  3131.                     combinedIconArray.push(siconArray[arrayItem]);
  3132.                 }
  3133.             }
  3134.             urlArray = combinedURLArray;
  3135.             iconArray = combinedIconArray;
  3136.             break;
  3137.         case 1:
  3138.         default:
  3139.             // unknown
  3140.     }
  3141.  
  3142.     if(!iconArray || !iconArray.length) {
  3143.         iconContainer.setAttribute('hidden', 'true');
  3144.     } else {
  3145.         iconContainer.removeAttribute('hidden');
  3146.  
  3147.         var iconElem;
  3148.         for(var i = 0; i < iconArray.length; i++) {
  3149.             if(iconArray[i]) {
  3150.                 iconElem = document.createElement("image");
  3151.                 iconElem.setAttribute("src", iconArray[i]);
  3152.                 iconElem.setAttribute("onclick", "loadPartnerPageFromStatusBar('" + urlArray[i] + "');");
  3153.                 iconElem.setAttribute("style", "padding-left: 4px;");
  3154.                 iconContainer.appendChild(iconElem);
  3155.             }
  3156.         }
  3157.     }
  3158. }
  3159.  
  3160. function loadPartnerPageFromStatusBar(url) {
  3161.     var trustTab = gBrowser.addTabAt(url);
  3162.     if (!gPrefService.getBoolPref("browser.tabs.loadInBackground"))
  3163.         gBrowser.selectedTab = trustTab;
  3164. }
  3165.  
  3166. // MERC (DP) - update the icon to match security level AND browser engine
  3167. function UpdateSiteControlIcon(tab)
  3168. {
  3169.     //browserDebug('UpdateSiteControlIcon()\n');
  3170.     // if no tab specified, use the current tab
  3171.     if (!tab) {
  3172.         tab = gBrowser.mCurrentTab;
  3173.     }
  3174.     var tabWindow = gBrowser.getBrowserForTab(tab);
  3175.     var url = tabWindow.currentURI.spec;
  3176.     var menubutton = document.getAnonymousElementByAttribute(tab, 'anonid', 'menubutton');
  3177.  
  3178.     // MERC - JCH: Sanity check
  3179.     if (!menubutton)
  3180.         return;
  3181.  
  3182.     if (!sitecontrols.SCSVC.isControllableURI(url)) {
  3183.         menubutton.setAttribute('hidden', 'true');
  3184.     } else {
  3185.         menubutton.removeAttribute('hidden');
  3186.  
  3187.         var site;
  3188.         if(url == 'about:blank') {
  3189.             site = sitecontrols.SCSVC.getResourceForURI('');
  3190.         } else {
  3191.             site = sitecontrols.SCSVC.getResourceForURI(url);
  3192.         }
  3193.  
  3194.         // MERC - JCH: 'site' is already a resource
  3195.         // site = site.QueryInterface(Components.interfaces.nsIRDFResource);
  3196.  
  3197.         // if host is not controlled (default), change icon accordingly
  3198.         //  MERC - JCH: Three possible default settings now
  3199.         // if (site.Value == sitecontrols.DEFAULT_SITE)
  3200.         if ((site.Value == sitecontrols.SC_VERIFIED_DEFAULT) ||
  3201.             (site.Value == sitecontrols.SC_NOT_VERIFIED_DEFAULT) ||
  3202.             (site.Value == sitecontrols.SC_WARNING_DEFAULT))
  3203.         {
  3204.             menubutton.setAttribute("defaultSC", "true");
  3205.         }
  3206.         else
  3207.             menubutton.removeAttribute("defaultSC");
  3208.  
  3209.         var trustLevel = 1;
  3210.         try {
  3211.               // MERC - JCH: Pass host string to getSiteTrustLevel()
  3212.             if (tabWindow.currentURI.spec) {
  3213.                 trustLevel = sitecontrols.SCSVC.getSiteTrustLevel(tabWindow.currentURI.spec);
  3214.             }
  3215.         } catch (ex) {
  3216.             browserDebug("Caught exception : " + ex + "\n\n");
  3217.         }
  3218.         menubutton.setAttribute("trustLevel", trustLevel);
  3219.  
  3220.         // if trust settings is disabled
  3221.         var securityLevel;
  3222.         if(trustLevel == -1 && !sitecontrols.SCSVC.isControlledSite(tabWindow.currentURI.host)) {
  3223.             securityLevel = gPrefService.getCharPref("trustsettings.default");
  3224.         } else {
  3225.             securityLevel = sitecontrols.SCSVC.readSiteControlResource(site, 'securityLevel');
  3226.         }
  3227.         menubutton.setAttribute("browserSetting", securityLevel);
  3228.  
  3229.         // update the down menubutton icon according to what browser engine is set
  3230.         var currentEngine = gBrowser.getBrowserForTab(tab).docShell.browserEngine;
  3231.  
  3232.         /*
  3233.         browserDebug('********** SECURITY LEVEL ***************\n');
  3234.         browserDebug('Host: ' + site.Value + ' - Level: ' + securityLevel + '\n');
  3235.         browserDebug('********** Current Engine ***************\n');
  3236.         browserDebug('engine: ' + currentEngine + '\n');
  3237.         browserDebug('*****************************************\n');
  3238.         */
  3239.  
  3240.         if (currentEngine == "Gecko") {
  3241.             tab.removeAttribute("engine");
  3242.             menubutton.setAttribute("engine", "Gecko");
  3243.         } else if (currentEngine == "Trident") {
  3244.             tab.setAttribute("engine", "Trident");
  3245.             menubutton.setAttribute("engine", "Trident");
  3246.         } else {
  3247.             browserDebug("Unknown engine name: " + currentEngine + "\n");
  3248.         }
  3249.  
  3250.         // MERC (rpaul) update the statusbar engine icon when the
  3251.         // the site control has been updated for a particular tab
  3252.         UpdateStatusBarEngineIcon();
  3253.     }
  3254. }
  3255.  
  3256. /*
  3257. engine    ActiveX     Javascript     Java        securityLevel
  3258. weight  8         4           2              1
  3259. Gecko     false       false          false       High
  3260. Gecko     false       false          true        Medium
  3261. Gecko     false       true           false       Medium
  3262. Gecko     false       true           true        Medium
  3263. Gecko     true        false          false       High
  3264. Gecko     true        false          true        Medium
  3265. Gecko     true        true           false       Medium
  3266. Gecko     true        true           true        Medium
  3267. Trident   false       false          false       High
  3268. Trident   false       false          true        Medium
  3269. Trident   false       true           false       Medium
  3270. Trident   false       true           true        Medium
  3271. Trident   true        false          false       Low
  3272. Trident   true        false          true        Low
  3273. Trident   true        true           false       Low
  3274. Trident   true        true           true        Low
  3275.  
  3276.  
  3277. */
  3278.  
  3279. // ********* if you change this var, you need to change in pref-sitecontrols.js as well
  3280. var gSecurityLevels= new Array('High','Medium','Medium','Medium','High','Medium','Medium','Medium', 'High','Medium', 'Medium', 'Medium', 'Low', 'Low', 'Low', 'Low');
  3281. function updateSCSecurityLevel()
  3282. {
  3283.     var wtEngine, wtActiveX, wtJS, wtJava;
  3284.  
  3285.     // Get RDF resource for the controlled site
  3286.     // *** at this point host should always be controlled since it gets added when
  3287.     // you select activex, java, js from the dropdown menu
  3288.     var site = GetSiteControlResource();
  3289.  
  3290.     var displayEngine = getWebNavigation().browserEngine;
  3291.     var enableActiveX = sitecontrols.SCSVC.readSiteControlResource(site, 'enableActiveX');
  3292.     var enableJava = sitecontrols.SCSVC.readSiteControlResource(site, 'enableJava');
  3293.     var enableJavaScript = sitecontrols.SCSVC.readSiteControlResource(site, 'enableJavaScript');
  3294.  
  3295.     var sec;
  3296.     if (displayEngine == 'Trident')
  3297.     wtEngine=8;
  3298. else
  3299.     wtEngine=0;
  3300.  
  3301.     if(enableActiveX == 'true')
  3302.     wtActiveX=4;
  3303. else
  3304.     wtActiveX=0;
  3305.  
  3306.     if(enableJavaScript == 'true')
  3307.     wtJS=2;
  3308. else
  3309.     wtJS=0;
  3310.  
  3311.     if(enableJava == 'true')
  3312.     wtJava=1;
  3313. else
  3314.     wtJava=0;
  3315.  
  3316.     var idx = wtEngine + wtActiveX + wtJS + wtJava;
  3317.     var securityLevel = gSecurityLevels[idx];
  3318.  
  3319.     /*
  3320.     browserDebug('************** updateSCSecurityLevel() *******************\n');
  3321.     browserDebug('host: ' + host + '\n');
  3322.     browserDebug('displayEngine: ' + displayEngine + '\n');
  3323.     browserDebug('enableActiveX: ' + enableActiveX + '\n');
  3324.     browserDebug('enableJava: ' + enableJava + '\n');
  3325.     browserDebug('enableJavaScript: ' + enableJavaScript + '\n');
  3326.     browserDebug('securityLevel: ' + securityLevel + '\n');
  3327.     browserDebug('idx: ' + idx + '\n');
  3328.     browserDebug('**********************************************************\n');
  3329.     */
  3330.  
  3331.     sitecontrols.SCSVC.updateSiteControlResource(site, 'securityLevel', securityLevel);
  3332.     // sitecontrols.SCSVC.writeSiteControls();
  3333. }
  3334.  
  3335. function BrowserReloadSkipCache()
  3336. {
  3337.     // Bypass proxy and cache.
  3338.     urlLoadFromBar = true;    
  3339.     const reloadFlags = nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE;
  3340.     return BrowserReloadWithFlags(reloadFlags);
  3341. }
  3342.  
  3343. function BrowserHome(forceNewTab)
  3344. {
  3345.     var homePage = gHomeButton.getHomePage();
  3346.     //JA ff5->vulp loadOneOrMoreURIs(homePage);
  3347.     // if overwrite: load tabs left to right - add tabs as needed
  3348.     // if new: add tabs starting at position specified browser.tabs.newTabLocation
  3349.     if(!forceNewTab && gPrefService.getCharPref("browser.tabs.homepage.open") == 'overwrite') {
  3350.         loadOneOrMoreURIsOnHomePageClick(homePage);
  3351.     } else { // else == 'new'
  3352.         addOneOrMoreURIs(homePage);
  3353.     }//JA/>
  3354. }
  3355.  
  3356. function loadOneOrMoreURIsOnHomePageClick(aURIString)
  3357. {
  3358.     if (aURIString.indexOf("|") != -1) {
  3359.         var i;
  3360.  
  3361.         // get browser tabs
  3362.         var browserTabs = gBrowser.mTabContainer.childNodes;
  3363.  
  3364.         // get URLs
  3365.         var urls = aURIString.split("|");
  3366.  
  3367.         // 3 cases:
  3368.         if (browserTabs.length < urls.length) {
  3369.             // a) if # tabs < # URLs
  3370.             for (i = 0; i < browserTabs.length; i++) {
  3371.                 gBrowser.getBrowserForTab(browserTabs[i]).loadURI(urls[i]);
  3372.             }
  3373.             for (i = browserTabs.length; i < urls.length; i++) {
  3374.                 gBrowser.addTab(urls[i]);
  3375.             }
  3376.         } else if (browserTabs.length > urls.length) {
  3377.             // b) if # tabs > # URLs
  3378.             for (i = 0; i < urls.length; i++) {
  3379.                 gBrowser.getBrowserForTab(browserTabs[i]).loadURI(urls[i]);
  3380.             }
  3381.         } else {
  3382.             // c) if # tabs == # URLs
  3383.             for (i = 0; i < urls.length; i++) {
  3384.                 gBrowser.getBrowserForTab(browserTabs[i]).loadURI(urls[i]);
  3385.             }
  3386.         }
  3387.  
  3388.         // set focus to the first tab
  3389.         gBrowser.selectedTab = browserTabs[0];
  3390.  
  3391.     } else {
  3392.         // only one URL specifed
  3393.         loadURI(aURIString, null, null);
  3394.     }
  3395.  
  3396.     // update the tab chrome
  3397.     gBrowser.updateChromeWhenLastTab();
  3398. }
  3399.  
  3400. function closeAllTabsFromSameSite() {
  3401.     var browserPanels = gBrowser.mPanelContainer.childNodes;
  3402.  
  3403.     for(var i = 0; i < browserPanels.length; i++) {
  3404.         // browserDebug("*** URL: " + browserPanels[i].getCurrentURI() + "\n");
  3405.     }
  3406. }
  3407.  
  3408. // MERC (DP): adds tabs starting at browser.tabs.newTabLocation and subsequently
  3409. // to the right. select the first tab added after.
  3410. function addOneOrMoreURIs(aURIString)
  3411. {
  3412.     var savedSelectedTab = gBrowser.selectedTab;
  3413.     var firstAdded;
  3414.  
  3415.     if (aURIString.indexOf("|") != -1) {
  3416.         var urls = aURIString.split("|");
  3417.         gBrowser.selectedTab = gBrowser.addTabAt(urls[0]);
  3418.  
  3419.         // save the first tab add, so that we can focus it at the end
  3420.         firstAdded = gBrowser.selectedTab;
  3421.  
  3422.         for (var i = 1; i < urls.length; ++i)
  3423.         gBrowser.selectedTab = gBrowser.addTabAt(urls[i], 'right');
  3424.     }
  3425. else {
  3426.     firstAdded = gBrowser.addTabAt(aURIString);
  3427. }
  3428.  
  3429. /* comment this out because we always want to focus the first tab
  3430. if(gPrefService.getBoolPref("browser.tabs.loadInBackground")) {
  3431. // focus the tab active before addition
  3432. gBrowser.selectedTab = savedSelectedTab;
  3433. } else {
  3434. // focus the first added tab
  3435. gBrowser.selectedTab = firstAdded;
  3436. }
  3437. */
  3438.  
  3439. // focus the first added tab
  3440. gBrowser.selectedTab = firstAdded;
  3441. }
  3442.  
  3443.  
  3444. function BrowserHomeClick(aEvent)
  3445. {
  3446.     if (aEvent.button == 2) // right-click: do nothing
  3447.         return;
  3448.  
  3449.     var homePage = gHomeButton.getHomePage();
  3450.     var where = whereToOpenLink(aEvent);
  3451.     var urls;
  3452.  
  3453.     // openUILinkIn in utilityOverlay.js doesn't handle loading multiple pages
  3454.     switch (where) {
  3455.     case "save":
  3456.         urls = homePage.split("|");
  3457.         saveURL(urls[0], null, null, true);  // only save the first page
  3458.         break;
  3459.     case "current":
  3460.         loadOneOrMoreURIs(homePage);
  3461.         break;
  3462.     case "tabshifted":
  3463.     case "tab":
  3464.         urls = homePage.split("|");
  3465.         var firstTabAdded = gBrowser.addTab(urls[0]);
  3466.         for (var i = 1; i < urls.length; ++i)
  3467.             gBrowser.addTab(urls[i]);
  3468.         if ((where == "tab") ^ getBoolPref("browser.tabs.loadBookmarksInBackground", false)) {
  3469.             gBrowser.selectedTab = firstTabAdded;
  3470.             _content.focus();
  3471.         }
  3472.         break;
  3473.     case "window":
  3474.         OpenBrowserWindow();
  3475.         break;
  3476.     }
  3477. }
  3478.  
  3479. function loadOneOrMoreURIs(aURIString)
  3480. {
  3481.     var urls = aURIString.split("|");
  3482.     loadURI(urls[0]);
  3483.     for (var i = 1; i < urls.length; ++i)
  3484.         gBrowser.addTab(urls[i]);
  3485. }
  3486.  
  3487. function constructGoMenuItem(goMenu, beforeItem, url, title)
  3488. {
  3489.     var menuitem = document.createElementNS(kXULNS, "menuitem");
  3490.     menuitem.setAttribute("statustext", url);
  3491.     menuitem.setAttribute("label", title);
  3492.     goMenu.insertBefore(menuitem, beforeItem);
  3493.     return menuitem;
  3494. }
  3495.  
  3496. function onGoMenuHidden()
  3497. {
  3498.     setTimeout(destroyGoMenuItems, 0, document.getElementById('goPopup'));
  3499. }
  3500.  
  3501. function destroyGoMenuItems(goMenu) {
  3502.     var startSeparator = document.getElementById("startHistorySeparator");
  3503.     var endSeparator = document.getElementById("endHistorySeparator");
  3504.     endSeparator.hidden = true;
  3505.  
  3506.     // Destroy the items.
  3507.     var destroy = false;
  3508.     for (var i = 0; i < goMenu.childNodes.length; i++) {
  3509.         var item = goMenu.childNodes[i];
  3510.         if (item == endSeparator)
  3511.             break;
  3512.  
  3513.         if (destroy) {
  3514.             i--;
  3515.             goMenu.removeChild(item);
  3516.         }
  3517.  
  3518.         if (item == startSeparator)
  3519.             destroy = true;
  3520.     }
  3521. }
  3522.  
  3523. function updateGoMenu(goMenu)
  3524. {
  3525.     // In case the timer didn't fire.
  3526.     destroyGoMenuItems(goMenu);
  3527.  
  3528.     var history = document.getElementById("hiddenHistoryTree");
  3529.  
  3530.     if (history.hidden) {
  3531.         history.hidden = false;
  3532.         var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
  3533.                                       .getService(Components.interfaces.nsIRDFDataSource);
  3534.         history.database.AddDataSource(globalHistory);
  3535.     }
  3536.  
  3537.     if (!history.ref)
  3538.         history.ref = "NC:HistoryRoot";
  3539.  
  3540.     var count = history.treeBoxObject.view.rowCount;
  3541.     if (count > 10)
  3542.         count = 10;
  3543.  
  3544.     if (count == 0)
  3545.         return;
  3546.  
  3547.     const NC_NS     = "http://home.netscape.com/NC-rdf#";
  3548.  
  3549.     if (!gRDF)
  3550.         gRDF = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  3551.                          .getService(Components.interfaces.nsIRDFService);
  3552.  
  3553.     var builder = history.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder);
  3554.  
  3555.     var beforeItem = document.getElementById("endHistorySeparator");
  3556.  
  3557.     var nameResource = gRDF.GetResource(NC_NS + "Name");
  3558.  
  3559.     var endSep = beforeItem;
  3560.     var showSep = false;
  3561.  
  3562.     for (var i = count-1; i >= 0; i--) {
  3563.         var res = builder.getResourceAtIndex(i);
  3564.         var url = res.Value;
  3565.         var titleRes = history.database.GetTarget(res, nameResource, true);
  3566.         if (!titleRes)
  3567.             continue;
  3568.  
  3569.         showSep = true;
  3570.         var titleLiteral = titleRes.QueryInterface(Components.interfaces.nsIRDFLiteral);
  3571.         beforeItem = constructGoMenuItem(goMenu, beforeItem, url, titleLiteral.Value);
  3572.     }
  3573.  
  3574.     if (showSep)
  3575.         endSep.hidden = false;
  3576. }
  3577.  
  3578. // MERC - JCH : Add one site to bookmarks. Referred to in browser-context.inc,
  3579. // browser-sets.inc, browser.xul, tabbox.xml, and tabbrowser.xml.
  3580. function bookmarkPage(aBrowser, aIsWebPanel)
  3581. {
  3582.     addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel, false, aBrowser.isRSSPretty);
  3583. }
  3584.  
  3585. function bookmarkPageFromMultibar(aBrowser, aIsWebPanel)
  3586. {
  3587.     addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel, true, aBrowser.isRSSPretty);
  3588. }
  3589.  
  3590. // MERC - JCH: Add all the current tabs to bookmarks.
  3591. function bookmarkAllTabs(aBrowser, isMultibarButton, aIsWebPanel)
  3592. {
  3593.     const browsers = aBrowser.browsers;
  3594.     if (browsers && browsers.length > 1)
  3595.         addBookmarkForTabBrowser(aBrowser, isMultibarButton);
  3596.     else addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel, isMultibarButton,aBrowser.isRSSPretty);
  3597. }
  3598.  
  3599.  
  3600. function addBookmarkAs(aBrowser, aIsWebPanel, bTabGroup)
  3601. {
  3602.     const browsers = aBrowser.browsers;
  3603.     if (browsers && browsers.length > 1)
  3604.     {
  3605.         if (bTabGroup)
  3606.         {
  3607.             bookmarkAllTabs(aBrowser, true, aIsWebPanel);
  3608.         } else {
  3609.             addBookmarkForTabBrowser(aBrowser);
  3610.         }
  3611.     } else {
  3612.         addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel,false,aBrowser.isRSSPretty);
  3613.     }
  3614. }
  3615.  
  3616. function addBookmarkForTabBrowser(aTabBrowser, aSelect)
  3617. {
  3618.     var tabsInfo = [];
  3619.     var currentTabInfo = { name: "", url: "", charset: null };
  3620.  
  3621.     const activeBrowser = aTabBrowser.selectedBrowser;
  3622.     const browsers = aTabBrowser.browsers;
  3623.     for (var i = 0; i < browsers.length; ++i) {
  3624.         var webNav = browsers[i].webNavigation;
  3625.         var url = webNav.currentURI.spec;
  3626.         if (browsers[i].isRSSPretty && url.indexOf("feed:") != 0)
  3627.             url = "feed:" + url;
  3628.         var name = "";
  3629.         var charSet;
  3630.         try {
  3631.             var doc = webNav.document;
  3632.             name = doc.title || url;
  3633.             charSet = doc.characterSet;
  3634.         } catch (e) {
  3635.             name = url;
  3636.         }
  3637.         tabsInfo[i] = { name: name, url: url, charset: charSet };
  3638.         if (browsers[i] == activeBrowser)
  3639.             currentTabInfo = tabsInfo[i];
  3640.     }
  3641.  
  3642.     openDialog( "chrome://browser/content/bookmarks/addBookmark2.xul",
  3643.                 "",
  3644.                 "centerscreen,chrome,dialog,resizable,dependent",
  3645.                 currentTabInfo.name,
  3646.                 currentTabInfo.url,
  3647.                 null,
  3648.                 currentTabInfo.charset,
  3649.                 "addGroup" + (aSelect ? ",group" : ""),
  3650.                 tabsInfo,
  3651.                 null, null, null, null, null, aSelect);
  3652. }
  3653.  
  3654. function addBookmarkForBrowser(aDocShell, aIsWebPanel, cmdFromMultibar, aMakeLivemark)
  3655. {
  3656.     // Bug 52536: We obtain the URL and title from the nsIWebNavigation
  3657.     // associated with a <browser/> rather than from a DOMWindow.
  3658.     // This is because when a full page plugin is loaded, there is
  3659.     // no DOMWindow (?) but information about the loaded document
  3660.     // may still be obtained from the webNavigation.
  3661.  
  3662.     var url = aDocShell.currentURI.spec;
  3663.     if (aMakeLivemark) {
  3664.         if (url.indexOf("feed:") != 0) url = "feed:" + url;
  3665.     }
  3666.     var title, charSet = null;
  3667.     try {
  3668.         title = aDocShell.document.title || url;
  3669.         charSet = aDocShell.document.characterSet;
  3670.     }
  3671.     catch (e) {
  3672.         title = url;
  3673.     }
  3674.     if (cmdFromMultibar) BookmarksUtils.addBookmarkFromMultibar(url, title, charSet, aIsWebPanel);
  3675.     else BookmarksUtils.addBookmark(url, title, charSet, aIsWebPanel);
  3676. }
  3677.  
  3678. // MERC (DP): this function is only called from inside tabbrowser.  It is needed
  3679. // for the case when you add a bookmark using the tab context menu from a
  3680. // non-active tab.
  3681. function bookmarkPageFromTabRightClick()
  3682. {
  3683.     var uri = gBrowser.getBrowserForTab(gBrowser.mContextTab).currentURI.spec;
  3684.     var title = gBrowser.mContextTab.label;
  3685.  
  3686.     BookmarksUtils.addBookmark(uri, title);
  3687. }
  3688.  
  3689. function openLocation()
  3690. {
  3691.     if (gURLBar && !gURLBar.parentNode.parentNode.collapsed) {
  3692.         gURLBar.focus();
  3693.         gURLBar.select();
  3694.     }
  3695. else {
  3696.     openDialog("chrome://browser/content/openLocation.xul", "_blank", "chrome,modal,titlebar", window);
  3697. }
  3698. }
  3699.  
  3700. function BrowserOpenTab()
  3701. {
  3702.     gBrowser.selectedTab = gBrowser.addTabAt('about:blank');
  3703.  
  3704.     // MERC (rpaul) update the current engine broadcaster for the statusbar
  3705.     // blank tabs are by default Gecko
  3706.     //UpdateStatusBarEngineIcon();
  3707.  
  3708.     if (gURLBar)
  3709.         setTimeout(function() { gURLBar.focus(); }, 0);
  3710. }
  3711.  
  3712. function BrowserNetscapeTab()
  3713. {
  3714.     var url;
  3715.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  3716.                          .getService(Components.interfaces.nsIPrefBranch);
  3717.     try {
  3718.         url = gPrefService.getComplexValue("browser.netscape.homepage",
  3719.                                            Components.interfaces.nsIPrefLocalizedString).data;
  3720.     } catch(e) {browserDebug ("Caught Exception: " + e + "\n"); }
  3721.  
  3722.     gBrowser.selectedTab = gBrowser.addTabAt(url);
  3723. }
  3724.  
  3725. //<JA ff5->vulp
  3726. var gCurrentDocCharset = null;
  3727.  
  3728. function BrowserStoreTabCharset()
  3729. {
  3730.     gCurrentDocCharset = window._content.document.characterSet;
  3731. }
  3732.  
  3733. function BrowserOpenPrefTab()
  3734. {
  3735.     gBrowser.selectedTab = gBrowser.addPrefTab();
  3736. }
  3737.  
  3738. // MERC (DP)
  3739. function BrowserOpenNewCurrentTab() {
  3740.     currentTab = gBrowser.mCurrentTab;
  3741.     var curTabBrowser=gBrowser.getBrowserForTab(currentTab);
  3742.     var sHistory=curTabBrowser.sessionHistory;
  3743.     gBrowser.selectedTab = gBrowser.addTabAtWithFlag(0,gBrowser.getBrowserForTab(currentTab).currentURI.spec);
  3744.     var newTabBrowser=gBrowser.getBrowserForTab(gBrowser.selectedTab);
  3745.     newTabBrowser.sessionHistory.appendFrom(sHistory);
  3746. }//JA/>
  3747.  
  3748. /* Called from the openLocation dialog. This allows that dialog to instruct
  3749. its opener to open a new window and then step completely out of the way.
  3750. Anything less byzantine is causing horrible crashes, rather believably,
  3751. though oddly only on Linux. */
  3752. function delayedOpenWindow(chrome,flags,url)
  3753. {
  3754.     // The other way to use setTimeout,
  3755.     // setTimeout(openDialog, 10, chrome, "_blank", flags, url),
  3756.     // doesn't work here.  The extra "magic" extra argument setTimeout adds to
  3757.     // the callback function would confuse prepareForStartup() by making
  3758.     // window.arguments[1] be an integer instead of null.
  3759.     setTimeout(function() { openDialog(chrome, "_blank", flags, url); }, 10);
  3760. }
  3761.  
  3762. /* Required because the tab needs time to set up its content viewers and get the load of
  3763. the URI kicked off before becoming the active content area. */
  3764. function delayedOpenTab(url)
  3765. {
  3766.     setTimeout(function(aTabElt) { gBrowser.selectedTab = aTabElt; }, 0, gBrowser.addTabAt(url));
  3767. }
  3768.  
  3769. function BrowserOpenFileWindow()
  3770. {
  3771.     // Get filepicker component.
  3772.     try {
  3773.         const nsIFilePicker = Components.interfaces.nsIFilePicker;
  3774.         var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  3775.         fp.init(window, gNavigatorBundle.getString("openFile"), nsIFilePicker.modeOpen);
  3776.         fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterText | nsIFilePicker.filterImages |
  3777.         nsIFilePicker.filterXML | nsIFilePicker.filterHTML);
  3778.  
  3779.         if (fp.show() == nsIFilePicker.returnOK) {
  3780.             // MERC (DP): respect local file open pref
  3781.             var openPref = gPrefService.getCharPref("browser.tabs.localfile.open");
  3782.             if (openPref == 'overwrite') {
  3783.                 openTopWin(fp.fileURL.spec);
  3784.             } else {
  3785.                 // browserDebug("Opening file: " + fp.fileURL.spec + " with addTabAt()\n");
  3786.                 var t = gBrowser.addTabAt(fp.fileURL.spec);
  3787.                 if(!gPrefService.getBoolPref("browser.tabs.loadInBackground")) {
  3788.                     gBrowser.selectedTab = t;
  3789.                 }
  3790.             }
  3791.             // END MERC
  3792.  
  3793.         }
  3794.     } catch (ex) {
  3795.     }
  3796. }
  3797.  
  3798. function BrowserCloseCurrentTab()
  3799. {
  3800.     setTimeout("gBrowser.removeCurrentTab();", 10);
  3801. }
  3802.  
  3803. function BrowserDelayRemoveAllTabsBut()
  3804. {
  3805.     setTimeout("gBrowser.removeAllTabsBut(gBrowser.mContextTab);", 10 );
  3806. }
  3807.  
  3808. function BrowserDelayCloseAllTabsToLeft()
  3809. {
  3810.     setTimeout("gBrowser.closeAllTabsToLeft(gBrowser.mContextTab);", 10 );
  3811. }
  3812.  
  3813. function BrowserDelayCloseAllTabsToRight()
  3814. {
  3815.     setTimeout("gBrowser.closeAllTabsToRight(gBrowser.mContextTab);", 10 );
  3816. }
  3817.  
  3818. function BrowserDelayCloseAllBlankTabs()
  3819. {
  3820.     setTimeout("gBrowser.closeAllBlankTabs();", 10 );
  3821. }
  3822.  
  3823. function DelayCloseAllTabsFromSameSite()
  3824. {
  3825.     setTimeout("gBrowser.closeAllTabsFromSameSite(gBrowser.mContextTab);", 10 );
  3826. }
  3827.  
  3828. function DelayCloseAllTabsExceptFromSameSite()
  3829. {
  3830.     setTimeout("gBrowser.closeAllTabsExceptFromSameSite(gBrowser.mContextTab);", 10 );
  3831. }
  3832.  
  3833. //CCote HP bug #176338 (duplicate in tuva)
  3834. // Needed to delay remove tab to help
  3835. // other process to finish (ie hide the menupopup)
  3836. //Close tab in tabbrowser call this function
  3837. function closeTab(){
  3838.       setTimeout("gBrowser.removeTab(gBrowser.mContextTab);",125);
  3839. }
  3840.  
  3841. function BrowserCloseTabOrWindow()
  3842. {
  3843.     //browserDebug("\nJA~~~~~~~~~~~~~:BrowserCloseThisTabOrWindow: hpSomeDoc\n");
  3844.     if (gBrowser.localName == 'tabbrowser' && gBrowser.tabContainer.childNodes.length > 1)
  3845.     { // Just close up a tab.
  3846.         gBrowser.removeCurrentTab();
  3847.         return;
  3848.     }
  3849.  
  3850.     BrowserCloseWindow();
  3851. }
  3852.  
  3853. //JA
  3854. function BrowserGetTabsCount()
  3855. {
  3856.     return gBrowser.tabContainer.childNodes.length;
  3857. }
  3858.  
  3859. function BrowserCloseThisTabOrWindow(hpSomeDoc)
  3860. {
  3861.     //browserDebug("\nJA~~~~~~~~~~~~~:BrowserCloseThisTabOrWindow: hpSomeDoc ="+hpSomeDoc+"\n");
  3862.     if(!hpSomeDoc)
  3863.         return false;//err
  3864.     var cnTabs = gBrowser.tabContainer.childNodes;
  3865.     var numtabs = cnTabs.length;
  3866.     if (numtabs>1)
  3867.     {
  3868.         for (var i = 0; i < numtabs; ++i)
  3869.         {
  3870.             var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  3871.             if (doc == hpSomeDoc)
  3872.             {    //browserDebug("!!!!!~~~~~~~~~~~~~~Found in tab# "+i+"\n");
  3873.                 cnTabs[i].isClosing = true;
  3874.                 setTimeout(function(n){ gBrowser.removeTab(gBrowser.tabContainer.childNodes[n]); }, 0, i);
  3875.                 //gBrowser.removeTab(cnTabs[i]);crashes plugin!
  3876.                 return true;
  3877.             }
  3878.         }
  3879.     }
  3880.     else if(numtabs ==1 && hpSomeDoc == gBrowser.getBrowserForTab(cnTabs[0]).contentDocument)
  3881.     {
  3882.         //browserDebug("~~~~~~~~~~~~~~~~Found in the only tab!\n\n");
  3883.         setTimeout("BrowserCloseWindow()");
  3884.         return true;
  3885.     }
  3886.  
  3887.     //browserDebug("~~~~~~~~~~Couldn't find hpSomeDoc!\n\n");
  3888.     return false;
  3889. }
  3890. //end JA
  3891.  
  3892. function BrowserTryToCloseWindow()
  3893. {
  3894.     //give tryToClose a chance to veto if it is defined
  3895.     if (typeof(window.tryToClose) != "function" || window.tryToClose())
  3896.     BrowserCloseWindow();
  3897. }
  3898.  
  3899. function BrowserCloseWindow()
  3900. {
  3901.     // This code replicates stuff in Shutdown().  It is here because
  3902.     // window.screenX and window.screenY have real values.  We need
  3903.     // to fix this eventually but by replicating the code here, we
  3904.     // provide a means of saving position (it just requires that the
  3905.     // user close the window via File->Close (vs. close box).
  3906.  
  3907.     // Get the current window position/size.
  3908.     var x = window.screenX;
  3909.     var y = window.screenY;
  3910.     var h = window.outerHeight;
  3911.     var w = window.outerWidth;
  3912.  
  3913.     // Store these into the window attributes (for persistence).
  3914.     var win = document.getElementById( "main-window" );
  3915.     win.setAttribute( "x", x );
  3916.     win.setAttribute( "y", y );
  3917.     win.setAttribute( "height", h );
  3918.     win.setAttribute( "width", w );
  3919.  
  3920.     closeWindow(true);
  3921. }
  3922.  
  3923.  
  3924. function loadURI(uri, referrer, postData)
  3925. {
  3926.  
  3927.  browserDebug('************ loadURI('+uri+') *******************\n');
  3928.     var docshell = getWebNavigation();
  3929.     var hpDoc;
  3930.  
  3931.     if (docshell.browserEngine == 'Trident')
  3932.     hpDoc = getTridentDocument();
  3933.  
  3934.     try {
  3935.         //JA if we have Trident running, check if we have to switch to Gecko, otherwise
  3936.         //JA decision about engine is made in nsContenDLF.cpp!
  3937.         if (hpDoc)
  3938.         {
  3939.             var sc = sitecontrols.SCSVC;
  3940.             // this will put a http:// in front of the uri if needed
  3941.             if (!gURIFixup)
  3942.                 gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  3943.                                       .getService(Components.interfaces.nsIURIFixup);
  3944.  
  3945.             var urispec;
  3946.             if (!uri || (uri == ''))
  3947.                 urispec = 'about:blank';
  3948.             else {
  3949.                 try {
  3950.                     var fixupuri = gURIFixup.createFixupURI(uri, 0);
  3951.                     urispec = fixupuri.spec;
  3952.                 }
  3953.                 catch(ex) {
  3954.                     if(!("result" in ex) ||
  3955.                          ex.result != Components.results.NS_ERROR_MALFORMED_URI) {
  3956.                         throw ex;
  3957.                     }
  3958.  
  3959.                     docshell.DisplayLoadError(ex.result, fixupuri, uri);
  3960.                     return;
  3961.                 }
  3962.             }
  3963.  
  3964.             if ((urispec != 'about:blank') && (!sc.isControllableURI(urispec))) {
  3965.                 // Generally speaking, for non-controllable URIs we want to force
  3966.                 // the engine into Gecko...
  3967.                 docshell.browserEngine = 'Gecko';
  3968.             } else {
  3969.                 // At this point we know that the URI is either controllable or else
  3970.                 // is 'about:blank', so the engine to use will be dictated by
  3971.                 // Site Controls
  3972.                 var site;
  3973.                 if (uri == 'about:blank') {
  3974.                     // We will treat this as if it's a DEFAULT site
  3975.                     // This should be SiteControls:Default resource
  3976.                     site = sc.getResourceForURI('');
  3977.                 }
  3978.                 else
  3979.                     site = sc.getResourceForURI(uri);
  3980.  
  3981.                 docshell.browserEngine = sc.readSiteControlResource(site, "displayEngine");
  3982.  
  3983.             }
  3984.         }
  3985.     }
  3986.     catch(ex) {
  3987.         browserDebug ("Caught Exception: " + ex + "\n");
  3988.     }
  3989.  
  3990.     // Check current engine
  3991.     try {
  3992.         if (docshell.browserEngine == 'Trident' && hpDoc) {
  3993.             hpDoc.navigateToURL(uri,null);
  3994.         } else {
  3995.             if (postData === undefined)
  3996.                 postData = null;
  3997.             //var webnav = getWebNavigation();
  3998.             docshell.loadURI(uri, nsIWebNavigation.LOAD_FLAGS_NONE, referrer, postData, null);
  3999.             gBrowser.mCurrentTab.removeAttribute("engine");
  4000.             // MERC - SL - set focus to url bar for blank page loads (always gecko)
  4001.             if (uri == "about:blank") {
  4002.                var urlbar = document.getElementById("urlbar");
  4003.             urlbar.focus();
  4004.          }
  4005.  
  4006.         }
  4007.     } catch(e) {browserDebug ("Caught Exception: " + e + "\n");    }
  4008.     // browserDebug('************ END loadURI('+uri+') *******************\n');
  4009.  
  4010. }
  4011.  
  4012.  
  4013. // MERC (DP):
  4014. // uses openPref to determine whether to open URI in current tab or new tab.
  4015. // set focus according to 'browser.tabs.loadInBackground'
  4016. function loadURIWithOpenPref(uri, openPref, referrer, postData) {
  4017.     if (gPrefService.getCharPref(openPref) == 'overwrite') {
  4018.         loadURI(uri, referrer, postData);
  4019.     } else { // == 'new'
  4020.         var theTab = gBrowser.addTabAt(uri, undefined, referrer, null, postData);
  4021.         if (!gPrefService.getBoolPref("browser.tabs.loadInBackground"))
  4022.             gBrowser.selectedTab = theTab;
  4023.     }
  4024. }
  4025.  
  4026.  
  4027. /* trim leading and trailing whitespace from a string */
  4028. function trim(str)
  4029. {
  4030.    if (str) {
  4031.         str=str.replace(/^\s*/,"");
  4032.       str=str.replace(/\s*$/,"");
  4033.    }
  4034.     return str;
  4035. }
  4036.  
  4037.  
  4038. /**
  4039. * Given keywords in uri variable, simulate typing
  4040. * stuff into search-bar
  4041. **/
  4042. function BrowserSearchURL(uri, referrer, postData)
  4043. {
  4044.     browserDebug('BrowserSearchURL('+uri+')\n');
  4045.  
  4046.     // trim whitespace from either end of the uri
  4047.     var trimuri = trim(uri);
  4048.     if (trimuri)
  4049.         search.AddToHistory(trimuri);
  4050.  
  4051.     var searchURL = gPrefService.getCharPref('keyword.URL')
  4052.                     + encodeURIComponent(trimuri);
  4053.     loadURIWithOpenPref(searchURL,
  4054.                         "browser.tabs.searchbarresult.open",
  4055.                         referrer, postData);
  4056.     /* JMC - Don't put search stuff into sidebar
  4057.     var searchSvc =
  4058.         Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  4059.                   .getService(Components.interfaces.nsIInternetSearchService);
  4060.     searchSvc.FindInternetSearchResults(searchURL);
  4061.     */
  4062. }
  4063.  
  4064.  
  4065. // MERC (DP):
  4066. // added the param bOpenWithPref. this determines whether to open the URL
  4067. // in current OR new tab
  4068. function BrowserLoadURL(aTriggeringEvent, aPostData, aOpenWithPref)
  4069. {
  4070.     // MERC - Stevo: Tell balloon help that we are not loading from the url bar
  4071.     urlLoadFromBar = true;
  4072.  
  4073.     if (!gURLBar)
  4074.         gURLBar = document.getElementById("urlbar");
  4075.     var url = gURLBar.value;
  4076.  
  4077.     browserDebug('BrowserLoadURL(): '+url+'\n');
  4078.     // MERC (DP): save the current URL
  4079.     var currURL = getWebNavigation().currentURI.spec;
  4080.  
  4081.     if (url.match(/^view-source:/)) {
  4082.         BrowserViewSourceOfURL(url.replace(/^view-source:/, ""), null, null);
  4083.     } else if (url.match(/^search:/)) {
  4084.         BrowserSearchURL(url.replace(/^search:/, ""), null, aPostData);
  4085.     } else {
  4086.         if (gBrowser.localName == "tabbrowser" &&
  4087.             aTriggeringEvent && 'altKey' in aTriggeringEvent &&
  4088.             aTriggeringEvent.altKey)
  4089.         {
  4090.             _content.focus();
  4091.             // JMC - only happens on an altKey load
  4092.  
  4093.             // MERC (DP): add tab and focus according to prefs
  4094.             var t = gBrowser.addTabAt(url, undefined, null, null, aPostData); // open link in new tab
  4095.             if (!gPrefService.getBoolPref("browser.tabs.loadInBackground")) {
  4096.                 gBrowser.selectedTab = t;
  4097.                 gURLBar.value = url;
  4098.             } else {
  4099.                 gURLBar.value = currURL;
  4100.             }
  4101.             //browserDebug('gURLbar.value = '+gURLBar.value+'\n\n');
  4102.             // END MERC
  4103.             event.preventDefault();
  4104.             event.preventBubble();
  4105.             event.preventCapture();
  4106.             event.stopPropagation();
  4107.         } else {
  4108.             // if no pref passed in, load in current tab.
  4109.             // otherwise open url according to pref
  4110.             if (aOpenWithPref) {
  4111.                 loadURIWithOpenPref(url, aOpenWithPref, null, aPostData);
  4112.             } else {
  4113.                 loadURI(url, null, aPostData);
  4114.             }
  4115.         }
  4116.         browserDebug ("BrowserLoadURL: Currently focused element is : " + document.commandDispatcher.focusedElement.getAttribute('anonid') + ", at least that's what commandDispatcher thinks.\n");
  4117.  
  4118.         if (document.commandDispatcher.focusedElement.getAttribute('anonid') != 'input')
  4119.         {
  4120.             _content.focus();
  4121.             browserDebug ("Now the _content is focused, which is : " + _content + "\n");
  4122.         } else {
  4123.             gBrowser.userTypedValue = null;
  4124.             gBrowser.userTypedClear = true;
  4125.             SetPageProxyState("valid", null); // XXX Build a URI and pass it in here.
  4126.         } // JMC - Note that this hack doesn't work in trident navigation
  4127.         // JMC - Is this URLBar defocusing?
  4128.  
  4129.     }
  4130.     UpdateStatusBarEngineIcon();
  4131. }
  4132.  
  4133. function SearchLoadURL(aURL, aTriggeringEvent, reuseTab, suppressSearchService )
  4134. {
  4135. //    browserDebug ("SearchLoadURL : " + aURL + "\t");
  4136. //    showStack();
  4137.  
  4138.     // We need to add a flag to reuse the same tab for browsing.
  4139.     // First search through the tabs to see if we have a "search" tab
  4140.     var cnTabs = gBrowser.tabContainer.childNodes;
  4141.     var numtabs = cnTabs.length;
  4142.     var tabBrowser = getBrowser();
  4143.     // MERC (rpaul) only reuse a tab if called from showMoreResults()
  4144.     if (numtabs>=1 && reuseTab)
  4145.     {
  4146.         for (var i = 0; i < numtabs; ++i)
  4147.         {
  4148.             var searchAttrib = cnTabs[i].getAttribute("searchtab");
  4149.             if (searchAttrib) {
  4150.                 // This tab is usable as a search tab
  4151.                 gBrowser.selectedTab = cnTabs[i];
  4152.                 loadURI(aURL,null,null);
  4153.                 return;
  4154.             } else {
  4155.                 cnTabs[i].removeAttribute("searchtab");
  4156.             }
  4157.         }
  4158.  
  4159.         loadURIWithOpenPref(aURL, "browser.tabs.searchbarresult.open", null, null);
  4160.         gBrowser.selectedTab.setAttribute("searchtab", "true");
  4161.     } else {
  4162.         // clear any existing searchtab attributes from tabs
  4163.         for (var j = 0; j < numtabs; ++j) {
  4164.             if (cnTabs[j].getAttribute("searchtab")) {
  4165.                 cnTabs[j].removeAttribute("searchtab");
  4166.             }
  4167.         }
  4168.         // Load according to preferences since we are not reusing a search tab
  4169.         loadURIWithOpenPref(aURL, "browser.tabs.searchbarresult.open", null, null);
  4170.         var curTab = gBrowser.selectedTab;
  4171.         if (curTab) {
  4172.             curTab.setAttribute("searchtab","true");
  4173.         }
  4174.     }
  4175.  
  4176.     _content.focus();
  4177.  
  4178. /*    JMC - no more search in sidebar
  4179.         if (suppressSearchService) return;
  4180.  
  4181.         var internetSearch =
  4182.         Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  4183.                       .getService(nsIInternetSearchService);
  4184.         internetSearch.FindInternetSearchResults(aURL);
  4185.         */
  4186.  
  4187. }
  4188.  
  4189.  
  4190. function getShortcutOrURI(aURL, aPostDataRef)
  4191. {
  4192.     // rjc: added support for URL shortcuts (3/30/1999)
  4193.     try {
  4194.         var shortcutURL = BMSVC.resolveKeyword(aURL, aPostDataRef);
  4195.         if (!shortcutURL) {
  4196.             // rjc: add support for string substitution with shortcuts (4/4/2000)
  4197.             //      (see bug # 29871 for details)
  4198.             var aOffset = aURL.indexOf(" ");
  4199.             if (aOffset > 0) {
  4200.                 var cmd = aURL.substr(0, aOffset);
  4201.                 var text = aURL.substr(aOffset+1);
  4202.                 shortcutURL = BMSVC.resolveKeyword(cmd, aPostDataRef);
  4203.                 if (shortcutURL && text) {
  4204.                     if (aPostDataRef && aPostDataRef.value) {
  4205.                         // XXXben - currently we only support "application/x-www-form-urlencoded"
  4206.                         //          enctypes.
  4207.                         aPostDataRef.value = unescape(aPostDataRef.value);
  4208.                         if (aPostDataRef.value.match(/%s/)) {
  4209.                             aPostDataRef.value = getPostDataStream(aPostDataRef.value, text,
  4210.                                                                    "application/x-www-form-urlencoded");
  4211.                         } else {
  4212.                             shortcutURL = null;
  4213.                             aPostDataRef.value = null;
  4214.                         }
  4215.                     }
  4216.                 else
  4217.                     shortcutURL = shortcutURL.match(/%s/) ? shortcutURL.replace(/%s/g, encodeURIComponent(text)) : null;
  4218.                 }
  4219.             }
  4220.         }
  4221.  
  4222.         if (shortcutURL)
  4223.             aURL = shortcutURL;
  4224.  
  4225.     } catch (ex) { }
  4226.     return aURL;
  4227. }
  4228.  
  4229.  
  4230. function getPostDataStream(aStringData, aKeyword, aType)
  4231. {
  4232.     var dataStream = Components.classes["@mozilla.org/io/string-input-stream;1"]
  4233.                                .createInstance(Components.interfaces.nsIStringInputStream);
  4234.     aStringData = aStringData.replace(/%s/g, encodeURIComponent(aKeyword));
  4235.     dataStream.setData(aStringData, aStringData.length);
  4236.  
  4237.     var mimeStream = Components.classes["@mozilla.org/network/mime-input-stream;1"]
  4238.                                .createInstance(Components.interfaces.nsIMIMEInputStream);
  4239.     mimeStream.addHeader("Content-Type", aType);
  4240.     mimeStream.addContentLength = true;
  4241.     mimeStream.setData(dataStream);
  4242.     return mimeStream.QueryInterface(Components.interfaces.nsIInputStream);
  4243. }
  4244.  
  4245.  
  4246. function readFromClipboard()
  4247. {
  4248.     var url;
  4249.  
  4250.     try {
  4251.         // Get clipboard.
  4252.         var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"]
  4253.         .getService(Components.interfaces.nsIClipboard);
  4254.  
  4255.         // Create tranferable that will transfer the text.
  4256.         var trans = Components.classes["@mozilla.org/widget/transferable;1"]
  4257.         .createInstance(Components.interfaces.nsITransferable);
  4258.  
  4259.         trans.addDataFlavor("text/unicode");
  4260.  
  4261.         // If available, use selection clipboard, otherwise global one
  4262.         if (clipboard.supportsSelectionClipboard())
  4263.             clipboard.getData(trans, clipboard.kSelectionClipboard);
  4264.         else
  4265.             clipboard.getData(trans, clipboard.kGlobalClipboard);
  4266.  
  4267.         var data = {};
  4268.         var dataLen = {};
  4269.         trans.getTransferData("text/unicode", data, dataLen);
  4270.  
  4271.         if (data) {
  4272.             data = data.value.QueryInterface(Components.interfaces.nsISupportsString);
  4273.             url = data.data.substring(0, dataLen.value / 2);
  4274.         }
  4275.     } catch (ex) {
  4276.     }
  4277.  
  4278.     return url;
  4279. }
  4280.  
  4281. function BrowserViewSourceOfDocument(aDocument)
  4282. {
  4283.     var docCharset;
  4284.     var pageCookie;
  4285.     var webNav;
  4286.  
  4287.     // Get the document charset
  4288.     docCharset = "charset=" + aDocument.characterSet;
  4289.  
  4290.     // Get the nsIWebNavigation associated with the document
  4291.     try {
  4292.         var win;
  4293.         var ifRequestor;
  4294.  
  4295.         // Get the DOMWindow for the requested document.  If the DOMWindow
  4296.         // cannot be found, then just use the _content window...
  4297.         //
  4298.         // XXX:  This is a bit of a hack...
  4299.         win = aDocument.defaultView;
  4300.         if (win == window) {
  4301.             win = _content;
  4302.         }
  4303.         ifRequestor = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
  4304.  
  4305.         webNav = ifRequestor.getInterface(nsIWebNavigation);
  4306.     } catch(err) {
  4307.         // If nsIWebNavigation cannot be found, just get the one for the whole
  4308.         // window...
  4309.         webNav = getWebNavigation();
  4310.     }
  4311.     //
  4312.     // Get the 'PageDescriptor' for the current document. This allows the
  4313.     // view-source to access the cached copy of the content rather than
  4314.     // refetching it from the network...
  4315.     //
  4316.     try {
  4317.         var PageLoader = webNav.QueryInterface(Components.interfaces.nsIWebPageDescriptor);
  4318.         pageCookie = PageLoader.currentDescriptor;
  4319.     } catch(err) {
  4320.         // If no page descriptor is available, just use the view-source URL...
  4321.     }
  4322.  
  4323.     BrowserViewSourceOfURL(webNav.currentURI.spec, docCharset, pageCookie);
  4324. }
  4325.  
  4326. function BrowserViewSourceOfURL(url, charset, pageCookie)
  4327. {
  4328.     var hpDoc = getTridentDocument();
  4329.     if (hpDoc) {
  4330.         hpDoc.viewSource(url);
  4331.     } else {
  4332.       // try to open a view-source window while inheriting the charset (if any)
  4333.       openDialog("chrome://global/content/viewSource.xul",
  4334.                  "_blank",
  4335.                "scrollbars,resizable,chrome,dialog=no",
  4336.                  url, charset, pageCookie);
  4337.   }
  4338. }
  4339.  
  4340. // doc=null for regular page info, doc=owner document for frame info.
  4341. function BrowserPageInfo(doc)
  4342. {
  4343.     var hpDoc = getTridentDocument();
  4344.     if (hpDoc) {
  4345.         hpDoc.showPageInfo();
  4346.     } else {
  4347.         window.openDialog("chrome://browser/content/pageInfo.xul",
  4348.         "_blank",
  4349.         "chrome,dialog=no",
  4350.         doc);
  4351.     }
  4352. }
  4353.  
  4354.  
  4355. function checkForDirectoryListing()
  4356. {
  4357.     if ( "HTTPIndex" in _content &&
  4358.     _content.HTTPIndex instanceof Components.interfaces.nsIHTTPIndex ) {
  4359.         _content.defaultCharacterset = getMarkupDocumentViewer().defaultCharacterSet;
  4360.     }
  4361. }
  4362.  
  4363. function TextIsURI(selectedText)
  4364. {
  4365.     return selectedText && /^http:\/\/|^https:\/\/|^file:\/\/|\
  4366.     ^ftp:\/\/|^about:|^mailto:|^news:|^snews:|^telnet:|^ldap:|\
  4367.     ^ldaps:|^gopher:|^finger:|^javascript:/i.test(selectedText);
  4368. }
  4369.  
  4370. function shouldPrependSearch(url)
  4371. {
  4372.     // if search: is already at the beginning, don't add it again
  4373.     if (/^search:/.test(url)) {
  4374.         return false;
  4375.     }
  4376.  
  4377.     // trim leading/trailing whitespace
  4378.     trimmedURL = url.replace(/^\s*/, '').replace(/\s*$/, '');
  4379.  
  4380.     // if string is empty do not prepend
  4381.     if (!trimmedURL) return false;
  4382.  
  4383.     // if string has protocol, do not prepend
  4384.     if( /^http:\/\/|^https:\/\/|^file:\/\/|\
  4385.     ^ftp:\/\/|^about:|^mailto:|^news:|^snews:|^telnet:|^ldap:|\
  4386.     ^ldaps:|^gopher:|^finger:|^javascript:/i.test(trimmedURL) )
  4387.     {
  4388.         return false;
  4389.     }
  4390.  
  4391.     // if the string looks like a path to a local file, do not prepend
  4392.     if (/^[a-z]:\\/.test(trimmedURL)) {
  4393.         return false;
  4394.     }
  4395.  
  4396.     // if whitespace occurs in the url, treat it as a search
  4397.     if (/\s+/.test(trimmedURL)) {
  4398.         return true;
  4399.     }
  4400.  
  4401.     // if any dots occur in the url, DO NOT treat as search
  4402.     if (/\./.test(url)) {
  4403.         return false;
  4404.     }
  4405.  
  4406.     return false;
  4407. }
  4408.  
  4409. function canonizeUrl(aTriggeringEvent, aPostDataRef)
  4410. {
  4411.     if (!gURLBar || gURLBar.value == '')
  4412.         return;
  4413.  
  4414.     var url = gURLBar.value;
  4415.  
  4416.     if (shouldPrependSearch(url)) {
  4417.         url = 'search:'+url;
  4418.     }
  4419.     // Prevent suffix when already exists www , http , /
  4420.     else if (!/^(www|http)|\/\s*$/i.test(url)) {
  4421.         var suffix = null;
  4422.  
  4423.         if (aTriggeringEvent && 'ctrlKey' in aTriggeringEvent &&
  4424.             aTriggeringEvent.ctrlKey && 'shiftKey' in aTriggeringEvent &&
  4425.             aTriggeringEvent.shiftKey)
  4426.         {
  4427.             suffix = ".org/";
  4428.         }
  4429.         else if (aTriggeringEvent && 'ctrlKey' in aTriggeringEvent &&
  4430.                  aTriggeringEvent.ctrlKey)
  4431.         {
  4432.             suffix = ".com/";
  4433.         }
  4434.         else if (aTriggeringEvent && 'shiftKey' in aTriggeringEvent &&
  4435.                  aTriggeringEvent.shiftKey)
  4436.         {
  4437.             suffix = ".net/";
  4438.         }
  4439.  
  4440.         if (suffix != null) {
  4441.             // trim leading/trailing spaces (bug 233205)
  4442.             url = url.replace(/^\s+/, "");
  4443.             url = url.replace(/\s+$/, "");
  4444.             // Tack www. and suffix on.
  4445.             url = "http://www." + url + suffix;
  4446.         }
  4447.     }
  4448.     gURLBar.value = getShortcutOrURI(url, aPostDataRef);
  4449. }
  4450.  
  4451. function UpdatePageProxyState()
  4452. {
  4453.     if (gURLBar && gURLBar.value != gLastValidURLStr)
  4454.     SetPageProxyState("invalid", null);
  4455. }
  4456.  
  4457.  
  4458. // MERC - JCH: Called in nsHTMLPluginDocument.cpp to update favicons
  4459. //function UpdateFavIcons(windowDoc)
  4460. // MRR - This function signature will change when nsHTMLPluginDocument is rationalized.
  4461. //       Will become: function UpdateFavIcons(windowDoc, aHref)
  4462. function UpdateFavIcons( aHref, dummy1, dummy2, dummy3, windowDoc)
  4463. {
  4464.     if (windowDoc == null) return false;
  4465.  
  4466.     var tabIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  4467.     if (tabIndex < 0) return false;
  4468.  
  4469.     var aTab = gBrowser.tabContainer.childNodes[tabIndex];
  4470.     if (aTab == null) return false;
  4471.  
  4472.     var tabUri = gBrowser.getBrowserForTab(aTab).currentURI;
  4473.  
  4474. //    browserDebug( "))      WMWMWMWMWMW===> UpdateFavIcons(\""+tabUri.spec+"\")  from TRIDENT\n" );
  4475. //    browserDebug( "))      WMWMWMWMWMW===> UpdateFavIcons - Trident passed \""+aHref+"\"\n" );
  4476.  
  4477.     if (gBrowser.shouldLoadFavIcon(tabUri))
  4478.     {
  4479.         var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  4480.         var favIconURI = ios.newURI(aHref, null, tabUri);
  4481.         var favIconURIstr = "";
  4482.         if ( aHref == "" ) {
  4483.             favIconURIstr = gBrowser.buildFavIconString(tabUri);
  4484.             favIconURI.spec = favIconURIstr;
  4485.         } else {
  4486.             favIconURIstr = favIconURI.spec;
  4487.         }
  4488. //        browserDebug( "))      WMWMWMWMWMW===> UpdateFavIcons - Yay; Built \""+favIconURI.spec+"\"\n" );
  4489.  
  4490.         // This sets the icon on the tab.
  4491.         gBrowser.mCurrentBrowser.mFavIconURL = favIconURIstr;
  4492.         aTab.setAttribute('image', favIconURIstr);
  4493.  
  4494.         // This sets the icon on the listener, so switch tabs synchs the icon in URL bar.
  4495.         if (gBrowser.mTabbedMode)
  4496.             gBrowser.mTabListeners[tabIndex].mIcon = gBrowser.mCurrentBrowser.mFavIconURL;
  4497.         // This sets the icon on the URL bar.
  4498.         PageProxySetIcon(gBrowser.mCurrentBrowser.mFavIconURL);
  4499.     } else {
  4500.         //browserDebug( "---------- UpdateFavIcons: Clearing icon\n");
  4501.         aTab.removeAttribute("image");
  4502.         gBrowser.mCurrentBrowser.mFavIconURL = null;
  4503.         if (gBrowser.mTabListeners[tabIndex])
  4504.         {
  4505.             gBrowser.mTabListeners[tabIndex].mIcon = null;
  4506.             PageProxyClearIcon();
  4507.         }
  4508.     }
  4509.     return true;
  4510. }
  4511.  
  4512. function StartTabProgress(hpSomeDoc)
  4513. {
  4514.     //browserDebug("\nJA~~~~~~~~~~~~~:StartTabProgress(): hpSomeDoc ="+hpSomeDoc+"\n");
  4515.     if(!hpSomeDoc)
  4516.         return false;//err
  4517.  
  4518.     // loop through all the tabs and match which trident document this event has originated from
  4519.     var cnTabs = gBrowser.tabContainer.childNodes;
  4520.     var numtabs = cnTabs.length;
  4521.     var tabBrowser = getBrowser();
  4522.     if (numtabs>=1)
  4523.     {
  4524.         for (var i = 0; i < numtabs; ++i)
  4525.         {
  4526.             var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  4527.             if (doc && doc == hpSomeDoc)
  4528.             {
  4529.                 //browserDebug("!!!!!~~~~~~~~~~~~~~Found in tab# "+i+"\n");
  4530.                 cnTabs[i].setAttribute("busy", "true");
  4531.                 cnTabs[i].label = tabBrowser.mStringBundle.getString("tabs.loading");
  4532.                 cnTabs[i].removeAttribute("image");
  4533.                 cnTabs[i].mIcon = null;
  4534.                 cnTabs[i].setAttribute("engine", "Trident");
  4535.                 if (cnTabs[i].getAttribute("selected") == "true") {
  4536.                     // Start Progress Listener
  4537.             var webProgress = gBrowser.getBrowserForTab(cnTabs[i]).webProgress;
  4538.                     window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_START | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  4539.                 //MERC - TO
  4540.                 // BLT 120067
  4541.                 // passing null for aRequest into onStateChange will not notify StartDocumentLoad
  4542.                 var observerService = Components.classes["@mozilla.org/observer-service;1"]
  4543.                                                 .getService(Components.interfaces.nsIObserverService);
  4544.                 try {
  4545.                   observerService.notifyObservers(_content, "StartDocumentLoad", hpSomeDoc.documentURI);
  4546.                 } catch (e) {
  4547.                 }
  4548.                     UpdateStatusBarEngineIcon();
  4549.                 }
  4550.                 return true;
  4551.             }
  4552.         }
  4553.     }
  4554.     //browserDebug("~~~~~~~~~~Couldn't find hpSomeDoc!\n\n");
  4555.     return false;
  4556. }
  4557.  
  4558. function EndTabProgress(hpSomeDoc) {
  4559.  
  4560.     // loop through all the tabs and match which trident document this event has originated from
  4561.     if(!hpSomeDoc)
  4562.         return false;//err
  4563.     var cnTabs = gBrowser.tabContainer.childNodes;
  4564.     var numtabs = cnTabs.length;
  4565.     var tabBrowser = getBrowser();
  4566.     if (numtabs>=1)
  4567.     {
  4568.         for (var i = 0; i < numtabs; ++i)
  4569.         {
  4570.             var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  4571.             if (doc && doc == hpSomeDoc)
  4572.             {
  4573.                 //browserDebug("!!!!!~~~~~~~~~~~~~~Found in tab# "+i+"\n");
  4574.                 cnTabs[i].removeAttribute("busy")
  4575.                 tabBrowser.setTabTitle(cnTabs[i]);
  4576.  
  4577.                 if (cnTabs[i].getAttribute("selected") == "true") {
  4578.                     // Stop Progress Listener
  4579.             var webProgress = gBrowser.getBrowserForTab(cnTabs[i]).webProgress;
  4580.                     window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_STOP | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  4581.                 //MERC - TO
  4582.                 // BLT 120067
  4583.                 // passing null for aRequest into onStateChange will not notify EndDocumentLoad
  4584.                 var observerService = Components.classes["@mozilla.org/observer-service;1"]
  4585.                                                 .getService(Components.interfaces.nsIObserverService);
  4586.                 try {
  4587.                   observerService.notifyObservers(_content, "EndDocumentLoad", hpSomeDoc.documentURI);
  4588.                 } catch (e) {
  4589.                 }
  4590.                 }
  4591.                 return true;
  4592.             }
  4593.         }
  4594.     }
  4595.     //browserDebug("~~~~~~~~~~Couldn't find hpSomeDoc!\n\n");
  4596.     return false;
  4597. }
  4598.  
  4599.  
  4600. function SetPageProxyState(aState, aURI)
  4601. {
  4602.     if (!gURLBar)
  4603.         return;
  4604.  
  4605.     if (!gProxyButton)
  4606.         gProxyButton = document.getElementById("page-proxy-button");
  4607.     if (!gProxyFavIcon)
  4608.         gProxyFavIcon = document.getElementById("page-proxy-favicon");
  4609.     if (!gProxyDeck)
  4610.         gProxyDeck = document.getElementById("page-proxy-deck");
  4611.  
  4612.     gProxyButton.setAttribute("pageproxystate", aState);
  4613.  
  4614. //    if ( aURI )
  4615. //        browserDebug( "))      WMWMWMWMWMW===> SetPageProxyState(\""+aURI.spec+"\") - gProxyFavIcon is: \""+gProxyFavIcon.getAttribute("src")+"\"\n" );
  4616. //    else
  4617. //        browserDebug( "))      WMWMWMWMWMW===> SetPageProxyState(null) - gProxyFavIcon is: \""+gProxyFavIcon.getAttribute("src")+"\"\n" );
  4618.  
  4619.     // the page proxy state is set to valid via OnLocationChange, which
  4620.     // gets called when we switch tabs.  We'll let updatePageFavIcon
  4621.     // take care of updating the mFavIconURL because it knows exactly
  4622.     // for which tab to update things, instead of confusing the issue
  4623.     // here.
  4624.     if (aState == "valid") {
  4625.         gLastValidURLStr = gURLBar.value;
  4626.         gURLBar.addEventListener("input", UpdatePageProxyState, false);
  4627.  
  4628.         if (gBrowser.mCurrentBrowser.mFavIconURL != null) {
  4629.             if (gBrowser.isFavIconKnownMissing(gBrowser.mCurrentBrowser.mFavIconURL)) {
  4630.                 gBrowser.mFavIconURL = null;
  4631. //                browserDebug( "))      WMWMWMWMWMW===> SetPageProxyState() - clearing icon (#1)\n" );
  4632.                 PageProxyClearIcon();
  4633.             } else {
  4634.                 PageProxySetIcon(gBrowser.mCurrentBrowser.mFavIconURL);
  4635.             }
  4636.         } else {
  4637. //            browserDebug( "))      WMWMWMWMWMW===> SetPageProxyState() - clearing icon (#2)\n" );
  4638.             PageProxyClearIcon();
  4639.         }
  4640.     } else if (aState == "invalid") {
  4641.         gURLBar.removeEventListener("input", UpdatePageProxyState, false);
  4642.         PageProxyClearIcon();
  4643.     }
  4644. }
  4645.  
  4646. function PageProxySetIcon (aURL)
  4647. {
  4648.     if (!gProxyFavIcon)
  4649.         return;
  4650.     if (gProxyFavIcon.getAttribute("src") != aURL)
  4651.         gProxyFavIcon.setAttribute("src", aURL);
  4652.  
  4653.     if (gProxyDeck && gProxyDeck.selectedIndex != 1 && gProxyFavIcon.getAttribute("src"))
  4654.         gProxyDeck.selectedIndex = 1;
  4655.     else if (gProxyDeck && gProxyDeck.selectedIndex != 0 && !gProxyFavIcon.getAttribute("src"))
  4656.         gProxyDeck.selectedIndex = 0;
  4657.  
  4658. //    browserDebug( "))      WMWMWMWMWMW===> PageProxySetIcon(\""+aURL+"\"); index="+gProxyDeck.selectedIndex+"\n" );
  4659. }
  4660.  
  4661. function PageProxyClearIcon ()
  4662. {
  4663. //    browserDebug( "))      WMWMWMWMWMW===> PageProxyClearIcon()\n" );
  4664.     if (gProxyDeck && gProxyDeck.selectedIndex != 0)
  4665.         gProxyDeck.selectedIndex = 0;
  4666.     if (gProxyFavIcon && gProxyFavIcon.hasAttribute("src"))
  4667.         gProxyFavIcon.removeAttribute("src");
  4668. }
  4669.  
  4670. function PageProxyDragGesture(aEvent)
  4671. {
  4672.     if (gProxyButton.getAttribute("pageproxystate") == "valid") {
  4673.         nsDragAndDrop.startDrag(aEvent, proxyIconDNDObserver);
  4674.         return true;
  4675.     }
  4676.     return false;
  4677. }
  4678.  
  4679.  
  4680. function URLBarOnDrop(evt)
  4681. {
  4682.     nsDragAndDrop.drop(evt, urlbarObserver);
  4683. }
  4684.  
  4685. var urlbarObserver = {
  4686.     onDrop: function (aEvent, aXferData, aDragSession)
  4687.     {
  4688.         var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  4689.  
  4690.         // The URL bar automatically handles inputs with newline characters,
  4691.         // so we can get away with treating text/x-moz-url flavours as text/unicode.
  4692.         if (url) {
  4693.             getBrowser().dragDropSecurityCheck(aEvent, aDragSession, url);
  4694.  
  4695.             // XXXBlake Workaround caret crash when you try to set the textbox's value on dropping
  4696.             setTimeout(function(u) { gURLBar.value = u; handleURLBarCommand(); }, 0, url);
  4697.         }
  4698.     },
  4699.     getSupportedFlavours: function ()
  4700.     {
  4701.         var flavourSet = new FlavourSet();
  4702.  
  4703.         // Plain text drops are often misidentified as "text/x-moz-url", so favor plain text.
  4704.         flavourSet.appendFlavour("text/unicode");
  4705.         flavourSet.appendFlavour("text/x-moz-url");
  4706.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4707.         return flavourSet;
  4708.     }
  4709. }
  4710.  
  4711. function SearchBarOnDrop(evt)
  4712. {
  4713.     nsDragAndDrop.drop(evt, searchbarObserver);
  4714. }
  4715.  
  4716. var searchbarObserver = {
  4717.     onDrop: function (aEvent, aXferData, aDragSession)
  4718.     {
  4719.         var data = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  4720.         if (data) {
  4721.             // XXXBlake Workaround caret crash when you try to set the textbox's value on dropping
  4722.             var field = document.getElementById("search-bar");
  4723.             setTimeout(function(field, data, evt) { field.value = data; field.onTextEntered(evt); }, 0, field, data, aEvent);
  4724.         }
  4725.     },
  4726.     getSupportedFlavours: function ()
  4727.     {
  4728.         var flavourSet = new FlavourSet();
  4729.  
  4730.         flavourSet.appendFlavour("text/unicode");
  4731.         flavourSet.appendFlavour("text/x-moz-url");
  4732.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4733.         return flavourSet;
  4734.     }
  4735. }
  4736.  
  4737. function SearchBarPopupShowing(aEvent)
  4738. {
  4739. }
  4740.  
  4741. function SearchBarPopupCommand(aEvent)
  4742. {
  4743.  
  4744.     if (!aEvent.target.id)
  4745.         return;
  4746.  
  4747.     if (aEvent.target.id == "miAddEngines") {
  4748.         var regionBundle = document.getElementById("bundle_browser_region");
  4749.         loadURI(regionBundle.getString("searchEnginesURL"), null, null);
  4750.         return;
  4751.     }
  4752.  
  4753.     document.getElementById("search-bar").currentEngine = aEvent.target.id;
  4754. }
  4755.  
  4756. function showSearchEnginePopup()
  4757. {
  4758.     var searchEnginePopup = document.getElementById("SearchBarPopup");
  4759.     var searchEngineButton = document.getElementById("search-proxy-button");
  4760.     searchEnginePopup.showPopup(searchEngineButton);
  4761. }
  4762.  
  4763. function updateToolbarStates(toolbarMenuElt)
  4764. {
  4765.     if (!gHaveUpdatedToolbarState) {
  4766.         var mainWindow = document.getElementById("main-window");
  4767.         if (mainWindow.hasAttribute("chromehidden")) {
  4768.             gHaveUpdatedToolbarState = true;
  4769.             var i;
  4770.             for (i = 0; i < toolbarMenuElt.childNodes.length; ++i)
  4771.             document.getElementById(toolbarMenuElt.childNodes[i].getAttribute("observes")).removeAttribute("checked");
  4772.             var toolbars = document.getElementsByTagName("toolbar");
  4773.  
  4774.             // Start i at 1, since we skip the menubar.
  4775.             for (i = 1; i < toolbars.length; ++i) {
  4776.                 if (toolbars[i].getAttribute("class").indexOf("chromeclass") != -1)
  4777.                 toolbars[i].setAttribute("collapsed", "true");
  4778.             }
  4779.  
  4780.             toolbars = document.getElementsByTagName("multibar");
  4781.             for (i = 0; i < toolbars.length; ++i) {
  4782.                 if (toolbars[i].getAttribute("class").indexOf("chromeclass") != -1)
  4783.                 toolbars[i].setAttribute("collapsed", "true");
  4784.             }
  4785.  
  4786.             var statusbars = document.getElementsByTagName("statusbar");
  4787.             for (i = 1; i < statusbars.length; ++i) {
  4788.                 if (statusbars[i].getAttribute("class").indexOf("chromeclass") != -1)
  4789.                 statusbars[i].setAttribute("collapsed", "true");
  4790.             }
  4791.  
  4792.             var toolbox = document.getElementById("navigator-toolbox");
  4793.             toolbox.reorderToolbars();
  4794.  
  4795.             mainWindow.removeAttribute("chromehidden");
  4796.         }
  4797.     }
  4798. }
  4799.  
  4800. function BrowserImport()
  4801. {
  4802.         var features = "modal,centerscreen,chrome,resizable=no";
  4803.         window.openDialog("chrome://browser/content/migration/migration.xul", "migration", features);
  4804.     }
  4805.  
  4806.     function BrowserFullScreen()
  4807.     {
  4808.         window.fullScreen = !window.fullScreen;
  4809.     }
  4810.  
  4811.     function BrowserToggleMaximize()
  4812.     {
  4813.         if (window.windowState == window.STATE_MAXIMIZED) {
  4814.             window.restore();
  4815.             document.getElementById('main-window').setAttribute('sizemode', 'normal');
  4816.             document.getElementById('restoreButtonBroadcaster').tooltipText = 'Maximize';
  4817.             isButtonToggle = true;
  4818.         } else {
  4819.             window.maximize();
  4820.             document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  4821.             document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4822.             isButtonToggle = false;
  4823.         }
  4824.         reshuffleToolbars();
  4825.     }
  4826.     function onWindowResize()
  4827.     {
  4828.             if (window.windowState == window.STATE_MAXIMIZED)
  4829.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4830.             else if (window.windowState == window.STATE_NORMAL)
  4831.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Maximize';
  4832.             BookmarksToolbar.resizeFunc();
  4833.     }
  4834.     function onFullScreen()
  4835.     {
  4836.         if(isButtonToggle) {
  4837.             if (window.windowState == window.STATE_MAXIMIZED) {
  4838.                 document.getElementById('main-window').setAttribute('sizemode', 'normal');
  4839.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Maximize';
  4840.             } else {
  4841.                 document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  4842.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4843.             }
  4844.         }
  4845.         else {
  4846.             document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  4847.             document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4848.         }
  4849.  
  4850.         FullScreen.toggle();
  4851.     }
  4852.  
  4853.     function getWebNavigation()
  4854.     {
  4855.         try {
  4856.             return gBrowser.webNavigation;
  4857.         } catch (e) {
  4858.             return null;
  4859.         }
  4860.     }
  4861.  
  4862.     function BrowserReloadWithFlags(reloadFlags)
  4863.     {
  4864.         // MERC JVL
  4865.         // stop the browser first (within the context) before proceeding with the reload
  4866.         BrowserStop();
  4867.  
  4868.         //JA
  4869.         var hpDoc;
  4870.         var webNav = getWebNavigation();
  4871.         if(webNav.browserEngine=="Trident")
  4872.             hpDoc=getTridentDocument();
  4873.         if(hpDoc) {
  4874.         var webProgress = gBrowser.webProgress;
  4875.             window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_START | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  4876.             hpDoc.reloadDocument();//end JA
  4877.         }
  4878.         else //default
  4879.         {
  4880.             /* First, we'll try to use the session history object to reload so
  4881.             * that framesets are handled properly. If we're in a special
  4882.             * window (such as view-source) that has no session history, fall
  4883.             * back on using the web navigation's reload method.
  4884.             */
  4885.             // check site control to try to switch engine
  4886.             var needSwitchEngine=false;
  4887.             var bRedirected;
  4888.             try
  4889.             {
  4890.                 var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  4891.                                                                     .getService(Components.interfaces.nsIIOService);
  4892.                 var fixedURI;
  4893.                 if(webNav.currentURI.scheme == "wyciwyg")
  4894.                 {
  4895.                     if (!gURIFixup)
  4896.                         gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  4897.                                               .getService(Components.interfaces.nsIURIFixup);
  4898.                     fixedURI = gURIFixup.createExposableURI(webNav.currentURI);
  4899.                 }
  4900.                 else
  4901.                 {
  4902.                     fixedURI = ioService.newURI(webNav.currentURI.spec, null, null);
  4903.                 }
  4904.  
  4905.                 var site = fixedURI.host;
  4906.                 var bControlled=sitecontrols.SCSVC.isControlledSite(site);
  4907.                 var displayEngine;
  4908.                 if(bControlled)
  4909.                     displayEngine=sitecontrols.SCSVC.readSiteControl(site, "displayEngine");
  4910.                 else
  4911.                     displayEngine=sitecontrols.SCSVC.readSiteControl(sitecontrols.DEFAULT_SITE, "displayEngine");
  4912.                 if (displayEngine=="Trident")
  4913.                 {
  4914.                     needSwitchEngine=true;
  4915.                     webNav.browserEngine='Trident';
  4916.                 }
  4917.                 if (needSwitchEngine)
  4918.                 {
  4919.                     var filePath=fixedURI.path;
  4920.                     //SLiu, if it is a image url, and reload will cause switch engine from Gecko to Trident
  4921.                     //we let browser load a Trident blank page first then navigate to the image url
  4922.                     var len=filePath.length;
  4923.                     var isImgURL=false;
  4924.                     if (len > 4) //".jpg"
  4925.                     {
  4926.                         var fileType=filePath.substr(len-3, 3);
  4927.                         fileType.toLowerCase();
  4928.                         var imgExtList= new Array('gif','jpg','bmp','png');
  4929.                         var i;
  4930.                         for (i=0;i<imgExtList.length;i++)
  4931.                         {
  4932.                             if (fileType==imgExtList[i])
  4933.                             {
  4934.                                 isImgURL=true;
  4935.                                 break;
  4936.                             }
  4937.                         }
  4938.                     }
  4939.                     if(isImgURL)
  4940.                     {
  4941.                         bRedirected=true;
  4942.                         var urlStr = Components.classes["@mozilla.org/supports-string;1"]
  4943.                             .createInstance(Components.interfaces.nsISupportsString);
  4944.                         urlStr.data = webNav.currentURI.spec;
  4945.                         gPrefService.setComplexValue("browser.navigation.nexturl",
  4946.                             Components.interfaces.nsISupportsString,
  4947.                             urlStr);
  4948.                         var blankPage="about:blank";
  4949.                         webNav.loadURI(blankPage, nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
  4950.                     }
  4951.                 }
  4952.             }//end default
  4953.             catch(ex){ browserDebug ("Caught Exception: " + ex + "\n");}
  4954.  
  4955.             try
  4956.             {
  4957.                 if(!bRedirected)
  4958.                 {
  4959.                     // browserDebug ("webNav.reload(...)\n");
  4960.                     webNav.reload(reloadFlags);
  4961.                 }
  4962.             }
  4963.             catch(ex){ browserDebug ("Caught Exception: " + ex + "\n");}
  4964.         }
  4965.     }
  4966.  
  4967.     function toggleAffectedChrome(aHide)
  4968.     {
  4969.         // chrome to toggle includes:
  4970.         //   (*) menubar
  4971.         //   (*) navigation bar
  4972.         //   (*) bookmarks toolbar
  4973.         //   (*) sidebar
  4974.         //   (*) find bar
  4975.         //   (*) statusbar
  4976.  
  4977.         var menuBar = document.getElementById("menubar-items");
  4978.         if (menuBar) menuBar.hidden = aHide;
  4979.         var navToolbox = document.getElementById("navigator-toolbox");
  4980.         navToolbox.hidden = aHide;
  4981.         var statusbar = document.getElementById("status-bar");
  4982.         statusbar.hidden = aHide;
  4983.         var throbber = document.getElementById("throbber-box");
  4984.         if (throbber) {
  4985.             throbber.hidden = aHide;
  4986.         }
  4987.         if (aHide)
  4988.         {
  4989.             gChromeState = {};
  4990.             var sidebar = document.getElementById("sidebar-box");
  4991.             gChromeState.sidebarOpen = !sidebar.hidden;
  4992.             gSidebarCommand = sidebar.getAttribute("sidebarcommand");
  4993.  
  4994.             var findBar = document.getElementById("FindToolbar");
  4995.             gChromeState.findOpen = !findBar.hidden;
  4996.             closeFindBar();
  4997.         }
  4998.     else {
  4999.         if (gChromeState.findOpen)
  5000.             openFindBar();
  5001.     }
  5002.  
  5003.     if (gChromeState.sidebarOpen)
  5004.         toggleSidebar(gSidebarCommand);
  5005. }
  5006.  
  5007. function onEnterPrintPreview()
  5008. {
  5009.     toggleAffectedChrome(true);
  5010. }
  5011.  
  5012. function onExitPrintPreview()
  5013. {
  5014.     // restore chrome to original state
  5015.     toggleAffectedChrome(false);
  5016.     if (spui) spui.RedrawComponents();
  5017. }
  5018.  
  5019. function browserDoOLECmd(iCmd)
  5020. {
  5021.     //Mercurial start
  5022.     var hpDoc = getTridentDocument();
  5023.  
  5024.     try
  5025.     {
  5026.         switch(iCmd)
  5027.         {
  5028.         case 0://Page Setup
  5029.             if(hpDoc)
  5030.                 hpDoc.doOLECmd(0);
  5031.             else
  5032.                 PrintUtils.showPageSetup();
  5033.             break;
  5034.         case 1://Print Preview
  5035.             // browserDebug("Customize printpreview!\n");
  5036.             if (hpDoc)
  5037.             {
  5038.                 if (hpDoc.loadingState==nsIHTMLPluginDocument.LOADING)
  5039.                 {
  5040.                     ShowPrintErrorDialogForTrident(PRINT_PREVIEW_REQ_WHILE_TRIDENT_LOADING_ERROR);
  5041.                     //alert("Page loading not finished, please wait!");
  5042.                 }
  5043.                 else
  5044.                     hpDoc.doOLECmd(1);
  5045.             }
  5046.             else
  5047.                 PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview);
  5048.             break;
  5049.         case 2:
  5050.             if (hpDoc)
  5051.             {
  5052.                 if (hpDoc.loadingState==nsIHTMLPluginDocument.LOADING)
  5053.                 {
  5054.                     ShowPrintErrorDialogForTrident(PRINT_REQ_WHILE_TRIDENT_LOADING_ERROR);
  5055.                     //alert("Page loading not finished, please wait!");
  5056.                 }
  5057.                 else
  5058.                     hpDoc.doOLECmd(2);
  5059.             }
  5060.             else
  5061.                 PrintUtils.print();
  5062.             break;
  5063.         case 4:
  5064.             if (hpDoc) hpDoc.doOLECmd(4);
  5065.             else ZoomManager.prototype.getInstance().reduce();
  5066.             break;
  5067.         case 5:
  5068.             if (hpDoc) hpDoc.doOLECmd(5);
  5069.             else ZoomManager.prototype.getInstance().enlarge();
  5070.             break;
  5071.         case 6:
  5072.             if (hpDoc) hpDoc.doOLECmd(6);
  5073.             else ZoomManager.prototype.getInstance().reset();
  5074.             break;
  5075.         }
  5076.     }
  5077.     catch(e){ browserDebug ("Caught Exception: " + e + "\n");}
  5078. }
  5079.  
  5080.  
  5081. function getMarkupDocumentViewer()
  5082. {
  5083.     return gBrowser.markupDocumentViewer;
  5084. }
  5085.  
  5086. /**
  5087. * Content area tooltip.
  5088. * XXX - this must move into XBL binding/equiv! Do not want to pollute
  5089. *       browser.js with functionality that can be encapsulated into
  5090. *       browser widget. TEMPORARY!
  5091. *
  5092. * NOTE: Any changes to this routine need to be mirrored in ChromeListener::FindTitleText()
  5093. *       (located in mozilla/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp)
  5094. *       which performs the same function, but for embedded clients that
  5095. *       don't use a XUL/JS layer. It is important that the logic of
  5096. *       these two routines be kept more or less in sync.
  5097. *       (pinkerton)
  5098. **/
  5099. function FillInHTMLTooltip(tipElement)
  5100. {
  5101.     var retVal = false;
  5102.     if (tipElement.namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul")
  5103.     return retVal;
  5104.  
  5105.     const XLinkNS = "http://www.w3.org/1999/xlink";
  5106.  
  5107.     var titleText = null;
  5108.     var XLinkTitleText = null;
  5109.  
  5110.     while (!titleText && !XLinkTitleText && tipElement) {
  5111.         if (tipElement.nodeType == Node.ELEMENT_NODE) {
  5112.             titleText = tipElement.getAttribute("title");
  5113.             XLinkTitleText = tipElement.getAttributeNS(XLinkNS, "title");
  5114.         }
  5115.         tipElement = tipElement.parentNode;
  5116.     }
  5117.  
  5118.     var texts = [titleText, XLinkTitleText];
  5119.     var tipNode = document.getElementById("aHTMLTooltip");
  5120.  
  5121.     for (var i = 0; i < texts.length; ++i) {
  5122.         var t = texts[i];
  5123.         if (t && t.search(/\S/) >= 0) {
  5124.             tipNode.setAttribute("label", t);
  5125.             retVal = true;
  5126.         }
  5127.     }
  5128.  
  5129.     return retVal;
  5130. }
  5131.  
  5132. var proxyIconDNDObserver = {
  5133.     onDragStart: function (aEvent, aXferData, aDragAction)
  5134.     {
  5135.         var value = gURLBar.value;
  5136.         // XXX - do we want to allow the user to set a blank page to their homepage?
  5137.         //       if so then we want to modify this a little to set about:blank as
  5138.         //       the homepage in the event of an empty urlbar.
  5139.         if (!value) return;
  5140.  
  5141.         var contextBrowser = gBrowser.getBrowserForTab(gBrowser.mContextTab);
  5142.         var currentBrowser = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  5143.  
  5144.         //var urlString = value + "\n" + window._content.document.title;
  5145.         var urlString = contextBrowser.currentURI.spec;
  5146.         value = urlString;
  5147.  
  5148.         if (contextBrowser.isRSSPretty) {
  5149.             if (urlString.indexOf("feed:") != 0) urlString = "feed:"+urlString;
  5150.         } else {
  5151.         }
  5152.  
  5153.         var htmlString = "<a href=\"" + value + "\">" + value + "</a>";
  5154.  
  5155.         aXferData.data = new TransferData();
  5156.         aXferData.data.addDataForFlavour("text/x-moz-url", urlString);
  5157.         aXferData.data.addDataForFlavour("text/unicode", value);
  5158.         aXferData.data.addDataForFlavour("text/html", htmlString);
  5159.  
  5160.         // we're copying the URL from the proxy icon, not moving
  5161.         // we specify all of them though, because d&d sucks and OS's
  5162.         // get confused if they don't get the one they want
  5163.         aDragAction.action =
  5164.         Components.interfaces.nsIDragService.DRAGDROP_ACTION_COPY |
  5165.         Components.interfaces.nsIDragService.DRAGDROP_ACTION_MOVE |
  5166.         Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  5167.     }
  5168. }
  5169.  
  5170. var homeButtonObserver = {
  5171.     onDrop: function (aEvent, aXferData, aDragSession)
  5172.     {
  5173.         var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  5174.         setTimeout(openHomeDialog, 0, url);
  5175.     },
  5176.  
  5177.     onDragOver: function (aEvent, aFlavour, aDragSession)
  5178.     {
  5179.         var statusTextFld = document.getElementById("statusbar-display");
  5180.         statusTextFld.label = gNavigatorBundle.getString("droponhomebutton");
  5181.         aDragSession.dragAction = Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  5182.     },
  5183.  
  5184.     onDragExit: function (aEvent, aDragSession)
  5185.     {
  5186.         var statusTextFld = document.getElementById("statusbar-display");
  5187.         statusTextFld.label = "";
  5188.     },
  5189.  
  5190.     getSupportedFlavours: function ()
  5191.     {
  5192.         var flavourSet = new FlavourSet();
  5193.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  5194.         flavourSet.appendFlavour("text/x-moz-url");
  5195.         flavourSet.appendFlavour("text/unicode");
  5196.         return flavourSet;
  5197.     }
  5198. }
  5199.  
  5200. function openHomeDialog(aURL)
  5201. {
  5202.     var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  5203.     var promptTitle = gNavigatorBundle.getString("droponhometitle");
  5204.     var promptMsg   = gNavigatorBundle.getString("droponhomemsg");
  5205.     var pressedVal  = promptService.confirmEx(window, promptTitle, promptMsg,
  5206.         (promptService.BUTTON_TITLE_YES * promptService.BUTTON_POS_0) +
  5207.         (promptService.BUTTON_TITLE_NO * promptService.BUTTON_POS_1),
  5208.         null, null, null, null, {value:0});
  5209.  
  5210.     if (pressedVal == 0) {
  5211.         try {
  5212.             var str = Components.classes["@mozilla.org/supports-string;1"]
  5213.                                 .createInstance(Components.interfaces.nsISupportsString);
  5214.             str.data = aURL;
  5215.             gPrefService.setComplexValue("browser.startup.homepage",
  5216.                                          Components.interfaces.nsISupportsString, str);
  5217.             var homeButton = document.getElementById("home-button");
  5218.             //homeButton.setAttribute("tooltiptext", aURL); //replaced as this is reported as a bug..JC
  5219.         } catch (ex) {
  5220.             browserDebug("Failed to set the home page.\n"+ex+"\n");
  5221.         }
  5222.     }
  5223. }
  5224.  
  5225. var bookmarksButtonObserver = {
  5226.     onDrop: function (aEvent, aXferData, aDragSession)
  5227.     {
  5228.         var split = aXferData.data.split("\n");
  5229.         var url = split[0];
  5230.         if (url != aXferData.data) {  //do nothing if it's not a valid URL
  5231.             var name = split[1];
  5232.             openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "",
  5233.                        "centerscreen,chrome,dialog,resizable,dependent", name, url);
  5234.         }
  5235.     },
  5236.  
  5237.     onDragOver: function (aEvent, aFlavour, aDragSession)
  5238.     {
  5239.         var statusTextFld = document.getElementById("statusbar-display");
  5240.         statusTextFld.label = gNavigatorBundle.getString("droponbookmarksbutton");
  5241.         aDragSession.dragAction = Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  5242.     },
  5243.  
  5244.     onDragExit: function (aEvent, aDragSession)
  5245.     {
  5246.         var statusTextFld = document.getElementById("statusbar-display");
  5247.         statusTextFld.label = "";
  5248.     },
  5249.  
  5250.     getSupportedFlavours: function ()
  5251.     {
  5252.         var flavourSet = new FlavourSet();
  5253.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  5254.         flavourSet.appendFlavour("text/x-moz-url");
  5255.         flavourSet.appendFlavour("text/unicode");
  5256.         return flavourSet;
  5257.     }
  5258. }
  5259.  
  5260. var goButtonObserver = {
  5261.     onDragOver: function(aEvent, aFlavour, aDragSession)
  5262.     {
  5263.         var statusTextFld = document.getElementById("statusbar-display");
  5264.         statusTextFld.label = gNavigatorBundle.getString("dropongobutton");
  5265.         aEvent.target.setAttribute("dragover", "true");
  5266.         return true;
  5267.     },
  5268.     onDragExit: function (aEvent, aDragSession)
  5269.     {
  5270.         var statusTextFld = document.getElementById("statusbar-display");
  5271.         statusTextFld.label = "";
  5272.         aEvent.target.removeAttribute("dragover");
  5273.     },
  5274.     onDrop: function (aEvent, aXferData, aDragSession)
  5275.     {
  5276.         var xferData = aXferData.data.split("\n");
  5277.         var uri = xferData[0] ? xferData[0] : xferData[1];
  5278.         if (uri) {
  5279.             getBrowser().dragDropSecurityCheck(aEvent, aDragSession, uri);
  5280.             loadURI(uri, null, null);
  5281.         }
  5282.     },
  5283.     getSupportedFlavours: function ()
  5284.     {
  5285.         var flavourSet = new FlavourSet();
  5286.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  5287.         flavourSet.appendFlavour("text/x-moz-url");
  5288.         flavourSet.appendFlavour("text/unicode");
  5289.         return flavourSet;
  5290.     }
  5291. }
  5292.  
  5293. var DownloadsButtonDNDObserver = {
  5294.     /////////////////////////////////////////////////////////////////////////////
  5295.     // nsDragAndDrop
  5296.     onDragOver: function (aEvent, aFlavour, aDragSession)
  5297.     {
  5298.         var statusTextFld = document.getElementById("statusbar-display");
  5299.         statusTextFld.label = gNavigatorBundle.getString("dropondownloadsbutton");
  5300.         aDragSession.canDrop = (aFlavour.contentType == "text/x-moz-url" ||
  5301.         aFlavour.contentType == "text/unicode");
  5302.     },
  5303.  
  5304.     onDragExit: function (aEvent, aDragSession)
  5305.     {
  5306.         var statusTextFld = document.getElementById("statusbar-display");
  5307.         statusTextFld.label = "";
  5308.     },
  5309.  
  5310.     onDrop: function (aEvent, aXferData, aDragSession)
  5311.     {
  5312.         var split = aXferData.data.split("\n");
  5313.         var url = split[0];
  5314.         if (url != aXferData.data) {  //do nothing, not a valid URL
  5315.             getBrowser().dragDropSecurityCheck(aEvent, aDragSession, url);
  5316.  
  5317.             var name = split[1];
  5318.             saveURL(url, name, null, true, true);
  5319.         }
  5320.     },
  5321.     getSupportedFlavours: function ()
  5322.     {
  5323.         var flavourSet = new FlavourSet();
  5324.         flavourSet.appendFlavour("text/x-moz-url");
  5325.         flavourSet.appendFlavour("text/unicode");
  5326.         return flavourSet;
  5327.     }
  5328. }
  5329.  
  5330. function focusSearchBar()
  5331. {
  5332.     var searchBar = document.getElementsByTagName("searchbar");
  5333.     if (searchBar.length > 0) {
  5334.         searchBar[0].select();
  5335.         searchBar[0].focus();
  5336.     }
  5337. }
  5338.  
  5339.  
  5340. // MERC - JCH: Wrapper for OpenSearch, called from nsHTMLPluginDocument.cpp
  5341. function WrapperOpenSearch(searchStr)
  5342. {
  5343.     OpenSearch("internet", searchStr);
  5344. }
  5345.  
  5346.  
  5347. // MERC - JCH: Slightly modified version of onTextEntered() from search.xml
  5348. function OpenSearch(tabName, searchStr, newTabFlag)
  5349. {
  5350.     browserDebug("OpenSearch called. tabName : " + tabName + ", searchStr : " + searchStr + ", newTabFlag : " + newTabFlag);
  5351.  
  5352.     var searchURL = null;
  5353.     var PREF = Components.classes["@mozilla.org/preferences-service;1"]
  5354.                          .getService(Components.interfaces.nsIPrefService)
  5355.                          .getBranch(null);
  5356.  
  5357.     var ISEARCHSVC = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  5358.                                .getService(Components.interfaces.nsIInternetSearchService);
  5359.  
  5360.  
  5361.     // GET THE SEARCH ENGINE AS SET IN SIDEBAR SEARCH OR NAV BAR SEARCH DROPDOWN MENUS
  5362.     var broadcaster = document.getElementById('searchEngineBroadcaster');
  5363.     broadcaster.setAttribute("searchText", searchStr);
  5364.     var currentEngine = broadcaster.getAttribute("searchengine");
  5365.  
  5366.     // browserDebug("JMC: currentEngine is " + currentEngine + "\n");
  5367.     if (currentEngine.indexOf('DesktopSearch') > -1){
  5368.  
  5369.       try {
  5370.           if (!desktopSearch.isDesktopSearchAvailable()) {
  5371.             var sDesktopSearchDownloadURL = PREF.getCharPref('sidebar.desktopsearch.url');
  5372.             SearchLoadURL(sDesktopSearchDownloadURL, null, true);
  5373.             return;
  5374.             }
  5375.           }catch(e){
  5376.             browserDebug('Desktop search error - unable to determine if Copernic is installed.');
  5377.           }
  5378.  
  5379.         try {
  5380.                 //Clear previous search filters
  5381.                 desktopSearch.ClearFilters();
  5382.                 // Start the desktop search.
  5383.                 desktopSearch.ExecuteSearch(searchStr, displayDesktopSearchResults);
  5384.                 broadcaster.setAttribute("searchStatus", 'started');
  5385.       } catch (e){
  5386.                 //MERC: NAJ: An undetermined search error has occured
  5387.              browserDebug('Desktop search error.');
  5388.                 return;
  5389.             }
  5390.  
  5391.     } else {
  5392.  
  5393.         // JMC : If it's netscape, use the context menu link, not the default from the .src file
  5394.         if (currentEngine.indexOf('NetscapeSearch') > -1){
  5395.  
  5396.             searchURL = gPrefService.getCharPref('browser.contextSearch.URL') +(searchStr? encodeURIComponent(searchStr):"");
  5397.             // searchURL = gPrefService.getCharPref('browser.contextSearch.URL') + (searchStr? searchStr:"");
  5398.         } else {
  5399.             // NOW GET THE WHOLE SEARCH URI
  5400.             searchURL = ISEARCHSVC.GetInternetSearchURL(
  5401.                 currentEngine, searchStr? encodeURIComponent(searchStr):"",
  5402.                 0, 0, {value:0});
  5403.         }
  5404.  
  5405.  
  5406.         if (!searchURL) {
  5407.             // GO TO FALLBACK POSITION, WHICH IS NETSCAPE SEARCH PAGE
  5408.             // This gets chrome URL from browser\base\content\browser-sets.inc
  5409.             var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  5410.             searchURL = navigatorRegionBundle.getString("fallbackDefaultSearchURL");
  5411.         }
  5412.  
  5413.         SearchLoadURL(searchURL, null);
  5414.     }
  5415. }
  5416.  
  5417.  
  5418. function displayDesktopSearchResults(){
  5419.  
  5420.     var resultsDoc = desktopSearch.RetrieveResults();
  5421.     var searchURL;
  5422.     resultsCount =  desktopSearch.GetSearchInfo(resultsDoc, 'count');
  5423.  
  5424.     if (resultsCount> 0){
  5425.       searchURL = desktopSearch.CreateResultsPage(resultsDoc);
  5426.     } else {
  5427.  
  5428.         var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
  5429.                                         getService(Components.interfaces.nsIPromptService);
  5430.             var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  5431.             prompts.alert(window, navigatorRegionBundle.getString("browser.desktopSearch.prompt.title"),
  5432.                                                         navigatorRegionBundle.getString("browser.desktopSearch.prompt.noMatchingResults"));
  5433.  
  5434.     }
  5435.     var broadcaster = window.top.document.getElementById('searchEngineBroadcaster');
  5436.     broadcaster.setAttribute("searchStatus", 'complete');
  5437.  
  5438.     if (searchURL) {SearchLoadURL(searchURL, null)}
  5439. }
  5440.  
  5441. // MERC - JCH: Made changes to regular expression which selects a valid URI.
  5442. // There is no internetsearch.rdf file so I commented out a bunch of
  5443. // code that tries to access it. The URIs associated with 'fallbackDefaultSearchURL'
  5444. // and 'browser.search.defaulturl' were changed to ones that work. See region.properties file.
  5445. function OpenSearchBAK(tabName, searchStr, newTabFlag)
  5446. {
  5447.     //This function needs to be split up someday.
  5448.     //XXXnoririty I don't want any prefs switching open by tabs to window
  5449.     //XXXpch: this routine needs to be cleaned up.
  5450.  
  5451.     // GET FALLBACK SEARCH ENGINE: jch set it to google.
  5452.     var defaultSearchURL = null;
  5453.     // This gets chrome URL from browser\base\content\browser-sets.inc
  5454.     var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  5455.     var fallbackDefaultSearchURL = navigatorRegionBundle.getString("fallbackDefaultSearchURL");
  5456.  
  5457.     browserDebug("#$#$#$  OpenSearch(): Search String : " +searchStr+ "\n");
  5458.  
  5459.     //Check to see if search string contains "://" or "ftp." or white space.
  5460.     //If it does treat as url and match for pattern
  5461.     //var urlmatch= /(:\/\/|^ftp\.)[^ \S]+$/
  5462.     var urlmatch = /^(http|https|ftp|chrome|file):\/\/.+|^www\..+/;
  5463.     var forceAsURL = urlmatch.test(searchStr);
  5464.  
  5465.     browserDebug("#$#$#$  OpenSearch() FORCE TO A URL : " +forceAsURL+ "\n");
  5466.  
  5467.     // TRY TO GET PREFERRED SEARCH ENGINE
  5468.     try {
  5469.         defaultSearchURL = gPrefService.getComplexValue("browser.search.defaulturl",
  5470.         Components.interfaces.nsIPrefLocalizedString).data;
  5471.     } catch (ex) {}
  5472.  
  5473.     // Fallback to a default url (one that we can get sidebar search results for)
  5474.     if (!defaultSearchURL)
  5475.     defaultSearchURL = fallbackDefaultSearchURL;
  5476.  
  5477.     if (!defaultSearchURL) return;
  5478.  
  5479.     browserDebug("#$#$#$  OpenSearch(): Default String : " +defaultSearchURL+ "\n");
  5480.  
  5481.     if (!searchStr) {
  5482.         return;
  5483.         // BrowserSearchInternet();
  5484.     } else {
  5485.  
  5486.         //Check to see if location bar field is a url
  5487.         //If it is a url go to URL.  A Url is "://" or "." as commented above
  5488.         //Otherwise search on entry
  5489.         if (forceAsURL) {
  5490.             if (!newTabFlag) {
  5491.                 loadURI(searchStr, null, null);
  5492.             }
  5493.         else {
  5494.             var newTab = getBrowser().addTab(searchStr);
  5495.             if (!pref.getBoolPref("browser.tabs.loadInBackground"))
  5496.             getBrowser().selectedTab = newTab;
  5497.         }
  5498.  
  5499.         return;
  5500.         // BrowserLoadURL(null, null)
  5501.     } else {
  5502.         if (searchStr) {
  5503.             var escapedSearchStr = encodeURIComponent(searchStr);
  5504.             defaultSearchURL += escapedSearchStr;
  5505.  
  5506.  
  5507.             /*
  5508.             var searchDS = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  5509.             .getService(Components.interfaces.nsIInternetSearchService);
  5510.  
  5511.  
  5512.             searchDS.RememberLastSearchText(escapedSearchStr);
  5513.             try {
  5514.             var searchEngineURI = gPrefService.getCharPref("browser.search.defaultengine");
  5515.             if (searchEngineURI) {
  5516.             var searchURL = getSearchUrl("actionButton");
  5517.  
  5518.             if (searchURL) {
  5519.             defaultSearchURL = searchURL + escapedSearchStr;
  5520.             } else {
  5521.             searchURL = searchDS.GetInternetSearchURL(searchEngineURI, escapedSearchStr, 0, 0, {value:0});
  5522.             if (searchURL)
  5523.             defaultSearchURL = searchURL;
  5524.             }
  5525.             }
  5526.             } catch (ex) {
  5527.             }
  5528.             */
  5529.  
  5530.             browserDebug("#$#$#$ Complete string : " +defaultSearchURL+ "\n");
  5531.  
  5532.             if (!newTabFlag) {
  5533.                 loadURI(defaultSearchURL, null, null);
  5534.             }
  5535.         else {
  5536.             var newTab = getBrowser().addTab(defaultSearchURL);
  5537.             if (!pref.getBoolPref("browser.tabs.loadInBackground"))
  5538.             getBrowser().selectedTab = newTab;
  5539.         }
  5540.     }
  5541. }
  5542. }
  5543. }
  5544.  
  5545. function FillHistoryMenu(aParent, aMenu)
  5546. {
  5547.     // Remove old entries if any
  5548.     deleteHistoryItems(aParent);
  5549.  
  5550.     var sessionHistory = getWebNavigation().sessionHistory;
  5551.  
  5552.     var count = sessionHistory.count;
  5553.     var index = sessionHistory.index;
  5554.     var end;
  5555.     var j;
  5556.     var entry;
  5557.  
  5558.     switch (aMenu)
  5559.     {
  5560.         case "back":
  5561.         end = (index > MAX_HISTORY_MENU_ITEMS) ? index - MAX_HISTORY_MENU_ITEMS : 0;
  5562.         var clearTab = document.getElementById("clearTabBackButtonEntry");
  5563.         if ((index - 1) < end)
  5564.         {
  5565.             if (clearTab) clearTab.removeAttribute("hidden");
  5566.             return false;
  5567.         };
  5568.         for (j = index - 1; j >= end; j--)
  5569.         {
  5570.             entry = sessionHistory.getEntryAtIndex(j, false);
  5571.             if (entry)
  5572.             var menuItem = createMenuItem(aParent, j, entry.title);
  5573.             if (menuItem)
  5574.                 menuItem.setAttribute("tooltiptext", "Go back to "+menuItem.label);
  5575.         }
  5576.         if (clearTab)
  5577.         {
  5578.             clearTab.setAttribute("hidden", "true");
  5579.         }
  5580.         break;
  5581.         case "forward":
  5582.         end  = ((count-index) > MAX_HISTORY_MENU_ITEMS) ? index + MAX_HISTORY_MENU_ITEMS : count;
  5583.         if ((index + 1) >= end) return false;
  5584.         for (j = index + 1; j < end; j++)
  5585.         {
  5586.             entry = sessionHistory.getEntryAtIndex(j, false);
  5587.             if (entry)
  5588.             var menuItem = createMenuItem(aParent, j, entry.title);
  5589.             if (menuItem)
  5590.                 menuItem.setAttribute("tooltiptext", "Go forward to "+menuItem.label);
  5591.         }
  5592.         break;
  5593.         case "go":
  5594.         aParent.lastChild.hidden = (count == 0);
  5595.         end = count > MAX_HISTORY_MENU_ITEMS ? count - MAX_HISTORY_MENU_ITEMS : 0;
  5596.         for (j = count - 1; j >= end; j--)
  5597.         {
  5598.             entry = sessionHistory.getEntryAtIndex(j, false);
  5599.             if (entry)
  5600.             createRadioMenuItem(aParent, j, entry.title, j==index);
  5601.         }
  5602.         break;
  5603.     }
  5604.     return true;
  5605. }
  5606.  
  5607. function addToUrlbarHistory()
  5608. {
  5609.     var urlToAdd = gURLBar.value;
  5610.     if (!urlToAdd)
  5611.     return;
  5612.     if (urlToAdd.search(/[\x00-\x1F]/) != -1) // don't store bad URLs
  5613.     return;
  5614.  
  5615.     if (!gGlobalHistory)
  5616.     gGlobalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
  5617.     .getService(Components.interfaces.nsIBrowserHistory);
  5618.  
  5619.     if (!gURIFixup)
  5620.     gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  5621.     .getService(Components.interfaces.nsIURIFixup);
  5622.     try {
  5623.         if (urlToAdd.indexOf(" ") == -1) {
  5624.             var fixedUpURI = gURIFixup.createFixupURI(urlToAdd, 0);
  5625.             if(fixedUpURI.spec=="about:blank")
  5626.             return;
  5627.             // MERC (DP): history debug
  5628.  
  5629.             gGlobalHistory.markPageAsTyped(fixedUpURI);
  5630.         }
  5631.     }
  5632.     catch(ex) {
  5633.         if(!("result" in ex) ||
  5634.              ex.result != Components.results.NS_ERROR_MALFORMED_URI) {
  5635.             browserDebug ("Caught Exception: " + ex + "\n")
  5636.         }
  5637.     }
  5638. }
  5639.  
  5640. function createMenuItem( aParent, aIndex, aLabel)
  5641. {
  5642.     var menuitem = document.createElement( "menuitem" );
  5643.     menuitem.setAttribute( "label", aLabel );
  5644.     menuitem.setAttribute( "index", aIndex );
  5645.     aParent.appendChild( menuitem );
  5646.     return menuitem;
  5647. }
  5648.  
  5649. function createRadioMenuItem( aParent, aIndex, aLabel, aChecked)
  5650. {
  5651.     var menuitem = document.createElement( "menuitem" );
  5652.     menuitem.setAttribute( "type", "radio" );
  5653.     menuitem.setAttribute( "label", aLabel );
  5654.     menuitem.setAttribute( "index", aIndex );
  5655.     if (aChecked==true)
  5656.     menuitem.setAttribute( "checked", "true" );
  5657.     aParent.appendChild( menuitem );
  5658. }
  5659.  
  5660. function deleteHistoryItems(aParent)
  5661. {
  5662.     var children = aParent.childNodes;
  5663.     for (var i = 0; i < children.length; i++)
  5664.     {
  5665.         var index = children[i].getAttribute("index");
  5666.         if (index)
  5667.         aParent.removeChild(children[i]);
  5668.     }
  5669. }
  5670.  
  5671. function showTabHistory()
  5672. {
  5673.     alert("Tab history");
  5674. }
  5675.  
  5676. function undoTabClose()
  5677. {
  5678.     alert("Undo Tab Close");
  5679. }
  5680.  
  5681. function toJavaScriptConsole()
  5682. {
  5683.     toOpenWindowByType("global:console", "chrome://global/content/console.xul");
  5684. }
  5685.  
  5686. function toOpenWindowByType(inType, uri, features)
  5687. {
  5688.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  5689.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  5690.     var topWindow = windowManagerInterface.getMostRecentWindow(inType);
  5691.  
  5692.     if (topWindow)
  5693.         topWindow.focus();
  5694.     else if (features)
  5695.         window.open(uri, "_blank", features);
  5696.     else
  5697.         window.open(uri, "_blank", "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar");
  5698. }
  5699.  
  5700. // MERC (DP): when the user presses CTRL-N we look at the pref
  5701. // browser.tabs.newtabinsteadofwindow to determine whether to open
  5702. // a new window or a new tab.  effectively if the pref is on,
  5703. // pressing CTRL-N is equiv to pressing CTRL-T
  5704. function OpenBrowserWindowWithPref()
  5705. {
  5706.     if (gPrefService.getBoolPref("browser.tabs.newtabinsteadofwindow"))
  5707.     {
  5708.         BrowserHome(true);
  5709.     } else {
  5710.         OpenBrowserWindow();
  5711.     }
  5712. }
  5713.  
  5714. function tridentStartNav(urlStr)
  5715. {
  5716.     //browserDebug ("\nStarting trident navigation to url " + urlStr);
  5717.     getBrowser().userTypedClear = true;
  5718.     // JMC - Ought to call observer service notify for startDocumentLoad
  5719.     // But need to haul out the trident-hacked code there first
  5720.  
  5721.     // Bug#388, history entry loading issue
  5722.     if(gURLBar) {
  5723.         gURLBar.value = "";
  5724.         gURLBar.value = urlStr;
  5725.     }
  5726. }
  5727.  
  5728. function tridentStartSubFrameNav(urlStr)
  5729. {
  5730.     //browserDebug ("\nStarting trident subframe navigation to url " + urlStr);
  5731. }
  5732.  
  5733. function tridentEndNav(urlStr)
  5734. {
  5735.     // browserDebug ("\nStopping trident navigation to : " + urlStr);
  5736.     // JMC - Ought to call observer service notify for endDocumentLoad
  5737.     // But need to haul out the trident-hacked code there first
  5738. }
  5739.  
  5740. function tridentEndSubFrameNav(urlStr)
  5741. {
  5742.     // browserDebug ("\nStopping trident subframe navigation to : " + urlStr);
  5743.     // JMC - Ought to call observer service notify for endDocumentLoad
  5744.     // But need to haul out the trident-hacked code there first
  5745. }
  5746.  
  5747.  
  5748.  
  5749. function OpenBrowserWindow()
  5750. {
  5751.     var charsetArg = new String();
  5752.     var handler = Components.classes['@mozilla.org/commandlinehandler/general-startup;1?type=browser'];
  5753.     handler = handler.getService();
  5754.     handler = handler.QueryInterface(Components.interfaces.nsICmdLineHandler);
  5755.     var startpage = handler.defaultArgs;
  5756.     var url = handler.chromeUrlForTask;
  5757.     var wintype = document.firstChild.getAttribute('windowtype');
  5758.  
  5759.     // if and only if the current window is a browser window and it has a document with a character
  5760.     // set, then extract the current charset menu setting from the current document and use it to
  5761.     // initialize the new browser window...
  5762.     if (window && (wintype == "navigator:browser") && window._content && window._content.document)
  5763.     {
  5764.         var DocCharset = window._content.document.characterSet;
  5765.         charsetArg = "charset="+DocCharset;
  5766.  
  5767.         //we should "inherit" the charset menu setting in a new window
  5768.         window.openDialog(url, "_blank", "chrome,all,dialog=no", startpage, charsetArg);
  5769.     }
  5770. else // forget about the charset information.
  5771.     {
  5772.         window.openDialog(url, "_blank", "chrome,all,dialog=no", startpage);
  5773.     }
  5774. }
  5775.  
  5776. function openAboutDialog()
  5777. {
  5778.     window.openDialog("chrome://browser/content/aboutDialog.xul", "About", "modal,centerscreen,chrome,resizable=no");
  5779. }
  5780.  
  5781. function BrowserCustomizeToolbar()
  5782. {
  5783.     // Disable the toolbar context menu items
  5784.     var menubar = document.getElementById("main-menubar");
  5785.     for (var i = 0; i < menubar.childNodes.length; ++i)
  5786.     menubar.childNodes[i].setAttribute("disabled", true);
  5787.  
  5788.     var cmd = document.getElementById("cmd_CustomizeToolbars");
  5789.     cmd.setAttribute("disabled", "true");
  5790.  
  5791.     window.openDialog("chrome://global/content/customizeToolbar.xul", "CustomizeToolbar",
  5792.     "chrome,dependent,dialog", document.getElementById("navigator-toolbox"));
  5793. }
  5794.  
  5795. function BrowserToolboxCustomizeDone(aToolboxChanged)
  5796. {
  5797.     // Update global UI elements that may have been added or removed
  5798.     if (aToolboxChanged) {
  5799.         gURLBar = document.getElementById("urlbar");
  5800.         gProxyButton = document.getElementById("page-proxy-button");
  5801.         gProxyFavIcon = document.getElementById("page-proxy-favicon");
  5802.         gProxyDeck = document.getElementById("page-proxy-deck");
  5803.         //gHomeButton.updateTooltip();  DO NOT USE..this is set in the browser.xul file
  5804.         //<added by SLiu , fixing customize personal bookmarks toolbar
  5805.         var ptf = document.getElementById("personal-bookmarks");
  5806.         if (ptf) populateBookmarks();
  5807.  
  5808.         //<added by MSD , fixing webmail button
  5809.         webmail.fixMenus();
  5810.  
  5811.         window.XULBrowserWindow.init();
  5812.     }
  5813.  
  5814.     // Update the urlbar
  5815.     var url = getWebNavigation().currentURI.spec;
  5816.     if (gURLBar) {
  5817.         gURLBar.value = url;
  5818.         var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  5819.                             .createInstance(Components.interfaces.nsIURI);
  5820.         uri.spec = url;
  5821.         SetPageProxyState("valid", uri);
  5822.  
  5823.         // CC MERC bug #173710
  5824.         // Remove attribute livemark and readd them again to display
  5825.         // RSS Feeb upon customizing toolbar
  5826.         if(rssFeed && rssFeed.length > 0 && isSameUri==gBrowser.currentURI.spec){
  5827.  
  5828.             gBrowser.mCurrentBrowser.livemarkLinks = null;
  5829.             gLivemarksButton = document.getElementById("livemark-button");
  5830.             gLivemarksButton.removeAttribute("livemarks");
  5831.             gLivemarksButton.setAttribute("tooltiptext", gNavigatorBundle.getString("livemarkNoLivemarksTooltip"));
  5832.  
  5833.  
  5834.             for(i=0;i<rssFeed.length; i=i+2){
  5835.                 livemarkOnLinkAdded(rssFeed[i],rssFeed[i+1]);
  5836.             }
  5837.       }
  5838.  
  5839.  
  5840.     }
  5841.  
  5842.     // Re-enable parts of the UI we disabled during the dialog
  5843.     var menubar = document.getElementById("main-menubar");
  5844.     for (var i = 0; i < menubar.childNodes.length; ++i)
  5845.         menubar.childNodes[i].setAttribute("disabled", false);
  5846.     var cmd = document.getElementById("cmd_CustomizeToolbars");
  5847.     cmd.removeAttribute("disabled");
  5848.  
  5849.     // fix up the personal toolbar folder
  5850.     var bt = document.getElementById("bookmarks-ptf");
  5851.     if (bt) {
  5852.         var btf = BMSVC.getBookmarksToolbarFolder().Value;
  5853.         var btchevron = document.getElementById("bookmarks-chevron");
  5854.         bt.ref = btf;
  5855.         btchevron.ref = btf;
  5856.         // no uniqueness is guaranteed, so we have to remove first
  5857.         try {
  5858.             bt.database.RemoveObserver(BookmarksToolbarRDFObserver);
  5859.             bt.controllers.removeController(BookmarksMenuController);
  5860.         } catch (ex) {
  5861.             // ignore
  5862.         }
  5863.         bt.database.AddObserver(BookmarksToolbarRDFObserver);
  5864.         bt.controllers.appendController(BookmarksMenuController);
  5865.         bt.builder.rebuild();
  5866.         btchevron.builder.rebuild();
  5867.  
  5868.         // fake a resize; this function takes care of flowing bookmarks
  5869.         // from the bar to the overflow item
  5870.         BookmarksToolbar.resizeFunc(null);
  5871.     }
  5872.  
  5873.     // Initialize SPUI
  5874.     // JMC - NEEDS to refresh spui components here, but this is not quite right
  5875.     // if (spui) spui.RefreshComponentList();
  5876.     if (spui) spui.RedrawComponents();
  5877.     reshuffleToolbars(true);
  5878.     // XXX Shouldn't have to do this, but I do
  5879.  
  5880.     // JMC - Don't like this...
  5881.     browserDebug("Focusing the window\n");
  5882.     window.focus();
  5883.  
  5884.     //MERC: BH - fix to get security center popupblocking labels correct
  5885.     SetPopupBlockToggle();
  5886. }
  5887.  
  5888. function reshuffleToolbars(aForce)
  5889. {
  5890.     var toolbox = document.getElementById("navigator-toolbox");
  5891.     var toolbars = toolbox.getElementsByTagName('toolbar');
  5892.     for (var i = 0; i < toolbars.length; i++) {
  5893.         var toolbar = toolbars.item(i);
  5894.           try {
  5895.               toolbar.allocateItems(aForce);
  5896.           } catch (ex) {
  5897.               // not a overflow toolbar
  5898.           }
  5899.     }
  5900.     toolbars = toolbox.getElementsByTagName('multibartray');
  5901.     for (var i = 0; i < toolbars.length; i++) {
  5902.         var toolbar = toolbars.item(i);
  5903.           try {
  5904.               toolbar.allocateItems(aForce);
  5905.           } catch (ex) {
  5906.               // not a overflow toolbar
  5907.           }
  5908.     }
  5909. }
  5910.  
  5911. var FullScreen =
  5912. {
  5913.     toggle: function()
  5914.     {
  5915.         // show/hide all menubars, toolbars, and statusbars (except the full screen toolbar)
  5916.         this.showXULChrome(null, window.fullScreen, "titlebar-menu-stack");
  5917.         this.showXULChrome("toolbar", window.fullScreen);
  5918.         this.showXULChrome("multibar", window.fullScreen);
  5919.         this.showXULChrome("statusbar", window.fullScreen);
  5920.         var throbberBox = document.getElementById('throbber-box');
  5921.         if (throbberBox) {
  5922.             throbberBox.setAttribute('hidden', !window.fullScreen); //JMC : hide throbber in fullscreen
  5923.         }
  5924.         var popupBlockerButton = document.getElementById("popupblocker-button");
  5925.         if (popupBlockerButton)
  5926.             popupBlockerButton.setAttribute('hideLabel', !window.fullScreen);
  5927.     },
  5928.  
  5929.     showXULChrome: function(aTag, aShow, idElem)
  5930.     {
  5931.         var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  5932.         var els;
  5933.         if(idElem) {
  5934.             els = new Array();
  5935.             els[0] = document.getElementById(idElem);
  5936.         }
  5937.         else {
  5938.             els = document.getElementsByTagNameNS(XULNS, aTag);
  5939.         }
  5940.  
  5941.         var i;
  5942.         for (i = 0; i < els.length; ++i) {
  5943.             // XXX don't interfere with previously collapsed toolbars
  5944.             if (els[i].getAttribute("fullscreentoolbar") == "true") {
  5945.                 if (!aShow) {
  5946.                     var toolbarMode = els[i].getAttribute("mode");
  5947.                     var iconSize = els[i].getAttribute("iconsize");
  5948.                     var contextMenu = els[i].getAttribute("context");
  5949.  
  5950.                     if (toolbarMode != "text") {
  5951.                         els[i].setAttribute("saved-mode", toolbarMode);
  5952.                         els[i].setAttribute("saved-iconsize", iconSize);
  5953.                         els[i].setAttribute("mode", "icons");
  5954.                         els[i].setAttribute("iconsize", "small");
  5955.                     }
  5956.  
  5957.                     // XXX See bug 202978: we disable the context menu
  5958.                     // to prevent customization while in fullscreen, which
  5959.                     // causes menu breakage.
  5960.                     els[i].setAttribute("saved-context", contextMenu);
  5961.                     els[i].removeAttribute("context");
  5962.                 }
  5963.             else {
  5964.                 if (els[i].hasAttribute("saved-mode")) {
  5965.                     var savedMode = els[i].getAttribute("saved-mode");
  5966.                     els[i].setAttribute("mode", savedMode);
  5967.                     els[i].removeAttribute("saved-mode");
  5968.                 }
  5969.  
  5970.                 if (els[i].hasAttribute("saved-iconsize")) {
  5971.                     var savedIconSize = els[i].getAttribute("saved-iconsize");
  5972.                     els[i].setAttribute("iconsize", savedIconSize);
  5973.                     els[i].removeAttribute("saved-iconsize");
  5974.                 }
  5975.  
  5976.                 // XXX see above.
  5977.                 if (els[i].hasAttribute("saved-context")) {
  5978.                     var savedContext = els[i].getAttribute("saved-context");
  5979.                     els[i].setAttribute("context", savedContext);
  5980.                     els[i].removeAttribute("saved-context");
  5981.                 }
  5982.             }
  5983.         } else {
  5984.             // use moz-collapsed so it doesn't persist hidden/collapsed,
  5985.             // so that new windows don't have missing toolbars
  5986.             if (aShow)
  5987.             els[i].removeAttribute("moz-collapsed");
  5988.         else
  5989.             els[i].setAttribute("moz-collapsed", "true");
  5990.         }
  5991.     }
  5992.     var controls = document.getElementsByAttribute("fullscreencontrol", "true");
  5993.     for (i = 0; i < controls.length; ++i)
  5994.         controls[i].hidden = aShow;
  5995.  
  5996. }
  5997. };
  5998.  
  5999. function nsBrowserStatusHandler()
  6000. {
  6001.     this.init();
  6002. }
  6003.  
  6004. nsBrowserStatusHandler.prototype =
  6005. {
  6006.     // Stored Status, Link and Loading values
  6007.     status : "",
  6008.     defaultStatus : "",
  6009.     jsStatus : "",
  6010.     jsDefaultStatus : "",
  6011.     overLink : "",
  6012.     startTime : 0,
  6013.     statusText: "",
  6014.     lastURI: null,
  6015.  
  6016.     statusTimeoutInEffect : false,
  6017.  
  6018.     QueryInterface : function(aIID)
  6019.     {
  6020.         if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
  6021.         aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
  6022.         aIID.equals(Components.interfaces.nsIXULBrowserWindow) ||
  6023.         aIID.equals(Components.interfaces.nsISupports))
  6024.         return this;
  6025.         throw Components.results.NS_NOINTERFACE;
  6026.     },
  6027.  
  6028.     init : function()
  6029.     {
  6030.         this.throbberElement = document.getElementById("throbberBroadcaster");
  6031.         this.statusMeter     = document.getElementById("statusbar-icon");
  6032.         this.stopCommand     = document.getElementById("Browser:Stop");
  6033.         this.stopReloadBtn   = document.getElementById("stop-reload-button");
  6034.         this.statusTextField = document.getElementById("statusbar-display");
  6035.         this.securityButton  = document.getElementById("security-button");
  6036.         this.urlBar          = document.getElementById("urlbar");
  6037.  
  6038.         // Initialize the security button's state and tooltip text
  6039.         const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
  6040.         this.onSecurityChange(null, null, nsIWebProgressListener.STATE_IS_INSECURE);
  6041.     },
  6042.  
  6043.     destroy : function()
  6044.     {
  6045.         // XXXjag to avoid leaks :-/, see bug 60729
  6046.         this.throbberElement = null;
  6047.         this.statusMeter     = null;
  6048.         this.stopCommand     = null;
  6049.         this.stopReloadBtn   = null;
  6050.         this.statusTextField = null;
  6051.         this.securityButton  = null;
  6052.         this.urlBar          = null;
  6053.         this.statusText      = null;
  6054.         this.lastURI         = null;
  6055.     },
  6056.  
  6057.     setJSStatus : function(status)
  6058.     {
  6059.         this.jsStatus = status;
  6060.         this.updateStatusField();
  6061.     },
  6062.  
  6063.     setJSDefaultStatus : function(status)
  6064.     {
  6065.         this.jsDefaultStatus = status;
  6066.         this.updateStatusField();
  6067.     },
  6068.  
  6069.     setDefaultStatus : function(status)
  6070.     {
  6071.         this.defaultStatus = status;
  6072.         this.updateStatusField();
  6073.     },
  6074.  
  6075.     setOverLink : function(link, b)
  6076.     {
  6077.         this.overLink = link;
  6078.         this.updateStatusField();
  6079.     },
  6080.  
  6081.     updateStatusField : function()
  6082.     {
  6083.         var text = this.overLink || this.status || this.jsStatus || this.jsDefaultStatus || this.defaultStatus;
  6084.  
  6085.         // check the current value so we don't trigger an attribute change
  6086.         // and cause needless (slow!) UI updates
  6087.         if (this.statusText != text) {
  6088.             this.statusTextField.label = text;
  6089.             this.statusText = text;
  6090.         }
  6091.     },
  6092.  
  6093.     onLinkIconAvailable : function(aBrowser, aHref)
  6094.     {
  6095. //        browserDebug( "))      WMWMWMWMWMW===> onLinkIconAvailable(aBowser, \""+aHref+"\")\n" );
  6096.         if (gProxyFavIcon &&
  6097.         gBrowser.mCurrentBrowser == aBrowser &&
  6098.         gBrowser.userTypedValue === null)
  6099.         {
  6100.             PageProxySetIcon(aHref);
  6101.         }
  6102.  
  6103.         aBrowser.mFavIconURL = aHref;
  6104.     },
  6105.  
  6106.     onProgressChange : function (aWebProgress, aRequest,
  6107.     aCurSelfProgress, aMaxSelfProgress,
  6108.     aCurTotalProgress, aMaxTotalProgress)
  6109.     {
  6110.         if (aMaxTotalProgress > 0) {
  6111.             // This is highly optimized.  Don't touch this code unless
  6112.             // you are intimately familiar with the cost of setting
  6113.             // attrs on XUL elements. -- hyatt
  6114.             var percentage = (aCurTotalProgress * 100) / aMaxTotalProgress;
  6115.             this.statusMeter.value = percentage;
  6116.         }
  6117.     },
  6118.  
  6119.     onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus)
  6120.     {
  6121.         var docshell = getWebNavigation();
  6122.  
  6123.         if (aRequest) {
  6124.             blacklistUtils.debug('\nonStateChange('+aRequest.name+')\n');
  6125.             if (blacklistUtils.IsSiteInPhishList(aRequest.originalURI)) {
  6126.                 // ShowPhishingSiteWarning();
  6127.                 displayNotificationBar("phishing",[aRequest.originalURI]);
  6128.                 //aRequest.suspend();
  6129.                 //aRequest.cancel(Components.results.NS_BINDING_ABORTED);
  6130.             } else if (blacklistUtils.IsSiteInSpywareList(aRequest.originalURI)) {
  6131.                 //ShowSpywareSiteWarning();
  6132.                 displayNotificationBar("spyware",[aRequest.originalURI]);
  6133.             }
  6134.         }
  6135.  
  6136.         /*
  6137.         if (aRequest) {
  6138.         for (var p in aRequest) {
  6139.         browserDebug(' aRequest.'+p+': '+aRequest[p]+'\n');
  6140.         }
  6141.         }
  6142.         */
  6143.  
  6144.         const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
  6145.         const nsIChannel = Components.interfaces.nsIChannel;
  6146.         if (aStateFlags & nsIWebProgressListener.STATE_START) {
  6147.             // This (thanks to the filter) is a network start or the first
  6148.             // stray request (the first request outside of the document load),
  6149.             // initialize the throbber and his friends.
  6150.  
  6151.             // always reset the favicon
  6152.             if (gBrowser.mTabbedMode) {
  6153.                 var browserIndex = gBrowser.getBrowserIndexForDocument(aWebProgress.DOMWindow);
  6154.                 if (browserIndex != -1)
  6155.                 gBrowser.getBrowserAtIndex(browserIndex).mFavIconURL = null;
  6156.             }
  6157.         else
  6158.             gBrowser.mCurrentBrowser.mFavIconURL = null;
  6159.  
  6160.             // Call start document load listeners (only if this is a network load)
  6161.             if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK &&
  6162.             aRequest && aWebProgress.DOMWindow == content)
  6163.             this.startDocumentLoad(aRequest);
  6164.  
  6165.             if (this.throbberElement) {
  6166.                 // Turn the throbber on.
  6167.                 this.throbberElement.setAttribute("busy", "true");
  6168.             }
  6169.  
  6170.             // Turn the status meter on.
  6171.             this.statusMeter.value = 0;  // be sure to clear the progress bar
  6172.             if (gProgressCollapseTimer) {
  6173.                 window.clearTimeout(gProgressCollapseTimer);
  6174.                 gProgressCollapseTimer = null;
  6175.             }
  6176.         else
  6177.             this.statusMeter.parentNode.collapsed = false;
  6178.  
  6179.             // XXX: This needs to be based on window activity...
  6180.             this.stopCommand.removeAttribute("disabled");
  6181.             if (this.stopReloadBtn) {
  6182.                 // JCH: Need to set label according to state
  6183.                 this.stopReloadBtn.setAttribute("label","Stop");
  6184.                 this.stopReloadBtn.setAttribute("state","stop");
  6185.                 this.stopReloadBtn.removeAttribute("oncommand");
  6186.                 this.stopReloadBtn.setAttribute("command","Browser:Stop");
  6187.             }
  6188.         }
  6189.     else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
  6190.         if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
  6191.             if (aRequest) {
  6192.                 if (aWebProgress.DOMWindow == content)
  6193.                 this.endDocumentLoad(aRequest, aStatus);
  6194.             }
  6195.         }
  6196.  
  6197.         // This (thanks to the filter) is a network stop or the last
  6198.         // request stop outside of loading the document, stop throbbers
  6199.         // and progress bars and such
  6200.         if (aRequest) {
  6201.             var msg = "";
  6202.             // Get the channel if the request is a channel
  6203.             var channel;
  6204.             try {
  6205.                 channel = aRequest.QueryInterface(nsIChannel);
  6206.             }
  6207.             catch(e) { };
  6208.             if (channel) {
  6209.                 var location = channel.URI;
  6210.  
  6211.                 // For keyword URIs clear the user typed value since they will be changed into real URIs
  6212.                 if (location.scheme == "keyword" && aWebProgress.DOMWindow == content)
  6213.                     getBrowser().userTypedValue = null;
  6214.  
  6215.                 if (location.spec != "about:blank") {
  6216.                     const kErrorBindingAborted = 0x804B0002;
  6217.                     const kErrorNetTimeout = 0x804B000E;
  6218.                     switch (aStatus) {
  6219.                         case kErrorBindingAborted:
  6220.                         msg = gNavigatorBundle.getString("nv_stopped");
  6221.                         break;
  6222.                         case kErrorNetTimeout:
  6223.                         msg = gNavigatorBundle.getString("nv_timeout");
  6224.                         break;
  6225.                     }
  6226.  
  6227.                     // MERC - Stevo : Add feature discovery after page loads...
  6228.                     doFeatureDiscovery(location.spec);
  6229.                 }
  6230.  
  6231.             }
  6232.             // If msg is false then we did not have an error (channel may have
  6233.             // been null, in the case of a stray image load).
  6234.             if (!msg) {
  6235.                 msg = gNavigatorBundle.getString("nv_done");
  6236.             }
  6237.             this.status = "";
  6238.             this.setDefaultStatus(msg);
  6239.         }
  6240.  
  6241.         // Turn the progress meter and throbber off.
  6242.         gProgressCollapseTimer = window.setTimeout(
  6243.         function() {
  6244.             gProgressMeterPanel.collapsed = true;
  6245.             gProgressCollapseTimer = null;
  6246.         }, 100);
  6247.  
  6248.         if (this.throbberElement)
  6249.         this.throbberElement.removeAttribute("busy");
  6250.  
  6251.         this.stopCommand.setAttribute("disabled", "true");
  6252.         if (this.stopReloadBtn) {
  6253.             // JCH: Need to set label according to state
  6254.             this.stopReloadBtn.setAttribute("label","Reload");
  6255.             this.stopReloadBtn.setAttribute("state","reload");
  6256.             this.stopReloadBtn.removeAttribute("command");
  6257.             //this.stopReloadBtn.setAttribute("oncommand","BrowserStopReload(event);");
  6258.             this.stopReloadBtn.setAttribute("oncommand","BrowserReload(event);");
  6259.         }
  6260.  
  6261.     }
  6262.     setTimeout('updateDashboard()', 50);
  6263.   /*
  6264.     dashboard.init();
  6265.  
  6266.     if (dashboard.mDashboardWindow != null) {
  6267.         dashboard.debug(dashboard.mDashboardWindow);
  6268.         // some hackery so that the script has a chance to load...
  6269.         setTimeout('dashboard.mDashboardWindow.UpdateSecurityDashboard()', 50);
  6270.     } else {
  6271.         // dashboard window isn't open, should we expose it?
  6272.         if (dashboard.shouldAutoExpose()) {
  6273.             OpenDashboardWindow('fade');
  6274.         }
  6275.     }
  6276.     */
  6277. },
  6278.  
  6279. onLocationChange : function(aWebProgress, aRequest, aLocation)
  6280. {
  6281.     var location = aLocation.spec;
  6282.     if (location == "about:blank") location = "";
  6283.      //browserDebug("onLocationChange: location = "+location+"\n");
  6284.  
  6285.     if (blacklistUtils.IsSiteInPhishList(aLocation)) {
  6286.         // Get partners who think it's bad
  6287.         displayNotificationBar("phishing", [aLocation]);
  6288.     } else if (blacklistUtils.IsSiteInSpywareList(aLocation)) {
  6289.         // ShowSpywareSiteWarning();
  6290.         displayNotificationBar("spyware", [aLocation]);
  6291.     }
  6292.  
  6293.     // Check if URL is in tab history's deleted list. If so delete it from the list.
  6294. //    if (TabHistoryList.DeleteListHasURL(location)) {
  6295. //        TabHistoryList.RemoveDeleteListURL(location);
  6296. //    }
  6297.  
  6298.     // This code here does not compare uris exactly when determining
  6299.     // whether or not the message should be hidden since the message
  6300.     // may be prematurely hidden when an install is invoked by a click
  6301.     // on a link that looks like this:
  6302.     //
  6303.     // <a href="#" onclick="return install();">Install Foo</a>
  6304.     //
  6305.     // - which fires a onLocationChange message to uri + '#'...
  6306.     var selectedBrowser = getBrowser().selectedBrowser;
  6307.     if (selectedBrowser.lastURI) {
  6308.         var oldSpec = selectedBrowser.lastURI.spec;
  6309.         var oldIndexOfHash = oldSpec.indexOf("#");
  6310.         if (oldIndexOfHash != -1)
  6311.         oldSpec = oldSpec.substr(0, oldIndexOfHash);
  6312.         var newSpec = aLocation.spec;
  6313.         var newIndexOfHash = newSpec.indexOf("#");
  6314.         if (newIndexOfHash != -1)
  6315.         newSpec = newSpec.substr(0, newSpec.indexOf("#"));
  6316.  
  6317.         if (newSpec != oldSpec) {
  6318.             var tabbrowser = getBrowser();
  6319.             tabbrowser.hideMessage(tabbrowser.selectedBrowser, "both");
  6320.             gCurrentNotificationBar = null;
  6321.         } else {
  6322.             // MERC (DP): added this ELSE branch to fix BLT # 129362 - popup message bar doesn't
  6323.             // disappear when you turn off blocking and reload page.
  6324.             var site = sitecontrols.SCSVC.getResourceForURI(gBrowser.currentURI.spec);
  6325.             var blockState = sitecontrols.SCSVC.readSiteControlResource(site, 'allowPopups');
  6326.             if (blockState == 'true' && gCurrentNotificationBar == 'popup') {
  6327.                 var tabbrowser = getBrowser();
  6328.                 tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  6329.                 gCurrentNotificationBar = null;
  6330.             }
  6331.         }
  6332.     }
  6333.     selectedBrowser.lastURI = aLocation;
  6334.  
  6335.     this.setOverLink("", null);
  6336.  
  6337.     // MERC - JCH : update popup block button
  6338.     SetPopupBlockToggle();
  6339.  
  6340.     // We should probably not do this if the value has changed since the user
  6341.     // searched
  6342.     // Update urlbar only if a new page was loaded on the primary content area
  6343.     // Do not update urlbar if there was a subframe navigation
  6344.  
  6345.     var browser = getBrowser().selectedBrowser;
  6346.     var findField = document.getElementById("find-field");
  6347.  
  6348.     // MERC: set up for Trident
  6349.     var hpDoc = getTridentDocument();
  6350.     if (aWebProgress.DOMWindow == content) {
  6351.         // The document loaded correctly, clear the value if we should
  6352.         // bug#388, Treat the anchored path as the same
  6353.         if (browser.userTypedClear || location.indexOf("#"))
  6354.         {
  6355.             // browserDebug("Going to clear user's typed values\n");
  6356.             browser.userTypedValue = null;
  6357.         }
  6358.  
  6359.         // MERC - Stevo : This is reseting the find text value to blank whenever the user switches tabs (it Trident mode)
  6360.         //if (findField)
  6361.         //    setTimeout(function() { findField.value = browser.findString; }, 0, findField, browser);
  6362.  
  6363.         //XXXBlake don't we have to reinit this.urlBar, etc.
  6364.         //         when the toolbar changes?
  6365.         if (hpDoc) {
  6366.             //clean it here as we are not using startDocumentLoad
  6367.             // JMC - trying to fix clobbering of urlbar
  6368.             // If the typedValue is the same as where we are, clear it
  6369.             // browserDebug ("/nJMC Trying to clear userTypedValue when appropriate");
  6370.             // browserDebug ("Location is : " + location + ", userTypedValue : " + browser.userTypedValue);
  6371.  
  6372.             if (browser.userTypedClear || browser.userTypedValue == location)
  6373.             {
  6374.                 // browserDebug("Going to clear user's typed values because we're hpDoc?\n");
  6375.                 browser.userTypedValue = null;
  6376.             }
  6377.             //if (findField)
  6378.                 //closeFindBar();
  6379.         }
  6380.         if (gURLBar) {
  6381.             var userTypedValue = browser.userTypedValue;
  6382.             if (!userTypedValue) {
  6383.                 // If the url has "wyciwyg://" as the protocol, strip it off.
  6384.                 // Nobody wants to see it on the urlbar for dynamically generated
  6385.                 // pages.
  6386.                 if (!gURIFixup) {
  6387.                     gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  6388.                                           .getService(Components.interfaces.nsIURIFixup);
  6389.                 }
  6390.                 if (location && gURIFixup) {
  6391.                     try {
  6392.                         var locationURI = gURIFixup.createExposableURI(aLocation);
  6393.                         location = locationURI.spec;
  6394.                     } catch (exception) {}
  6395.                 }
  6396.                 if (getBrowser().forceSyncURLBarUpdate) {
  6397.                     gURLBar.value = ""; // hack for bug 249322
  6398.                     gURLBar.value = location;
  6399.                     SetPageProxyState("valid", aLocation);
  6400.                 } else {
  6401.                     setTimeout(function(loc, aloc) {
  6402.                         gURLBar.value = ""; // hack for bug 249322
  6403.                         gURLBar.value = loc;
  6404.                         SetPageProxyState("valid", aloc);
  6405.                     }, 0, location, aLocation);
  6406.                 }
  6407.                 // Setting the urlBar value in some cases causes userTypedValue to
  6408.                 // become set because of oninput, so reset it to its old value.
  6409.                 browser.userTypedValue = null;
  6410.             } else {
  6411.                 // JMC - introduced bug with urlBarValue
  6412.                 browserDebug ("userTYpedValue is non-null, setting invalid proxy state\n");
  6413.                 gURLBar.value = userTypedValue;
  6414.                 SetPageProxyState("invalid", null);
  6415.             }
  6416.         }
  6417.     }
  6418.     //MERC - Durga : display default passcard on toolbar in text mode
  6419.     // TODO (DP): this should be in the onClick handler of tabbrowser as well
  6420.     SetPasscard();
  6421.  
  6422.     UpdateBackForwardButtons();
  6423.  
  6424.     if (findField && gFindMode != FIND_NORMAL) {
  6425.         // Close the Find toolbar if we're in old-style TAF mode
  6426.         closeFindBar();
  6427.         gBackProtectBuffer = 0;
  6428.     }
  6429.  
  6430.     //fix bug 253793 - turn off highlight when page changes
  6431.     if (document.getElementById("highlight").checked)
  6432.         document.getElementById("highlight").removeAttribute("checked");
  6433.  
  6434.     // clear missing plugins
  6435.     gMissingPluginInstaller.clearMissingPlugins(getBrowser().selectedTab);
  6436.  
  6437.     setTimeout(function () { updatePageLivemarks(); }, 0);
  6438. },
  6439.  
  6440. onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage)
  6441. {
  6442.     this.status = aMessage;
  6443.     this.updateStatusField();
  6444. },
  6445.  
  6446. onSecurityChange : function(aWebProgress, aRequest, aState)
  6447. {
  6448.     const wpl = Components.interfaces.nsIWebProgressListener;
  6449.     this.securityButton.removeAttribute("label");
  6450.  
  6451.     switch (aState) {
  6452.     case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_HIGH:
  6453.         this.securityButton.setAttribute("level", "high");
  6454.         if (this.urlBar)
  6455.         this.urlBar.setAttribute("level", "high");
  6456.         try {
  6457.             this.securityButton.setAttribute("label",
  6458.             gBrowser.contentWindow.location.host);
  6459.         } catch(exception) {}
  6460.         break;
  6461.     case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_LOW:
  6462.         this.securityButton.setAttribute("level", "low");
  6463.         if (this.urlBar)
  6464.         this.urlBar.setAttribute("level", "low");
  6465.         try {
  6466.             this.securityButton.setAttribute("label",
  6467.             gBrowser.contentWindow.location.host);
  6468.         } catch(exception) {}
  6469.         break;
  6470.     case wpl.STATE_IS_BROKEN:
  6471.         this.securityButton.setAttribute("level", "broken");
  6472.         if (this.urlBar)
  6473.         this.urlBar.setAttribute("level", "broken");
  6474.         break;
  6475.     case wpl.STATE_IS_INSECURE:
  6476.     default:
  6477.         this.securityButton.removeAttribute("level");
  6478.         if (this.urlBar)
  6479.         this.urlBar.removeAttribute("level");
  6480.         break;
  6481.     }
  6482.  
  6483.     var securityUI = gBrowser.securityUI;
  6484.     if (securityUI) {
  6485.         this.securityButton.setAttribute("tooltiptext", securityUI.tooltipText);
  6486.         if (this.urlBar)
  6487.         this.urlBar.setAttribute("infotext", securityUI.tooltipText);
  6488.     }
  6489. else {
  6490.     this.securityButton.setAttribute("tooltiptext", securityUI.tooltipText);
  6491.     if (this.urlBar)
  6492.     this.urlBar.removeAttribute("infotext");
  6493. }
  6494. },
  6495.  
  6496. startDocumentLoad : function(aRequest)
  6497. {
  6498.     browserDebug("StartDocumentLoad\n");
  6499. //    browserDebug("removing engine attribute\n");
  6500.     //MERC (rpaul) remove the engine for the tab
  6501.     //gBrowser.mCurrentTab.removeAttribute("engine");
  6502.  
  6503.  
  6504.     // It's okay to clear what the user typed when we start
  6505.     // loading a document. If the user types, this flag gets
  6506.     // set to false, if the document load ends without an
  6507.     // onLocationChange, this flag also gets set to false
  6508.     // (so we keep it while switching tabs after failed load
  6509.     getBrowser().userTypedClear = true;
  6510.  
  6511.     // clear out livemark data
  6512.     gBrowser.mCurrentBrowser.livemarkLinks = null;
  6513.  
  6514.     // hide all message bars on reload
  6515.     gBrowser.hideMessage(gBrowser.mCurrentBrowser, "both");
  6516.     gCurrentNotificationBar = null;
  6517.  
  6518.     const nsIChannel = Components.interfaces.nsIChannel;
  6519.     var urlStr = aRequest.QueryInterface(nsIChannel).URI.spec;
  6520.     var observerService = Components.classes["@mozilla.org/observer-service;1"]
  6521.     .getService(Components.interfaces.nsIObserverService);
  6522.     try {
  6523.         observerService.notifyObservers(_content, "StartDocumentLoad", urlStr);
  6524.     } catch (e) {
  6525.     }
  6526. },
  6527.  
  6528. endDocumentLoad : function(aRequest, aStatus)
  6529. {
  6530.     browserDebug ("endDocumentLoad\n");
  6531.     // The document is done loading, it's okay to clear
  6532.     // the value again.
  6533.     getBrowser().userTypedClear = false;
  6534.  
  6535.     const nsIChannel = Components.interfaces.nsIChannel;
  6536.     var urlStr = aRequest.QueryInterface(nsIChannel).originalURI.spec;
  6537.  
  6538.     var observerService = Components.classes["@mozilla.org/observer-service;1"]
  6539.     .getService(Components.interfaces.nsIObserverService);
  6540.  
  6541.     var notification = Components.isSuccessCode(aStatus) ? "EndDocumentLoad" : "FailDocumentLoad";
  6542.     try {
  6543.         observerService.notifyObservers(_content, notification, urlStr);
  6544.     } catch (e) {
  6545.     }
  6546.     setTimeout(function() { if (document.getElementById("highlight").checked) toggleHighlight(true); }, 0);
  6547.  
  6548.     UpdateStatusbarPartnerIcons();
  6549. }
  6550. }
  6551.  
  6552. function nsBrowserAccess()
  6553. {
  6554. }
  6555.  
  6556. nsBrowserAccess.prototype =
  6557. {
  6558.     QueryInterface : function(aIID)
  6559.     {
  6560.         if (aIID.equals(nsCI.nsIBrowserDOMWindow) ||
  6561.         aIID.equals(nsCI.nsISupports))
  6562.         return this;
  6563.         throw Components.results.NS_NOINTERFACE;
  6564.     },
  6565.  
  6566.     openURI : function(aURI, aOpener, aWhere, aContext)
  6567.     {
  6568.         var newWindow = null;
  6569.         var referrer = null;
  6570.         // Bug #298255
  6571.         var isExternal = (aContext == nsCI.nsIBrowserDOMWindow.OPEN_EXTERNAL);
  6572.  
  6573.         if (isExternal && aURI && aURI.schemeIs("chrome"))
  6574.             return null;
  6575.  
  6576.         var loadflags = isExternal ?
  6577.                 nsCI.nsIWebNavigation.LOAD_FLAGS_FROM_EXTERNAL :
  6578.                 nsCI.nsIWebNavigation.LOAD_FLAGS_NONE;
  6579.  
  6580.         if (aWhere == nsCI.nsIBrowserDOMWindow.OPEN_DEFAULTWINDOW) {
  6581.             switch (aContext) {
  6582.                 case nsCI.nsIBrowserDOMWindow.OPEN_EXTERNAL :
  6583.                 aWhere = gPrefService.getIntPref("browser.link.open_external");
  6584.                 break;
  6585.                 default : // OPEN_NEW or an illegal value
  6586.                 aWhere = gPrefService.getIntPref("browser.link.open_newwindow");
  6587.             }
  6588.         }
  6589.         var url = aURI ? aURI.spec : "about:blank";
  6590.         switch(aWhere) {
  6591.             case nsCI.nsIBrowserDOMWindow.OPEN_NEWWINDOW :
  6592.             newWindow = openDialog(getBrowserURL(), "_blank", "all,dialog=no", url);
  6593.             break;
  6594.             case nsCI.nsIBrowserDOMWindow.OPEN_NEWTAB :
  6595.             var newTab = gBrowser.addTab("about:blank",null,null,null,true);
  6596.             if (!gPrefService.getBoolPref("browser.tabs.loadDivertedInBackground"))
  6597.             gBrowser.selectedTab = newTab;
  6598.             newWindow = gBrowser.getBrowserForTab(newTab).docShell
  6599.             .QueryInterface(nsCI.nsIInterfaceRequestor)
  6600.             .getInterface(nsCI.nsIDOMWindow);
  6601.             try {
  6602.                 if (aOpener) {
  6603.                     referrer = Components.classes["@mozilla.org/network/standard-url;1"]
  6604.                     .createInstance(nsCI.nsIURI);
  6605.                     referrer.spec = Components.lookupMethod(aOpener,"location")
  6606.                     .call(aOpener);
  6607.                 }
  6608.                 newWindow.QueryInterface(nsCI.nsIInterfaceRequestor)
  6609.                 .getInterface(nsCI.nsIWebNavigation)
  6610.                 .loadURI(url, loadflags, referrer, null, null);
  6611.             } catch(e) {
  6612.             }
  6613.             break;
  6614.             default : // OPEN_CURRENTWINDOW or an illegal value
  6615.             try {
  6616.                 if (aOpener) {
  6617.                     newWindow = Components.lookupMethod(aOpener,"top")
  6618.                     .call(aOpener);
  6619.                     referrer = Components.classes["@mozilla.org/network/standard-url;1"]
  6620.                     .createInstance(nsCI.nsIURI);
  6621.                     referrer.spec = Components.lookupMethod(aOpener,"location")
  6622.                     .call(aOpener);
  6623.                     newWindow.QueryInterface(nsCI.nsIInterfaceRequestor)
  6624.                     .getInterface(nsIWebNavigation)
  6625.                     .loadURI(url, loadflags, referrer, null, null);
  6626.                 } else {
  6627.                     newWindow = gBrowser.selectedBrowser.docShell
  6628.                     .QueryInterface(nsCI.nsIInterfaceRequestor)
  6629.                     .getInterface(nsCI.nsIDOMWindow);
  6630.                     getWebNavigation().loadURI(url, loadflags, null, null, null);
  6631.                 }
  6632.             } catch(e) {
  6633.             }
  6634.         }
  6635.         return newWindow;
  6636.     }
  6637. }
  6638.  
  6639. function onViewToolbarsPopupShowing(aEvent)
  6640. {
  6641.     var popup = aEvent.target;
  6642.     var i;
  6643.  
  6644.     // Empty the menu
  6645.     for (i = popup.childNodes.length-1; i >= 0; --i) {
  6646.         var deadItem = popup.childNodes[i];
  6647.         if (deadItem.hasAttribute("toolbarindex"))
  6648.         popup.removeChild(deadItem);
  6649.     }
  6650.  
  6651.     var firstMenuItem = popup.firstChild;
  6652.     var highestOrdinal = 0;
  6653.  
  6654.     var toolbox = document.getElementById("navigator-toolbox");
  6655.     for (i = 0; i < toolbox.childNodes.length; ++i) {
  6656.         var toolbar = toolbox.childNodes[i];
  6657.         var toolbarName = toolbar.getAttribute("toolbarname");
  6658.         var type = toolbar.getAttribute("type");
  6659.         if (toolbarName && type != "menubar") {
  6660.             var menuItem = document.createElement("menuitem");
  6661.             menuItem.setAttribute("toolbarindex", i);
  6662.             menuItem.setAttribute("type", "checkbox");
  6663.             menuItem.setAttribute("label", toolbarName);
  6664.             menuItem.setAttribute("accesskey", toolbar.getAttribute("accesskey"));
  6665.             menuItem.setAttribute("checked", toolbar.getAttribute("collapsed") != "true");
  6666.             // JMC- Hack to order the items to match the toolbar orders
  6667.             var toolbarordinal = toolbar.getAttribute("ordinal");
  6668.             menuItem.setAttribute('ordinal',toolbarordinal);
  6669.             if (toolbarordinal > highestOrdinal)
  6670.                 highestOrdinal = toolbarordinal;
  6671.             popup.insertBefore(menuItem, firstMenuItem);
  6672.  
  6673.             menuItem.addEventListener("command", onViewToolbarCommand, false);
  6674.         }
  6675.         // JMC: Iterate through all multibartrays, too
  6676.         // toolbar = toolbar.nextSibling;
  6677.         if (toolbar.localName == 'multibar')
  6678.         toolbar = toolbar.firstChild;
  6679.     else if (toolbar.localName == 'multibartray' && (!toolbar.nextSibling)) {
  6680.         toolbar = toolbar.parentNode.nextSibling;
  6681.     } else {
  6682.         toolbar = toolbar.nextSibling;
  6683.     }
  6684. }
  6685. firstMenuItem.setAttribute('ordinal',highestOrdinal + 1);
  6686. firstMenuItem.nextSibling.setAttribute('ordinal',highestOrdinal + 2);
  6687. if (firstMenuItem.nextSibling.nextSibling)
  6688.     firstMenuItem.nextSibling.nextSibling.setAttribute('ordinal',highestOrdinal + 3);
  6689. // JMC :  HACK HACK HACK
  6690. }
  6691.  
  6692. function onViewToolbarCommand(aEvent)
  6693. {
  6694.     var toolbox = document.getElementById("navigator-toolbox");
  6695.     var index = aEvent.originalTarget.getAttribute("toolbarindex");
  6696.     var toolbar = toolbox.childNodes[index];
  6697.  
  6698.     toolbar.collapsed = aEvent.originalTarget.getAttribute("checked") != "true";
  6699.     document.persist(toolbar.id, "collapsed");
  6700.     toolbox.reorderToolbars();
  6701. }
  6702.  
  6703. function displaySecurityInfo()
  6704. {
  6705.     // MERC - JCH: Temporary fix to show a Properties dialog
  6706.     // when lock icon is clicked and Trident is the engine. This code triggers
  6707.     // a Trident Properties dialog when Trident is the engine. It would be better
  6708.     // to show Gecko pageInfo dialog that has appropriate info.
  6709.  
  6710.     var docshell = getWebNavigation();
  6711.  
  6712.     if (docshell.browserEngine=="Trident")
  6713.     {
  6714.         var hpDoc = getTridentDocument();
  6715.         if(hpDoc)
  6716.         {
  6717.             hpDoc.showPageInfo();
  6718.         }
  6719.     } else {
  6720.         window.openDialog("chrome://browser/content/pageInfo.xul", "_blank",
  6721.         "dialog=no", null, "securityTab");
  6722.     }
  6723. }
  6724.  
  6725.  
  6726. function displayPageReportFirstTime()
  6727. {
  6728.     window.openDialog("chrome://browser/content/pageReportFirstTime.xul", "_blank",
  6729.     "dependent");
  6730. }
  6731.  
  6732. function displayPageReport()
  6733. {
  6734.     window.openDialog("chrome://browser/content/pageReport.xul", "_blank",
  6735.     "dialog,modal,resizable");
  6736. }
  6737. function nsBrowserContentListener(toplevelWindow, contentWindow)
  6738. {
  6739.     // this one is not as easy as you would hope.
  6740.     // need to convert toplevelWindow to an XPConnected object, instead
  6741.     // of a DOM-based object, to be able to QI() it to nsIXULWindow
  6742.  
  6743.     this.init(toplevelWindow, contentWindow);
  6744. }
  6745.  
  6746. /* implements nsIURIContentListener */
  6747.  
  6748. nsBrowserContentListener.prototype =
  6749. {
  6750.     init: function(toplevelWindow, contentWindow)
  6751.     {
  6752.         const nsIWebBrowserChrome = Components.interfaces.nsIWebBrowserChrome;
  6753.         this.toplevelWindow = toplevelWindow;
  6754.         this.contentWindow = contentWindow;
  6755.  
  6756.         // hook up the whole parent chain thing
  6757.         var windowDocShell = this.convertWindowToDocShell(toplevelWindow);
  6758.         if (windowDocShell)
  6759.         windowDocshell.parentURIContentListener = this;
  6760.  
  6761.         var registerWindow = false;
  6762.         try {
  6763.             var treeItem = contentWindow.docShell.QueryInterface(Components.interfaces.nsIDocShellTreeItem);
  6764.             var treeOwner = treeItem.treeOwner;
  6765.             var interfaceRequestor = treeOwner.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
  6766.             var webBrowserChrome = interfaceRequestor.getInterface(nsIWebBrowserChrome);
  6767.             if (webBrowserChrome)
  6768.             {
  6769.                 var chromeFlags = webBrowserChrome.chromeFlags;
  6770.                 var res = chromeFlags & nsIWebBrowserChrome.CHROME_ALL;
  6771.                 var res2 = chromeFlags & nsIWebBrowserChrome.CHROME_DEFAULT;
  6772.                 if ( res == nsIWebBrowserChrome.CHROME_ALL || res2 == nsIWebBrowserChrome.CHROME_DEFAULT)
  6773.                 {
  6774.                     registerWindow = true;
  6775.                 }
  6776.             }
  6777.         } catch (ex) {}
  6778.  
  6779.         // register ourselves
  6780.         if (registerWindow)
  6781.         {
  6782.             var uriLoader = Components.classes["@mozilla.org/uriloader;1"].getService(Components.interfaces.nsIURILoader);
  6783.             uriLoader.registerContentListener(this);
  6784.         }
  6785.     },
  6786.     close: function()
  6787.     {
  6788.         this.contentWindow = null;
  6789.         var uriLoader = Components.classes["@mozilla.org/uriloader;1"].getService(Components.interfaces.nsIURILoader);
  6790.  
  6791.         uriLoader.unRegisterContentListener(this);
  6792.     },
  6793.     QueryInterface: function(iid)
  6794.     {
  6795.         if (iid.equals(Components.interfaces.nsIURIContentListener) ||
  6796.         iid.equals(Components.interfaces.nsISupportsWeakReference) ||
  6797.         iid.equals(Components.interfaces.nsISupports))
  6798.         return this;
  6799.         throw Components.results.NS_NOINTERFACE;
  6800.     },
  6801.     onStartURIOpen: function(uri)
  6802.     {
  6803.         // ignore and don't abort
  6804.         return false;
  6805.     },
  6806.  
  6807.     doContent: function(contentType, isContentPreferred, request, contentHandler)
  6808.     {
  6809.         // forward the doContent to our content area webshell
  6810.         var docShell = this.contentWindow.docShell;
  6811.         var contentListener;
  6812.         try {
  6813.             contentListener =
  6814.             docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  6815.             .getInterface(Components.interfaces.nsIURIContentListener);
  6816.         } catch (ex) {
  6817.             browserDebug(ex);
  6818.         }
  6819.  
  6820.         if (!contentListener) return false;
  6821.  
  6822.         return contentListener.doContent(contentType, isContentPreferred, request, contentHandler);
  6823.  
  6824.     },
  6825.  
  6826.     isPreferred: function(contentType, desiredContentType)
  6827.     {
  6828.         // seems like we should be getting this from helper apps or something
  6829.         switch(contentType) {
  6830.             case "text/html":
  6831.             case "text/xul":
  6832.             case "text/rdf":
  6833.             case "text/xml":
  6834.             case "text/css":
  6835.             case "image/gif":
  6836.             case "image/jpeg":
  6837.             case "image/png":
  6838.             case "text/plain":
  6839.             case "application/http-index-format":
  6840.             return true;
  6841.         }
  6842.         return false;
  6843.     },
  6844.     canHandleContent: function(contentType, isContentPreferred, desiredContentType)
  6845.     {
  6846.         var docShell = this.contentWindow.docShell;
  6847.         var contentListener;
  6848.         try {
  6849.             contentListener =
  6850.             docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIURIContentListener);
  6851.         } catch (ex) {
  6852.             browserDebug(ex);
  6853.         }
  6854.         if (!contentListener) return false;
  6855.  
  6856.         return contentListener.canHandleContent(contentType, isContentPreferred, desiredContentType);
  6857.     },
  6858.     convertWindowToDocShell: function(win) {
  6859.         // don't know how to do this
  6860.         return null;
  6861.     },
  6862.     loadCookie: null,
  6863.     parentContentListener: null
  6864. }
  6865.  
  6866. // |forceOpen| is a bool that indicates that the sidebar should be forced open.  In other words
  6867. // the toggle won't be allowed to close the sidebar.
  6868. function toggleSidebar(aCommandID, forceOpen) {
  6869.  
  6870.     var sidebarBox = document.getElementById("sidebar-box");
  6871.     if (!aCommandID)
  6872.     aCommandID = sidebarBox.getAttribute("sidebarcommand");
  6873.  
  6874.     var elt = document.getElementById(aCommandID);
  6875.     if (!elt) return;
  6876.  
  6877.     var sidebar = document.getElementById("sidebar");
  6878.     var sidebarSplitter = document.getElementById("sidebar-splitter");
  6879.  
  6880.     if (!forceOpen && elt.getAttribute("checked") == "true") {
  6881.         elt.removeAttribute("checked");
  6882.         sidebarBox.setAttribute("sidebarcommand", "");
  6883.         sidebarBox.hidden = true;
  6884.         sidebarSplitter.hidden = true;
  6885.         _content.focus();
  6886.         return;
  6887.     }
  6888.  
  6889.     var elts = document.getElementsByAttribute("group", "sidebar");
  6890.     for (var i = 0; i < elts.length; ++i)
  6891.     elts[i].removeAttribute("checked");
  6892.  
  6893.     elt.setAttribute("checked", "true");;
  6894.  
  6895.     if (sidebarBox.hidden) {
  6896.         sidebarBox.hidden = false;
  6897.         sidebarSplitter.hidden = false;
  6898.     }
  6899.  
  6900.     var url = elt.getAttribute("sidebarurl");
  6901.     var title = elt.getAttribute("sidebartitle");
  6902.     if (!title)
  6903.     title = elt.getAttribute("label");
  6904.     sidebar.setAttribute("src", url);
  6905.     sidebarBox.setAttribute("src", url);
  6906.     sidebarBox.setAttribute("sidebarcommand", elt.id);
  6907.     if (aCommandID != "viewWebPanelsSidebar") { // no searchbox there
  6908.         // if the sidebar we want is already constructed, focus the searchbox
  6909.         if ((aCommandID == "viewBookmarksSidebar" && sidebar.contentDocument.getElementById("bookmarksPanel"))
  6910.         || (aCommandID == "viewHistorySidebar" && sidebar.contentDocument.getElementById("history-panel")))
  6911.         sidebar.contentDocument.getElementById("search-box").focus();
  6912.         // otherwiese, attach an onload handler
  6913.     else
  6914.         sidebar.addEventListener("load", asyncFocusSearchBox, true);
  6915.     }
  6916. }
  6917.  
  6918. function asyncFocusSearchBox(event)
  6919. {
  6920.     var sidebar = document.getElementById("sidebar");
  6921.     var searchBox = sidebar.contentDocument.getElementById("search-box");
  6922.     searchBox.focus();
  6923.     sidebar.removeEventListener("load", asyncFocusSearchBox, true);
  6924. }
  6925.  
  6926. function openPreferences(bOpenedFromMenu)
  6927. {
  6928.     //Merc BH: blt#208606: 'Options - Site Controls' and 'Site Controls' drop-down displays at the same time, when 'Site controls' is opened from the Security Center.
  6929.     //first ensure that the security dashboard is closed
  6930.     CloseDashboardWindow();
  6931.     
  6932.     // browserDebug ("The parent browser window is : " + window);
  6933.     /*JA ff5->vulp gPrefWindow =*/
  6934.  
  6935.     if (!bOpenedFromMenu) {
  6936.         bOpenedFromMenu = false;
  6937.     }
  6938.  
  6939.     openDialog("chrome://browser/content/pref/pref.xul","PrefWindow",
  6940.                "chrome,titlebar,resizable=no,modal", bOpenedFromMenu);
  6941. }
  6942.  
  6943. var gHomeButton = {
  6944.     prefDomain: "browser.startup.homepage",
  6945.     observe: function (aSubject, aTopic, aPrefName)
  6946.     {
  6947.         if (aTopic != "nsPref:changed" || aPrefName != this.prefDomain)
  6948.         return;
  6949.  
  6950.         this.updateTooltip();
  6951.     },
  6952.  
  6953.     updateTooltip: function ()
  6954.     {
  6955.         var homeButton = document.getElementById("home-button");
  6956.         if (homeButton) {
  6957.             var homePage = this.getHomePage();
  6958.             homePage = homePage.replace(/\|/g,', ');
  6959.             homeButton.setAttribute("tooltiptext", homePage);
  6960.         }
  6961.     },
  6962.  
  6963.     getHomePage: function ()
  6964.     {
  6965.         var url;
  6966.         try {
  6967.             url = gPrefService.getComplexValue(this.prefDomain,
  6968.             Components.interfaces.nsIPrefLocalizedString).data;
  6969.         } catch (e) {
  6970.         }
  6971.  
  6972.         // use this if we can't find the pref
  6973.         if (!url) {
  6974.             var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  6975.             url = navigatorRegionBundle.getString("homePageDefault");
  6976.         }
  6977.  
  6978.         return url;
  6979.     }
  6980. };
  6981.  
  6982. var gTargetElementFromPoint; var gElementFromPointZIdx = 0;
  6983. function RSSFinalElementFromPoint(from,x,y)
  6984. {
  6985.     anonElementFromPointInternal(from,x,y);
  6986.     return gTargetElementFromPoint;
  6987. }
  6988.  
  6989. function anonElementFromPointInternal(from, x,y)
  6990. {
  6991.     var n,i;
  6992.     //browserDebug("anonElementFromPointInternal called with from.tagName="+from.tagName+"\n");
  6993.     var nodelist = gBrowser.contentDocument.getAnonymousNodes(from);
  6994.     if (!nodelist || !nodelist.length) {
  6995.         //browserDebug("NO NODELIST!!!!\n");
  6996.         return null;
  6997.     }
  6998.     for(i=0;i<nodelist.length;i++)
  6999.     {
  7000.         n=nodelist[i];
  7001.         if( n.nodeType != Node.TEXT_NODE && n.style.display != 'none' )
  7002.         {
  7003.             var sx = getElementPosX(n); var sy = getElementPosY(n);
  7004.             var ex = sx + n.offsetWidth; var ey = sy + n.offsetHeight;
  7005.             if (( x > sx && x < ex && y > sy && y < ey ) || (n.offsetWidth == 0 && n.offsetHeight == 0))
  7006.             {
  7007.                 if (n.style.position != 'absolute')
  7008.                 {
  7009.                     if (!(n.offsetWidth == 0 && n.offsetHeight == 0 )) gTargetElementFromPoint=n;
  7010.                     if (n.hasChildNodes) finalElementFromPointInternal(n,x,y);
  7011.                     else anonElementFromPointInternal(n,x,y);
  7012.                 }
  7013.                 else
  7014.                     if (n.style.visibility=='visible' && (n.style.zIndex &&
  7015.                         n.style.zIndex >= gElementFromPointZIdx) || (!n.style.zIndex && gElementFromPointZIdx < 1)
  7016.                         )
  7017.                         {
  7018.                             if (!(n.offsetWidth == 0 && n.offsetHeight == 0 )) gTargetElementFromPoint=n;
  7019.                             if ( n.style.zIndex ) gElementFromPointZIdx = n.style.zIndex;
  7020.                             if (n.hasChildNodes) finalElementFromPointInternal(n,x,y);
  7021.                             else anonElementFromPointInternal(n,x,y);
  7022.                         }
  7023.             }
  7024.         }
  7025.     }
  7026. }
  7027. function finalElementFromPointInternal(from, x,y)
  7028. {
  7029.     var n,i;
  7030.     //browserDebug("finalElementFromPointInternal called with from.tagName="+from.tagName+"\n");
  7031.     var nodelist = from.childNodes;
  7032.     if (!nodelist || !nodelist.length) {
  7033.         //browserDebug("NO NODELIST!!!!\n");
  7034.         return null;
  7035.     }
  7036.     for(i=0;i<nodelist.length;i++)
  7037.     {
  7038.         n=nodelist[i];
  7039.         //browserDebug("looking at child of type "+n.localName+"\n");
  7040.         if( n.nodeType != Node.TEXT_NODE && n.style.display != 'none' )
  7041.         {
  7042.             var sx = getElementPosX(n); var sy = getElementPosY(n);
  7043.             var ex = sx + n.offsetWidth; var ey = sy + n.offsetHeight;
  7044.             //browserDebug("sx="+sx+",ex="+ex+"\nsy="+sy+",ey="+ey+"\n");
  7045.             if (( x > sx && x < ex && y > sy && y < ey ) || (n.offsetWidth == 0 && n.offsetHeight == 0 && n.hasChildNodes))
  7046.             {
  7047.                 if (n.style.position != 'absolute')
  7048.                 {
  7049.                     if (!(n.offsetWidth == 0 && n.offsetHeight == 0 )) gTargetElementFromPoint=n;
  7050.                     if (n.hasChildNodes) finalElementFromPointInternal(n,x,y);
  7051.                     else anonElementFromPointInternal(n,x,y);
  7052.                 } else if (n.style.visibility=='visible' && (n.style.zIndex &&
  7053.                     n.style.zIndex >= gElementFromPointZIdx) || (!n.style.zIndex && gElementFromPointZIdx < 1)
  7054.                     )
  7055.                     {
  7056.                         if (!(n.offsetWidth == 0 && n.offsetHeight == 0 )) gTargetElementFromPoint=n;
  7057.                         if ( n.style.zIndex ) gElementFromPointZIdx = n.style.zIndex;
  7058.                         if (n.hasChildNodes) finalElementFromPointInternal(n,x,y);
  7059.                         else anonElementFromPointInternal(n,x,y);
  7060.                     }
  7061.                 }
  7062.             }
  7063.         }
  7064.     }
  7065.  
  7066.  
  7067.     function getElementPosY(myObj)
  7068.     {
  7069.         return (myObj.offsetTop + ((myObj.offsetParent) ?
  7070.         getElementPosY(myObj.offsetParent) : 0));
  7071.     }
  7072.  
  7073.     function getElementPosX(myObj)
  7074.     {
  7075.         return (myObj.offsetLeft + ((myObj.offsetParent) ?
  7076.         getElementPosX(myObj.offsetParent) : 0));
  7077.     }
  7078.  
  7079.  
  7080. function nsContextMenu( xulMenu, event ) {
  7081.     this.target         = null;
  7082.     this.menu           = null;
  7083.     this.onTextInput    = false;
  7084.     this.onKeywordField = false;
  7085.     this.onImage        = false;
  7086.   this.onLoadedImage  = false;            // moz sec bug fix - lvinkle
  7087.     this.onLink         = false;
  7088.     this.onMailtoLink   = false;
  7089.     this.onSaveableLink = false;
  7090.     this.onMetaDataItem = false;
  7091.     this.onMathML       = false;
  7092.     this.link           = false;
  7093.     this.inFrame        = false;
  7094.     this.hasBGImage     = false;
  7095.     this.isTextSelected = false;
  7096.     this.inDirList      = false;
  7097.     this.shouldDisplay  = true;
  7098.  
  7099.     // Initialize new menu.
  7100.     this.initMenu( xulMenu, event );
  7101. }
  7102.  
  7103. // Prototype for nsContextMenu "class."
  7104. nsContextMenu.prototype = {
  7105.     // onDestroy is a no-op at this point.
  7106.     onDestroy : function () {
  7107.     },
  7108.     // Initialize context menu.
  7109.     initMenu : function ( popup, event ) {
  7110.         // Save menu.
  7111.         this.menu = popup;
  7112.  
  7113.         // Get contextual info.
  7114.         this.setTarget( document.popupNode,event );
  7115.  
  7116.         this.isTextSelected = this.isTextSelection();
  7117.  
  7118.         // Initialize (disable/remove) menu items.
  7119.         this.initItems();
  7120.     },
  7121.     initItems : function () {
  7122.         this.initTridentSwitchItem();  // MERC (DP): disable/enable Trident switch
  7123.         this.initOpenItems();
  7124.         this.initNavigationItems();
  7125.         this.initViewItems();
  7126.         this.initMiscItems();
  7127.         this.initSaveItems();
  7128.         this.initClipboardItems();
  7129.         this.initMetadataItems();
  7130.         this.initPrintItems();
  7131.     },
  7132.     // MERC (DP): this function will disable the Trident switch menu item.
  7133.     // for all 'about:*' we disable, except for 'about:blank' - allow engine switch on blank page
  7134.     initTridentSwitchItem : function () {
  7135.         //browserDebug('*** target: ' + this.target.localName + '\n');
  7136.  
  7137.         var engineMenuItem = document.getElementById('switchToTrident');
  7138.         //browserDebug('*** switch to trident menu item: ' + engineMenuItem.getAttribute('label') + '\n');
  7139.  
  7140.         var url = gBrowser.getBrowserForTab(gBrowser.mCurrentTab).currentURI.spec;
  7141.  
  7142.         var regex = /^about:/;
  7143.         var feedrx = /^feeds:/;
  7144.         if((regex.test(url) && url != 'about:blank')||feedrx.test(url)) {
  7145.             engineMenuItem.setAttribute('disabled', 'true');
  7146.         } else {
  7147.             engineMenuItem.removeAttribute('disabled');
  7148.         }
  7149.  
  7150.         this.showItem( "switchToTrident", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7151.     },
  7152.     initOpenItems : function () {
  7153.         this.showItem( "context-openlink", this.onSaveableLink || ( this.inDirList && this.onLink ) );
  7154.         this.showItem( "context-openlinkintab", this.onSaveableLink || ( this.inDirList && this.onLink ) );
  7155.  
  7156.         //this.showItem( "context-sep-open", this.onSaveableLink || ( this.inDirList && this.onLink ) );
  7157.         this.showItem( "context-sep-open", false );
  7158.     },
  7159.     initNavigationItems : function () {
  7160.         // Back determined by canGoBack broadcaster.
  7161.         this.setItemAttrFromNode( "context-back", "disabled", "canGoBack" );
  7162.  
  7163.         // Forward determined by canGoForward broadcaster.
  7164.         this.setItemAttrFromNode( "context-forward", "disabled", "canGoForward" );
  7165.  
  7166.         this.showItem( "context-back", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7167.         this.showItem( "context-forward", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7168.  
  7169.         this.showItem( "context-reload", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7170.  
  7171.         this.showItem( "context-stop", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7172.         this.showItem( "context-sep-stop", !( this.isTextSelected || this.onTextInput || this.onImage ) );
  7173.  
  7174.         // XXX: Stop is determined in navigator.js; the canStop broadcaster is broken
  7175.         //this.setItemAttrFromNode( "context-stop", "disabled", "canStop" );
  7176.     },
  7177.     initSaveItems : function () {
  7178.         this.showItem( "context-savepage", !( this.inDirList || this.isTextSelected || this.onTextInput || this.onLink || this.onImage ));
  7179.         this.showItem( "context-sendpage", !( this.inDirList || this.isTextSelected || this.onTextInput || this.onLink || this.onImage ));
  7180.  
  7181.         // Save link depends on whether we're in a link.
  7182.         this.showItem( "context-savelink", this.onSaveableLink );
  7183.  
  7184.         // Save image depends on whether there is one.
  7185.     this.showItem( "context-saveimage", this.onLoadedImage );
  7186.  
  7187.         this.showItem( "context-sendimage", this.onImage );
  7188.  
  7189.         // Send link depends on whether we're in a link.
  7190.         //this.showItem( "context-sendlink", this.onSaveableLink );
  7191.         this.showItem( "context-sendlink", false );
  7192.     },
  7193.     initViewItems : function () {
  7194.         // View source is always OK, unless in directory listing.
  7195.         this.showItem( "context-viewpartialsource-selection", this.isTextSelected );
  7196.         this.showItem( "context-viewpartialsource-mathml", this.onMathML && !this.isTextSelected );
  7197.         this.showItem( "context-viewsource", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  7198.         this.showItem( "context-viewinfo", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  7199.  
  7200.         this.showItem( "context-sep-properties", !( this.inDirList || this.isTextSelected || this.onTextInput ) );
  7201.         // Set As Wallpaper depends on whether an image was clicked on, and only works if we have a shell service.
  7202.         var haveSetWallpaper = false;
  7203.         // Only enable set as wallpaper if we can get the shell service.
  7204.         var shell = getShellService();
  7205.         if (shell)
  7206.         haveSetWallpaper = true;
  7207.        this.showItem( "context-setWallpaper", haveSetWallpaper && this.onLoadedImage );    // MERC - moz sec bug fix - lvinkle
  7208.  
  7209.        if( haveSetWallpaper && this.onLoadedImage ) {            // merc - moz sec bug fix - lvinkle
  7210.             // Disable the Set As Wallpaper menu item if we're still trying to load the image or the load failed
  7211.             const nsIImageLoadingContent = Components.interfaces.nsIImageLoadingContent;
  7212.             var disableSetWallpaper = false;
  7213.             if (("complete" in this.target) && !this.target.complete)
  7214.                  disableSetWallpaper = true;
  7215.             else if (this.target instanceof nsIImageLoadingContent) {
  7216.                 var request = this.target.QueryInterface(nsIImageLoadingContent)
  7217.                                   .getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
  7218.                 if (!request)
  7219.                     disableSetWallpaper = true;
  7220.             }
  7221.             else if (makeURL(this.target.src).scheme == "javascript")
  7222.                 disableSetWallpaper = true;
  7223.  
  7224.             this.setItemAttr( "context-setWallpaper", "disabled", disableSetWallpaper);
  7225.         }
  7226.  
  7227.         // View Image depends on whether an image was clicked on.
  7228.         this.showItem( "context-viewimage", this.onImage );
  7229.  
  7230.         // View background image depends on whether there is one.
  7231.         this.showItem( "context-viewbgimage", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  7232.         this.showItem( "context-sep-viewbgimage", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  7233.         this.setItemAttr( "context-viewbgimage", "disabled", this.hasBGImage ? null : "true");
  7234.     },
  7235.     initMiscItems : function () {
  7236.         // Use "Bookmark This Link" if on a link.
  7237.         this.showItem( "context-bookmarkpage", !( this.isTextSelected || this.onTextInput || this.onLink || this.onImage ) );
  7238.         //this.showItem( "context-bookmarklink", this.onLink && !this.onMailtoLink );
  7239.         this.showItem( "context-bookmarklink", false );
  7240.         this.showItem( "context-addBookmarkAsTabGrp", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7241.         //this.showItem( "context-addBookmarkAsTabGrp", false);
  7242.         this.showItem( "context-searchselect", this.isTextSelected );
  7243.         //this.showItem( "context-keywordfield", this.onTextInput && this.onKeywordField );
  7244.         this.showItem( "context-keywordfield", false );
  7245.         this.showItem( "frame", this.inFrame );
  7246.         this.showItem( "frame-sep", this.inFrame );
  7247.         /* MERC: ccampbell: commented this out because it needs to be updated to use Site Controls instead
  7248.         this.showItem( "context-blockimage", this.onImage);
  7249.  
  7250.         // BiDi UI
  7251.         var showBIDI = isBidiEnabled();
  7252.         this.showItem( "context-sep-bidi", showBIDI);
  7253.         this.showItem( "context-bidi-text-direction-toggle", this.onTextInput && showBIDI);
  7254.         this.showItem( "context-bidi-page-direction-toggle", !this.onTextInput && showBIDI);
  7255.  
  7256.         if (this.onImage) {
  7257.         var blockImage = document.getElementById("context-blockimage");
  7258.  
  7259.         var uri = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURI);
  7260.         uri.spec = this.imageURL;
  7261.  
  7262.         var shortenedUriHost = uri.host.replace(/^www\./i,"");
  7263.         if (shortenedUriHost.length > 15)
  7264.         shortenedUriHost = shortenedUriHost.substr(0,15) + "...";
  7265.         blockImage.label = gNavigatorBundle.getFormattedString ("blockImages", [shortenedUriHost]);
  7266.  
  7267.         if (this.isImageBlocked()) {
  7268.         blockImage.setAttribute("checked", "true");
  7269.         }
  7270.         else
  7271.         blockImage.removeAttribute("checked");
  7272.         }
  7273.         */
  7274.     },
  7275.     initClipboardItems : function () {
  7276.  
  7277.         // Copy depends on whether there is selected text.
  7278.         // Enabling this context menu item is now done through the global
  7279.         // command updating system
  7280.         // this.setItemAttr( "context-copy", "disabled", !this.isTextSelected() );
  7281.  
  7282.         goUpdateGlobalEditMenuItems();
  7283.  
  7284.         this.showItem( "context-undo", this.onTextInput );
  7285.         this.showItem( "context-sep-undo", this.onTextInput );
  7286.         this.showItem( "context-cut", this.onTextInput );
  7287.         this.showItem( "context-copy", this.isTextSelected || this.onTextInput );
  7288.         this.showItem( "context-paste", this.onTextInput );
  7289.         this.showItem( "context-delete", this.onTextInput );
  7290.         this.showItem( "context-sep-paste", this.onTextInput );
  7291.         this.showItem( "context-selectall", !( this.onLink || this.onImage ) );
  7292.         //this.showItem( "context-sep-selectall", this.isTextSelected );
  7293.         //this.showItem( "context-sep-selectall", true );
  7294.         this.showItem( "context-sep-selectall", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  7295.  
  7296.         // XXX dr
  7297.         // ------
  7298.         // nsDocumentViewer.cpp has code to determine whether we're
  7299.         // on a link or an image. we really ought to be using that...
  7300.  
  7301.         // Copy email link depends on whether we're on an email link.
  7302.         this.showItem( "context-copyemail", this.onMailtoLink );
  7303.  
  7304.         // Copy link location depends on whether we're on a link.
  7305.         this.showItem( "context-copylink", this.onLink );
  7306.         //this.showItem( "context-copylink", false );
  7307.         this.showItem( "context-sep-copylink", this.onLink && this.onImage);
  7308.         //this.showItem( "context-sep-copylink", false );
  7309.  
  7310.         // Copy image contents depends on whether we're on an image.
  7311.         //this.showItem( "context-copyimage-contents", this.onImage );
  7312.         this.showItem( "context-copyimage-contents", false );
  7313.         // Copy image location depends on whether we're on an image.
  7314.         //this.showItem( "context-copyimage", this.onImage );
  7315.         this.showItem( "context-copyimage", false );
  7316.         this.showItem( "context-sep-copyimage", this.onImage && this.onLink );
  7317.         this.showItem( "context-sep-copyimage", false );
  7318.     },
  7319.     initMetadataItems : function () {
  7320.         // Show if user clicked on something which has metadata.
  7321.         this.showItem( "context-metadata", this.onMetaDataItem );
  7322.     },
  7323.     // MERC (DP): control the print menu items
  7324.     initPrintItems : function () {
  7325.         this.showItem( "context-sep-print", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  7326.         this.showItem( "context-print", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  7327.     },
  7328.     // Set various context menu attributes based on the state of the world.
  7329.     setTarget : function ( node, event ) {
  7330.         const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  7331.         if ( node.namespaceURI == xulNS ) {
  7332.             this.shouldDisplay = false;
  7333.             return;
  7334.         }
  7335.         // Initialize contextual info.
  7336.         this.onImage    = false;
  7337.         this.onMetaDataItem = false;
  7338.         this.onTextInput = false;
  7339.         this.onKeywordField = false;
  7340.         this.imageURL   = "";
  7341.         this.onLink     = false;
  7342.     this.onLoadedImage = false;        // MERC - moz sec bug fix - lvinkle
  7343.         this.onMathML   = false;
  7344.         this.inFrame    = false;
  7345.         this.hasBGImage = false;
  7346.         this.bgImageURL = "";
  7347.  
  7348.         // Remember the node that was clicked.
  7349.         this.target = node;
  7350.  
  7351.         if (this.target.localName == "rss" || this.target.localName == "RDF" || this.target.localName == "feed") {
  7352.             if (event.orginalTarget)
  7353.                 this.target = event.orginalTarget;
  7354.             else if (event.clientX && event.clientY) {
  7355.                 var x = event.clientX + gBrowser.contentWindow.pageXOffset;
  7356.                 var y = event.clientY + gBrowser.contentWindow.pageYOffset;
  7357.                 //browserDebug("x="+x+"\ny="+y+"\n");
  7358.                 // Attempt to determine target from client Coords
  7359.                 var tempTarget = RSSFinalElementFromPoint(this.target,x,y);
  7360.                 if (tempTarget) {
  7361.                     this.target=tempTarget;
  7362.                 }
  7363.             }
  7364.             document.popupNode = this.target;
  7365.         }
  7366.  
  7367.         // See if the user clicked on an image.
  7368.         if ( this.target.nodeType == Node.ELEMENT_NODE ) {
  7369.         if ( this.target instanceof Components.interfaces.nsIImageLoadingContent ) {        // MERC - moz sec bug fix - lvinkle
  7370.                 this.onImage = true;
  7371.         var request = this.target.getRequest( Components.interfaces.nsIImageLoadingContent.CURRENT_REQUEST );    // MERC - start moz sec bug fix - lvinkle
  7372.         if (request && (request.imageStatus & request.STATUS_SIZE_AVAILABLE))
  7373.            this.onLoadedImage = true;                                                                                                        // MERC - end moz bug fix - lvinkle
  7374.                 this.imageURL = this.target.src;
  7375.                 // Look for image map.
  7376.                 var mapName = this.target.getAttribute( "usemap" );
  7377.                 if ( mapName ) {
  7378.                     // Find map.
  7379.                     var map = this.target.ownerDocument.getElementById( mapName.substr(1) );
  7380.                     if ( map ) {
  7381.                         // Search child <area>s for a match.
  7382.                         var areas = map.childNodes;
  7383.                         //XXX Client side image maps are too hard for now!
  7384.                         areas.length = 0;
  7385.                         for ( var i = 0; i < areas.length && !this.onLink; i++ ) {
  7386.                             var area = areas[i];
  7387.                             if ( area instanceof HTMLAreaElement ) {
  7388.                                 // Get type (rect/circle/polygon/default).
  7389.                                 var type = area.getAttribute( "type" );
  7390.                                 var coords = this.parseCoords( area );
  7391.                                 switch ( type.toUpperCase() ) {
  7392.                                     case "RECT":
  7393.                                     case "RECTANGLE":
  7394.                                         break;
  7395.                                     case "CIRC":
  7396.                                     case "CIRCLE":
  7397.                                         break;
  7398.                                     case "POLY":
  7399.                                     case "POLYGON":
  7400.                                         break;
  7401.                                     case "DEFAULT":
  7402.                                         // Default matches entire image.
  7403.                                         this.onLink = true;
  7404.                                         this.link = area;
  7405.                                         this.onSaveableLink = this.isLinkSaveable( this.link );
  7406.                                         break;
  7407.                                 }
  7408.                             }
  7409.                         }
  7410.                     }
  7411.                 }
  7412.              } else if ( this.target instanceof HTMLObjectElement
  7413.             &&
  7414.             // See if object tag is for an image.
  7415.             this.objectIsImage( this.target ) ) {
  7416.                 // This is an image.
  7417.                 this.onImage = true;
  7418.                 // URL must be constructed.
  7419.                 this.imageURL = this.objectImageURL( this.target );
  7420.              } else if ( this.target instanceof HTMLInputElement) {
  7421.                 type = this.target.getAttribute("type");
  7422.                 if(type && type.toUpperCase() == "IMAGE") {
  7423.                     this.onImage = true;
  7424.                     // Convert src attribute to absolute URL.
  7425.                     this.imageURL = makeURLAbsolute( this.target.baseURI,
  7426.                     this.target.src );
  7427.                 } else /* if (this.target.getAttribute( "type" ).toUpperCase() == "TEXT") */ {
  7428.                     this.onTextInput = this.isTargetATextBox(this.target);
  7429.                     this.onKeywordField = this.isTargetAKeywordField(this.target);
  7430.                 }
  7431.             } else if ( this.target instanceof HTMLTextAreaElement ) {
  7432.                  this.onTextInput = true;
  7433.             } else if ( this.target instanceof HTMLHtmlElement ) {
  7434.                 // pages with multiple <body>s are lame. we'll teach them a lesson.
  7435.                 var bodyElt = this.target.ownerDocument.getElementsByTagName("body")[0];
  7436.                 if ( bodyElt ) {
  7437.                     var computedURL = this.getComputedURL( bodyElt, "background-image" );
  7438.                     if ( computedURL ) {
  7439.                         this.hasBGImage = true;
  7440.                         this.bgImageURL = makeURLAbsolute( bodyElt.baseURI,
  7441.                         computedURL );
  7442.                     }
  7443.                 }
  7444.             } else if ( "HTTPIndex" in _content &&
  7445.             _content.HTTPIndex instanceof Components.interfaces.nsIHTTPIndex ) {
  7446.                 this.inDirList = true;
  7447.                 // Bubble outward till we get to an element with URL attribute
  7448.                 // (which should be the href).
  7449.                 var root = this.target;
  7450.                 while ( root && !this.link ) {
  7451.                     if ( root.tagName == "tree" ) {
  7452.                         // Hit root of tree; must have clicked in empty space;
  7453.                         // thus, no link.
  7454.                         break;
  7455.                     }
  7456.                     if ( root.getAttribute( "URL" ) ) {
  7457.                         // Build pseudo link object so link-related functions work.
  7458.                         this.onLink = true;
  7459.                         this.link = { href : root.getAttribute("URL"),
  7460.                         getAttribute: function (attr) {
  7461.                             if (attr == "title") {
  7462.                                 return root.firstChild.firstChild.getAttribute("label");
  7463.                             } else {
  7464.                                 return "";
  7465.                             }
  7466.                         }
  7467.                     };
  7468.                     // If element is a directory, then you can't save it.
  7469.                     if ( root.getAttribute( "container" ) == "true" ) {
  7470.                         this.onSaveableLink = false;
  7471.                     } else {
  7472.                         this.onSaveableLink = true;
  7473.                     }
  7474.                 } else {
  7475.                     root = root.parentNode;
  7476.                 }
  7477.             }
  7478.         }
  7479.     }
  7480.  
  7481.     // We have meta data on images.
  7482.     this.onMetaDataItem = this.onImage;
  7483.  
  7484.     // See if the user clicked on MathML
  7485.     const NS_MathML = "http://www.w3.org/1998/Math/MathML";
  7486.     if ((this.target.nodeType == Node.TEXT_NODE &&
  7487.     this.target.parentNode.namespaceURI == NS_MathML)
  7488.     || (this.target.namespaceURI == NS_MathML))
  7489.     this.onMathML = true;
  7490.  
  7491.     // See if the user clicked in a frame.
  7492.     if ( this.target.ownerDocument != window._content.document ) {
  7493.         this.inFrame = true;
  7494.     }
  7495.  
  7496.     // Bubble out, looking for items of interest
  7497.     var elem = this.target;
  7498.     while ( elem ) {
  7499.         if ( elem.nodeType == Node.ELEMENT_NODE ) {
  7500.             // Link?
  7501.             if ( !this.onLink &&
  7502.                     ( (elem instanceof HTMLAnchorElement && elem.href) ||
  7503.                       elem instanceof HTMLAreaElement ||
  7504.                       elem instanceof HTMLLinkElement ||
  7505.             elem.getAttributeNS( "http://www.w3.org/1999/xlink", "type") == "simple" ) ) {
  7506.                 // Clicked on a link.
  7507.                 this.onLink = true;
  7508.                 this.onMetaDataItem = true;
  7509.                 // Remember corresponding element.
  7510.                 this.link = elem;
  7511.                 this.onMailtoLink = this.isLinkType( "mailto:", this.link );
  7512.                 // Remember if it is saveable.
  7513.                 this.onSaveableLink = this.isLinkSaveable( this.link );
  7514.             }
  7515.  
  7516.             // Text input?
  7517.             if ( !this.onTextInput ) {
  7518.                 // Clicked on a link.
  7519.                 this.onTextInput = this.isTargetATextBox(elem);
  7520.             }
  7521.  
  7522.             // Metadata item?
  7523.             if ( !this.onMetaDataItem ) {
  7524.                 // We currently display metadata on anything which fits
  7525.                 // the below test.
  7526.                     if ( ( elem instanceof HTMLQuoteElement && elem.cite)    ||
  7527.                          ( elem instanceof HTMLTableElement && elem.summary) ||
  7528.                          ( elem instanceof HTMLModElement &&
  7529.                              ( elem.cite || elem.dateTime ) )                ||
  7530.                          ( elem instanceof HTMLElement &&
  7531.                              ( elem.title || elem.lang ) ) ) {
  7532.                         this.onMetaDataItem = true;
  7533.                 }
  7534.             }
  7535.  
  7536.             // Background image?  Don't bother if we've already found a
  7537.             // background image further down the hierarchy.  Otherwise,
  7538.             // we look for the computed background-image style.
  7539.             if ( !this.hasBGImage ) {
  7540.                 var bgImgUrl = this.getComputedURL( elem, "background-image" );
  7541.                 if ( bgImgUrl ) {
  7542.                     this.hasBGImage = true;
  7543.                     this.bgImageURL = makeURLAbsolute( elem.baseURI,
  7544.                     bgImgUrl );
  7545.                 }
  7546.             }
  7547.         }
  7548.         elem = elem.parentNode;
  7549.     }
  7550. },
  7551. // Returns the computed style attribute for the given element.
  7552. getComputedStyle: function( elem, prop ) {
  7553.     return elem.ownerDocument.defaultView.getComputedStyle( elem, '' ).getPropertyValue( prop );
  7554. },
  7555. // Returns a "url"-type computed style attribute value, with the url() stripped.
  7556. getComputedURL: function( elem, prop ) {
  7557.     var url = elem.ownerDocument.defaultView.getComputedStyle( elem, '' ).getPropertyCSSValue( prop );
  7558.     return ( url.primitiveType == CSSPrimitiveValue.CSS_URI ) ? url.getStringValue() : null;
  7559. },
  7560. // Returns true iff clicked on link is saveable.
  7561. isLinkSaveable : function ( link ) {
  7562.     // We don't do the Right Thing for news/snews yet, so turn them off
  7563.     // until we do.
  7564.     return !(this.isLinkType( "mailto:" , link )     ||
  7565.     this.isLinkType( "javascript:" , link ) ||
  7566.     this.isLinkType( "news:", link )        ||
  7567.     this.isLinkType( "snews:", link ) );
  7568. },
  7569. // Returns true iff clicked on link is of type given.
  7570. isLinkType : function ( linktype, link ) {
  7571.     try {
  7572.         // Test for missing protocol property.
  7573.         if ( !link.protocol ) {
  7574.             // We must resort to testing the URL string :-(.
  7575.             var protocol;
  7576.             var wrapper = new XPCNativeWrapper(link, "href",
  7577.             "getAttributeNS()");
  7578.             if (wrapper.href) {
  7579.                 protocol = wrapper.href.substr(0, linktype.length);
  7580.             } else {
  7581.                 protocol = wrapper.getAttributeNS("http://www.w3.org/1999/xlink","href");
  7582.                 if (protocol) {
  7583.                     protocol = protocol.substr(0, linktype.length);
  7584.                 }
  7585.             }
  7586.             return protocol.toLowerCase() === linktype;
  7587.         } else {
  7588.             // Presume all but javascript: urls are saveable.
  7589.             return link.protocol.toLowerCase() === linktype;
  7590.         }
  7591.     } catch (e) {
  7592.         // something was wrong with the link,
  7593.         // so we won't be able to save it anyway
  7594.         return false;
  7595.     }
  7596. },
  7597. // Open linked-to URL in a new window.
  7598. openLink : function () {
  7599.     // Determine linked-to URL.
  7600.     openNewWindowWith(this.linkURL(), this.link, true);
  7601. },
  7602. // Open linked-to URL in a new tab.
  7603. openLinkInTab : function () {
  7604.     // Determine linked-to URL.
  7605.     openNewTabWith(this.linkURL(), this.link, null, true);
  7606. },
  7607. // Open frame in a new tab.
  7608. openFrameInTab : function () {
  7609.     // Determine linked-to URL.
  7610.     openNewTabWith(this.target.ownerDocument.location.href, null, null, true);
  7611. },
  7612. // Reload clicked-in frame.
  7613. reloadFrame : function () {
  7614.     this.target.ownerDocument.location.reload();
  7615. },
  7616. // Open clicked-in frame in its own window.
  7617. openFrame : function () {
  7618.     openNewWindowWith(this.target.ownerDocument.location.href, null, true);
  7619. },
  7620. // Open clicked-in frame in the same window
  7621. showOnlyThisFrame : function () {
  7622.     try {
  7623.       const secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
  7624.                      .getService(Components.interfaces.nsIScriptSecurityManager);
  7625.       const nsIScriptSecMan = Components.interfaces.nsIScriptSecurityManager;
  7626.       secMan.checkLoadURIStr(gBrowser.currentURI.spec, this.target.ownerDocument.location.href,
  7627.                           nsIScriptSecMan.DISALLOW_SCRIPT);
  7628.       window.loadURI(this.target.ownerDocument.location.href, null, null);
  7629.     } catch(e) {}
  7630. },
  7631. // View Partial Source
  7632. viewPartialSource : function ( context ) {
  7633.     var focusedWindow = document.commandDispatcher.focusedWindow;
  7634.     if (focusedWindow == window)
  7635.     focusedWindow = _content;
  7636.     var docCharset = null;
  7637.     if (focusedWindow)
  7638.     docCharset = "charset=" + focusedWindow.document.characterSet;
  7639.  
  7640.         // "View Selection Source" and others such as "View MathML Source"
  7641.         // are mutually exclusive, with the precedence given to the selection
  7642.         // when there is one
  7643.         var reference = null;
  7644.         if (context == "selection")
  7645.           reference = focusedWindow.getSelection();
  7646.         else if (context == "mathml")
  7647.           reference = this.target;
  7648.         else
  7649.           throw "not reached";
  7650.  
  7651.     var docUrl = null; // unused (and play nice for fragments generated via XSLT too)
  7652.     window.openDialog("chrome://global/content/viewPartialSource.xul",
  7653.     "_blank", "scrollbars,resizable,chrome,dialog=no",
  7654.     docUrl, docCharset, reference, context);
  7655. },
  7656. // Open new "view source" window with the frame's URL.
  7657. viewFrameSource : function () {
  7658.     BrowserViewSourceOfDocument(this.target.ownerDocument);
  7659. },
  7660. viewInfo : function () {
  7661.     BrowserPageInfo();
  7662. },
  7663. viewFrameInfo : function () {
  7664.     BrowserPageInfo(this.target.ownerDocument);
  7665. },
  7666. // Change current window to the URL of the image.
  7667. viewImage : function (e) {
  7668.   urlSecurityCheck( this.imageURL, document );        // MERC - moz sec bug fix - lvinkle
  7669.   try {
  7670.     if (this.docURL != gBrowser.currentURI) {
  7671.       const secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
  7672.                      .getService(Components.interfaces.nsIScriptSecurityManager);
  7673.       const nsIScriptSecMan = Components.interfaces.nsIScriptSecurityManager;
  7674.       secMan.checkLoadURIStr(gBrowser.currentURI.spec, this.imageURL,
  7675.                              nsIScriptSecMan.DISALLOW_SCRIPT);
  7676.     }
  7677.     openUILink( this.imageURL, e );
  7678.   } catch(e) {}
  7679. },
  7680. // Change current window to the URL of the background image.
  7681. viewBGImage : function (e) {
  7682.   urlSecurityCheck( this.bgImageURL, document );
  7683.   try {
  7684.     if (this.docURL != gBrowser.currentURI) {
  7685.       const secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
  7686.                      .getService(Components.interfaces.nsIScriptSecurityManager);
  7687.       const nsIScriptSecMan = Components.interfaces.nsIScriptSecurityManager;
  7688.       secMan.checkLoadURIStr(gBrowser.currentURI.spec, this.bgImageURL,
  7689.                           nsIScriptSecMan.DISALLOW_SCRIPT);
  7690.     }
  7691.     openUILink( this.bgImageURL, e );
  7692.   } catch(e) {}
  7693. },
  7694. setWallpaper: function() {
  7695.     // Confirm since it's annoying if you hit this accidentally.
  7696.     openDialog("chrome://browser/content/setWallpaper.xul", "",
  7697.     "centerscreen,chrome,dialog,modal,dependent",
  7698.     this.target);
  7699. },
  7700. // Save URL of clicked-on frame.
  7701. saveFrame : function () {
  7702.     saveDocument( this.target.ownerDocument );
  7703. },
  7704. // Save URL of clicked-on link.
  7705. saveLink : function () {
  7706.     saveURL( this.linkURL(), this.linkText(), null, true, false );
  7707. },
  7708. sendLink : function () {
  7709.     MailIntegration.sendMessage( this.linkURL(), "" ); // we don't know the title of the link so pass in an empty string
  7710. },
  7711. // Save URL of clicked-on image.
  7712. saveImage : function () {
  7713.     saveURL( this.imageURL, null, "SaveImageTitle", false );
  7714. },
  7715. sendImage : function () {
  7716.     MailIntegration.sendMessage(this.imageURL, "");
  7717. },
  7718. toggleImageBlocking : function (aBlock) {
  7719.     var nsIPermissionManager = Components.interfaces.nsIPermissionManager;
  7720.     var permissionmanager =
  7721.     Components.classes["@mozilla.org/permissionmanager;1"]
  7722.     .getService(nsIPermissionManager);
  7723.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  7724.     .createInstance(Components.interfaces.nsIURI);
  7725.     uri.spec = this.imageURL;
  7726.     permissionmanager.add(uri, "image",
  7727.     aBlock ? nsIPermissionManager.DENY_ACTION : nsIPermissionManager.ALLOW_ACTION);
  7728. },
  7729. isImageBlocked : function() {
  7730.     var nsIPermissionManager = Components.interfaces.nsIPermissionManager;
  7731.     var permissionmanager =
  7732.     Components.classes["@mozilla.org/permissionmanager;1"]
  7733.     .getService(Components.interfaces.nsIPermissionManager);
  7734.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  7735.     .createInstance(Components.interfaces.nsIURI);
  7736.     uri.spec = this.imageURL;
  7737.     return permissionmanager.testPermission(uri, "image") == nsIPermissionManager.DENY_ACTION;
  7738. },
  7739. // Generate email address and put it on clipboard.
  7740. copyEmail : function () {
  7741.     // Copy the comma-separated list of email addresses only.
  7742.     // There are other ways of embedding email addresses in a mailto:
  7743.     // link, but such complex parsing is beyond us.
  7744.     var url = this.linkURL();
  7745.     var qmark = url.indexOf( "?" );
  7746.     var addresses;
  7747.  
  7748.     if ( qmark > 7 ) {                   // 7 == length of "mailto:"
  7749.         addresses = url.substring( 7, qmark );
  7750.     } else {
  7751.         addresses = url.substr( 7 );
  7752.     }
  7753.  
  7754.     // Let's try to unescape it using a character set
  7755.     // in case the address is not ASCII.
  7756.     try {
  7757.         var characterSet = Components.lookupMethod(this.target.ownerDocument, "characterSet")
  7758.         .call(this.target.ownerDocument);
  7759.         const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
  7760.         .getService(Components.interfaces.nsITextToSubURI);
  7761.         addresses = textToSubURI.unEscapeNonAsciiURI(characterSet, addresses);
  7762.     }
  7763.     catch(ex) {
  7764.         // Do nothing.
  7765.     }
  7766.  
  7767.     var clipboard = this.getService( "@mozilla.org/widget/clipboardhelper;1",
  7768.     Components.interfaces.nsIClipboardHelper );
  7769.     clipboard.copyString(addresses);
  7770. },
  7771. addBookmark : function() {
  7772.     var docshell = document.getElementById( "content" ).webNavigation;
  7773.     BookmarksUtils.addBookmark( docshell.currentURI.spec,
  7774.     docshell.document.title,
  7775.     docshell.document.charset);
  7776. },
  7777. addBookmarkForFrame : function() {
  7778.     var doc = this.target.ownerDocument;
  7779.     var uri = doc.location.href;
  7780.     var title = doc.title;
  7781.     if ( !title )
  7782.     title = uri;
  7783.     BookmarksUtils.addBookmark(uri, title, doc.charset);
  7784. },
  7785. // Open Metadata window for node
  7786. showMetadata : function () {
  7787.     window.openDialog(  "chrome://browser/content/metaData.xul",
  7788.     "_blank",
  7789.     "scrollbars,resizable,chrome,dialog=no",
  7790.     this.target);
  7791. },
  7792.  
  7793. ///////////////
  7794. // Utilities //
  7795. ///////////////
  7796.  
  7797. // Create instance of component given contractId and iid (as string).
  7798. createInstance : function ( contractId, iidName ) {
  7799.     var iid = Components.interfaces[ iidName ];
  7800.     return Components.classes[ contractId ].createInstance( iid );
  7801. },
  7802. // Get service given contractId and iid (as string).
  7803. getService : function ( contractId, iidName ) {
  7804.     var iid = Components.interfaces[ iidName ];
  7805.     return Components.classes[ contractId ].getService( iid );
  7806. },
  7807. // Show/hide one item (specified via name or the item element itself).
  7808. showItem : function ( itemOrId, show ) {
  7809.     var item = itemOrId.constructor == String ? document.getElementById(itemOrId) : itemOrId;
  7810.     if (item)
  7811.     item.hidden = !show;
  7812. },
  7813. // Set given attribute of specified context-menu item.  If the
  7814. // value is null, then it removes the attribute (which works
  7815. // nicely for the disabled attribute).
  7816. setItemAttr : function ( id, attr, val ) {
  7817.     var elem = document.getElementById( id );
  7818.     if ( elem ) {
  7819.         if ( val == null ) {
  7820.             // null indicates attr should be removed.
  7821.             elem.removeAttribute( attr );
  7822.         } else {
  7823.             // Set attr=val.
  7824.             elem.setAttribute( attr, val );
  7825.         }
  7826.     }
  7827. },
  7828. // Set context menu attribute according to like attribute of another node
  7829. // (such as a broadcaster).
  7830. setItemAttrFromNode : function ( item_id, attr, other_id ) {
  7831.     var elem = document.getElementById( other_id );
  7832.     if ( elem && elem.getAttribute( attr ) == "true" ) {
  7833.         this.setItemAttr( item_id, attr, "true" );
  7834.     } else {
  7835.         this.setItemAttr( item_id, attr, null );
  7836.     }
  7837. },
  7838. // Temporary workaround for DOM api not yet implemented by XUL nodes.
  7839. cloneNode : function ( item ) {
  7840.     // Create another element like the one we're cloning.
  7841.     var node = document.createElement( item.tagName );
  7842.  
  7843.     // Copy attributes from argument item to the new one.
  7844.     var attrs = item.attributes;
  7845.     for ( var i = 0; i < attrs.length; i++ ) {
  7846.         var attr = attrs.item( i );
  7847.         node.setAttribute( attr.nodeName, attr.nodeValue );
  7848.     }
  7849.  
  7850.     // Voila!
  7851.     return node;
  7852. },
  7853. // Generate fully-qualified URL for clicked-on link.
  7854. linkURL : function () {
  7855.     var wrapper = new XPCNativeWrapper(this.link, "href", "baseURI",
  7856.     "getAttributeNS()");
  7857.     if (wrapper.href) {
  7858.         return wrapper.href;
  7859.     }
  7860.     var href = wrapper.getAttributeNS("http://www.w3.org/1999/xlink",
  7861.     "href");
  7862.     if (!href || !href.match(/\S/)) {
  7863.         throw "Empty href"; // Without this we try to save as the current doc, for example, HTML case also throws if empty
  7864.     }
  7865.     href = makeURLAbsolute(wrapper.baseURI, href);
  7866.     return href;
  7867. },
  7868. // Get text of link.
  7869. linkText : function () {
  7870.     var text = gatherTextUnder( this.link );
  7871.     if (!text || !text.match(/\S/)) {
  7872.         text = this.link.getAttribute("title");
  7873.         if (!text || !text.match(/\S/)) {
  7874.             text = this.link.getAttribute("alt");
  7875.             if (!text || !text.match(/\S/)) {
  7876.                 var wrapper = new XPCNativeWrapper(this.link, "href", "baseURI",
  7877.                 "getAttributeNS()");
  7878.  
  7879.                 if (wrapper.href) {
  7880.                     text = wrapper.href;
  7881.                 } else {
  7882.                     text = wrapper.getAttributeNS("http://www.w3.org/1999/xlink",
  7883.                     "href");
  7884.                     if (text && text.match(/\S/)) {
  7885.                         text = makeURLAbsolute(wrapper.baseURI, text);
  7886.                     }
  7887.                 }
  7888.             }
  7889.         }
  7890.     }
  7891.  
  7892.     return text;
  7893. },
  7894.  
  7895. //Get selected object and convert it to a string to get
  7896. //selected text.   Only use the first 15 chars.
  7897. isTextSelection : function() {
  7898.     var result = false;
  7899.     var selection = this.searchSelected(16);
  7900.  
  7901.     var searchSelectText;
  7902.     if (selection) {
  7903.         searchSelectText = selection.toString();
  7904.  
  7905.         if (searchSelectText.length > 15)
  7906.         searchSelectText = searchSelectText.substr(0,15) + "...";
  7907.         result = true;
  7908.  
  7909.         // format "Search for <selection>" string to show in menu
  7910.         var emptyStr = "";        // needed since the 'searchText' resource string now takes 2 params
  7911.         searchSelectText = gNavigatorBundle.getFormattedString("searchText", [emptyStr, searchSelectText]);
  7912.  
  7913.         this.setItemAttr("context-searchselect", "label", searchSelectText);
  7914.     }
  7915.     return result;
  7916. },
  7917.  
  7918. searchSelected : function( charlen ) {
  7919.     var focusedWindow = document.commandDispatcher.focusedWindow;
  7920.         var searchStr = focusedWindow.getSelection();
  7921.     searchStr = searchStr.toString();
  7922.  
  7923.     // searching for more than 150 chars makes no sense
  7924.     if (!charlen)
  7925.     charlen = 150;
  7926.     if (charlen < searchStr.length) {
  7927.         // only use the first charlen important chars. see bug 221361
  7928.         var pattern = new RegExp("^(?:\\s*.){0," + charlen + "}");
  7929.         pattern.test(searchStr);
  7930.         searchStr = RegExp.lastMatch;
  7931.     }
  7932.     searchStr = searchStr.replace(/\s*(.*?)\s*$/, "$1");
  7933.     searchStr = searchStr.replace(/\s+/g, " ");
  7934.     return searchStr;
  7935. },
  7936.  
  7937. // Determine if target <object> is an image.
  7938. objectIsImage : function ( objElem ) {
  7939.     var result = false;
  7940.     // Get type and data attributes.
  7941.     var type = objElem.getAttribute( "type" );
  7942.     var data = objElem.getAttribute( "data" );
  7943.     // Presume any mime type of the form "image/..." is an image.
  7944.     // There must be a data= attribute with an URL, also.
  7945.     if ( type.substring( 0, 6 ) == "image/" && data) {
  7946.         result = true;
  7947.     }
  7948.     return result;
  7949. },
  7950. // Extract image URL from <object> tag.
  7951. objectImageURL : function ( objElem ) {
  7952.     // Extract url from data= attribute.
  7953.     var data = objElem.getAttribute( "data" );
  7954.     // Make it absolute.
  7955.     return makeURLAbsolute( objElem.baseURI, data );
  7956. },
  7957. // Parse coords= attribute and return array.
  7958. parseCoords : function ( area ) {
  7959.     return [];
  7960. },
  7961. toString : function () {
  7962.     return "contextMenu.target     = " + this.target + "\n" +
  7963.     "contextMenu.onImage    = " + this.onImage + "\n" +
  7964.     "contextMenu.onLink     = " + this.onLink + "\n" +
  7965.     "contextMenu.link       = " + this.link + "\n" +
  7966.     "contextMenu.inFrame    = " + this.inFrame + "\n" +
  7967.     "contextMenu.hasBGImage = " + this.hasBGImage + "\n";
  7968. },
  7969. isTargetATextBox : function ( node )
  7970. {
  7971.       if (node instanceof HTMLInputElement)
  7972.         return (node.type == "text" || node.type == "password")
  7973.  
  7974.       return (node instanceof HTMLTextAreaElement);
  7975. },
  7976. isTargetAKeywordField : function ( node )
  7977. {
  7978.     var form = node.form;
  7979.     if (!form)
  7980.     return false;
  7981.     var method = form.method.toUpperCase();
  7982.  
  7983.     // These are the following types of forms we can create keywords for:
  7984.     //
  7985.     // method   encoding type       can create keyword
  7986.     // GET      *                                 YES
  7987.     //          *                                 YES
  7988.     // POST                                       YES
  7989.     // POST     application/x-www-form-urlencoded YES
  7990.     // POST     text/plain                        NO (a little tricky to do)
  7991.     // POST     multipart/form-data               NO
  7992.     // POST     everything else                   YES
  7993.     return (method == "GET" || method == "") ||
  7994.     (form.enctype != "text/plain") && (form.enctype != "multipart/form-data");
  7995. },
  7996.  
  7997. // Determines whether or not the separator with the specified ID should be
  7998. // shown or not by determining if there are any non-hidden items between it
  7999. // and the previous separator.
  8000. shouldShowSeparator : function ( aSeparatorID )
  8001. {
  8002.     var separator = document.getElementById(aSeparatorID);
  8003.     if (separator) {
  8004.         var sibling = separator.previousSibling;
  8005.         while (sibling && sibling.localName != "menuseparator") {
  8006.             if (sibling.getAttribute("hidden") != "true")
  8007.             return true;
  8008.             sibling = sibling.previousSibling;
  8009.         }
  8010.     }
  8011.     return false;
  8012. }
  8013. }
  8014.  
  8015. var gWebPanelURI;
  8016. function openWebPanel(aTitle, aURI)
  8017. {
  8018.     // Ensure that the web panels sidebar is open.
  8019.     toggleSidebar('viewWebPanelsSidebar', true);
  8020.  
  8021.     // Set the title of the panel.
  8022.     document.getElementById("sidebar-title").value = aTitle;
  8023.  
  8024.     // Tell the Web Panels sidebar to load the bookmark.
  8025.     var sidebar = document.getElementById("sidebar");
  8026.     if (sidebar.contentDocument && sidebar.contentDocument.getElementById('web-panels-browser')) {
  8027.         sidebar.contentWindow.loadWebPanel(aURI);
  8028.         if (gWebPanelURI) {
  8029.             gWebPanelURI = "";
  8030.             sidebar.removeEventListener("load", asyncOpenWebPanel, true);
  8031.         }
  8032.     }
  8033. else {
  8034.     // The panel is still being constructed.  Attach an onload handler.
  8035.     if (!gWebPanelURI)
  8036.     sidebar.addEventListener("load", asyncOpenWebPanel, true);
  8037.     gWebPanelURI = aURI;
  8038. }
  8039. }
  8040.  
  8041. function asyncOpenWebPanel(event)
  8042. {
  8043.     var sidebar = document.getElementById("sidebar");
  8044.     if (gWebPanelURI && sidebar.contentDocument && sidebar.contentDocument.getElementById('web-panels-browser'))
  8045.     sidebar.contentWindow.loadWebPanel(gWebPanelURI);
  8046.     gWebPanelURI = "";
  8047.     sidebar.removeEventListener("load", asyncOpenWebPanel, true);
  8048. }
  8049.  
  8050. /*
  8051. * - [ Dependencies ] ---------------------------------------------------------
  8052. *  utilityOverlay.js:
  8053. *    - gatherTextUnder
  8054. */
  8055.  
  8056. // MERC JVL
  8057. // retrieve the selected text on the page
  8058. // NOTE: Copy of searchSelected()
  8059. function GetSelectedText( charlen ) {
  8060.     var focusedWindow = document.commandDispatcher.focusedWindow;
  8061.     var searchStr = focusedWindow.getSelection();
  8062.     searchStr = searchStr.toString();
  8063.  
  8064.     // searching for more than 150 chars makes no sense
  8065.     if (!charlen)
  8066.         charlen = 150;
  8067.     if (charlen < searchStr.length) {
  8068.         // only use the first charlen important chars. see bug 221361
  8069.         var pattern = new RegExp("^(?:\\s*.){0," + charlen + "}");
  8070.         pattern.test(searchStr);
  8071.         searchStr = RegExp.lastMatch;
  8072.     }
  8073.     searchStr = searchStr.replace(/\s+/g, " ");
  8074.     searchStr = searchStr.replace(/\s*(.*?)\s*$/, "$1");
  8075.     return searchStr;
  8076. }
  8077.  
  8078. // MERC JVL
  8079. // Print selected text
  8080. function scPrintSelected()
  8081. {
  8082.     var printSetInterface = Components.interfaces.nsIPrintSettings;
  8083.     var bSelect = new Object();
  8084.     bSelect.value = false;
  8085.     var settings = PrintUtils.getPrintSettings();
  8086.     if (settings)
  8087.     {
  8088.         settings.GetPrintOptions(printSetInterface.kSelectSelectionRB, bSelect);    // remember the old setting so we can set it back
  8089.         settings.SetPrintOptions(printSetInterface.kSelectSelectionRB, true);
  8090.     }
  8091.  
  8092.     PrintUtils.print();
  8093.  
  8094.     if (settings)
  8095.     {
  8096.         //alert(bSelect.value);
  8097.         settings.SetPrintOptions(printSetInterface.kSelectSelectionRB, bSelect.value);
  8098.     }
  8099. }
  8100.  
  8101. // MERC JVL
  8102. // Search for selected text
  8103. function scSearchSelected()
  8104. {
  8105.     OpenSearch('internet', GetSelectedText(), true);
  8106. }
  8107.  
  8108. // MERC JVL
  8109. // Define selected text
  8110. function scDefineSelected(defineText)
  8111. {
  8112.     if (!defineText)
  8113.         defineText = GetSelectedText();
  8114.     
  8115.     // Only send the define text up to the first 10 words
  8116.     var arSelectedText = defineText.split(/\s/);
  8117.     var newDefineText = "";
  8118.     for (index = 0; index < 10; index++)
  8119.     {
  8120.         if (arSelectedText.length > index)
  8121.         {
  8122.             newDefineText += arSelectedText[index];
  8123.             if (index < 9)
  8124.             {
  8125.                 newDefineText += " ";
  8126.             }
  8127.         }
  8128.     }
  8129.     
  8130.     newDefineText = gPrefService.getCharPref("highlight.contextmenu.defineURL") + newDefineText;
  8131.     loadURIWithOpenPref(newDefineText, "browser.tabs.searchbarresult.open", null, null);
  8132. }
  8133.  
  8134. // MERC JVL
  8135. // Open Advanced Options dialog
  8136. function scOptionsSelected()
  8137. {
  8138.     openPrefs(PREF_ADVANCED);
  8139. }
  8140.  
  8141. // MERC JVL
  8142. // Copy the selected text to the Windows Clipboard
  8143. function scCopySelected()
  8144. {
  8145.         // Note: using GetSelectedText() returns ~150 characters which is only good enough for searching
  8146.         var focusedWindow = document.commandDispatcher.focusedWindow;
  8147.         var selStr = focusedWindow.getSelection();
  8148.         selStr = selStr.toString();
  8149.         CopyToClipboard(selStr);
  8150. }
  8151.  
  8152. // MERC JVL
  8153. // Copy the text to the clipboard, handles Unicode strings
  8154. // See http://www.xulplanet.com/tutorials/xultu/clipboard.html
  8155. function CopyToClipboard(copytext)
  8156. {
  8157.     if (!copytext || copytext.length < 1)
  8158.         return false;
  8159.  
  8160.     var str = Components.classes["@mozilla.org/supports-string;1"]
  8161.                         .createInstance(Components.interfaces.nsISupportsString);
  8162.     if (!str)
  8163.         return false;
  8164.  
  8165.     str.data = copytext;
  8166.  
  8167.     var trans = Components.classes["@mozilla.org/widget/transferable;1"]
  8168.                             .createInstance(Components.interfaces.nsITransferable);
  8169.     if (!trans)
  8170.         return false;
  8171.  
  8172.     trans.addDataFlavor("text/unicode");
  8173.     trans.setTransferData("text/unicode", str, copytext.length * 2);
  8174.  
  8175.     var clipid = Components.interfaces.nsIClipboard;
  8176.     var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid);
  8177.     if (!clip)
  8178.         return false;
  8179.  
  8180.     clip.setData(trans,null,clipid.kGlobalClipboard);
  8181.     return true;
  8182. }
  8183.  
  8184. // MERC JVL
  8185. // Retrieve the search engine icon path from the search engine rdf
  8186. function GetSearchEngineIconPath(engineName)
  8187. {
  8188.     if (engineName.length > 0)
  8189.     {
  8190.         //Merc - TO
  8191.         //Copernic icon is in it's own special location
  8192.         if(engineName == "DesktopSearch") {
  8193.             var icon = "chrome://browser/skin/search/copernic.png";
  8194.             return icon;
  8195.         }
  8196.         else {
  8197.             var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  8198.                                 .getService(Components.interfaces.nsIRDFService);
  8199.             var ds = rdf.GetDataSource("rdf:internetsearch");
  8200.             var kNC_Root = rdf.GetResource("NC:SearchEngineRoot");
  8201.             var kNC_child = rdf.GetResource("http://home.netscape.com/NC-rdf#child");
  8202.             var kNC_Name = rdf.GetResource("http://home.netscape.com/NC-rdf#Name");
  8203.             var kNC_Icon = rdf.GetResource("http://home.netscape.com/NC-rdf#Icon");
  8204.             var arcs = ds.GetTargets(kNC_Root, kNC_child, true);
  8205.  
  8206.             while (arcs.hasMoreElements())
  8207.             {
  8208.                 var engine = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  8209.                 var name = ds.GetTarget(engine, kNC_Name,true)
  8210.                                 .QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  8211.                 if (name == engineName)
  8212.                 {
  8213.                     var icon = ds.GetTarget(engine, kNC_Icon,true)
  8214.                                     .QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  8215.                     return icon;
  8216.                 }
  8217.             }
  8218.         }
  8219.     }
  8220.  
  8221.     return "";
  8222. }
  8223.  
  8224. // MERC JVL
  8225. // Show the context menu popup for copy selected text to clipboard feature
  8226. function ShowSelectToClipboardMenu(eventTarget, eventClientX, eventClientY)
  8227. {
  8228.     // display a special context menu if the user has selected text (left mouse button only)
  8229.     var newSelection = GetSelectedText();
  8230.     if (newSelection.length > 0 &&
  8231.         gPrefService.getPrefType("highlight.contextmenu.enabled") &&
  8232.         gPrefService.getBoolPref("highlight.contextmenu.enabled")) {
  8233.  
  8234.         var newSelectionText = newSelection;        // make a copy to display to the user
  8235.         var idx = newSelectionText.indexOf(" ");    // check if only one word was selected
  8236.         
  8237.         // if only one word was selected, use the selected text in its entirety,
  8238.         // otherwise, only display a portion of the search string
  8239.         if (idx > -1 && newSelectionText.length > TEXTSEARCH_LENGTH)
  8240.             newSelectionText = newSelectionText.substr(0, TEXTSEARCH_LENGTH) + "...";
  8241.  
  8242.         // get the search menu element
  8243.         var searchElement = document.getElementById('selectToClipboard-search');
  8244.         if (searchElement)
  8245.         {
  8246.             // format "Search <engine> for <selection>" string to show in menu
  8247.             var engineName = gPrefService.getCharPref("browser.search.selectedEngine");
  8248.             var searchSelectText = gNavigatorBundle.getFormattedString("searchText", [engineName, newSelectionText]);
  8249.             searchElement.setAttribute('label', searchSelectText);
  8250.  
  8251.             // add the search engine icon to the menu option
  8252.             searchElement.setAttribute('image', GetSearchEngineIconPath(engineName));
  8253.         }
  8254.  
  8255.         // get the define menu element
  8256.         var defineElement = document.getElementById('selectToClipboard-define');
  8257.         if (defineElement)
  8258.         {
  8259.             // format "Define <selection>" string to show in menu
  8260.             var defineSelectText = gNavigatorBundle.getFormattedString("defineText", [newSelectionText]);
  8261.             defineElement.setAttribute('label', defineSelectText);
  8262.  
  8263.             // hide the "Define <selection>" menu if the user selected more than one word of text
  8264.             // Always show define...
  8265.             //defineElement.hidden = idx > -1;
  8266.         }
  8267.  
  8268.         // NOTE: need to explicitly set the the event.target to the relative node as per the
  8269.         // notes at the bottom of http://www.xulplanet.com/references/elemref/ref_popup.html
  8270.         document.popupNode = eventTarget;
  8271.  
  8272.         // show context menu
  8273.         var cmd = "document.getElementById('leftClickContextMenu').showPopup(document.getElementById('content'), ";
  8274.         cmd += eventClientX;
  8275.         cmd += ", ";
  8276.         cmd += eventClientY;
  8277.         cmd += ");";
  8278.         //alert(cmd);
  8279.         setTimeout(cmd);
  8280.     }
  8281.     gPrevSelectedTextForContextMenu = "";
  8282.     gContextMenuTimeoutId = -1;
  8283. }
  8284.  
  8285. // MERC JVL
  8286. // On mouse down event
  8287. // Return true to bubble up the chain
  8288. function onMouseDown(event) {
  8289.     if (event.button == 0)    // left button down
  8290.         gPrevSelectedTextForContextMenu = GetSelectedText();
  8291.     return true;
  8292. }
  8293.  
  8294. // MERC JVL
  8295. // On mouse up event
  8296. // Return true to bubble up the chain
  8297. function onMouseUp(event) {
  8298.     if (event.button == 0)    // left button down
  8299.     {
  8300.         // display a special context menu if the user has selected text (left mouse button only)
  8301.         var newSelection = GetSelectedText();
  8302.         if (newSelection.length > 0 &&
  8303.             newSelection != gPrevSelectedTextForContextMenu)
  8304.         {
  8305.             if (gContextMenuTimeoutId > -1)
  8306.                 clearTimeout(gContextMenuTimeoutId);
  8307.             gContextMenuTimeoutId = setTimeout(ShowSelectToClipboardMenu,
  8308.                                                CONTEXTMENU_TIMEOUT,
  8309.                                                event.target,
  8310.                                                event.clientX,
  8311.                                                event.clientY);
  8312.         }
  8313.     }
  8314.  
  8315.     return true;
  8316. }
  8317.  
  8318. // Called whenever the user clicks in the content area,
  8319. // except when left-clicking on links (special case)
  8320. // should always return true for click to go through
  8321. function contentAreaClick(event, fieldNormalClicks)
  8322. {
  8323.     if (!event.isTrusted) {
  8324.         return true;
  8325.     }
  8326.  
  8327.     var target = event.target;
  8328.     var linkNode;
  8329.  
  8330.    if (target instanceof HTMLAnchorElement ||
  8331.        target instanceof HTMLAreaElement ||
  8332.        target instanceof HTMLLinkElement) {
  8333.      if (target.hasAttribute("href")) {
  8334.        linkNode = target;
  8335.       }
  8336.    }
  8337.    else {
  8338.      linkNode = event.originalTarget;
  8339.      while (linkNode && !(linkNode instanceof HTMLAnchorElement))
  8340.        linkNode = linkNode.parentNode;
  8341.         // <a> cannot be nested.  So if we find an anchor without an
  8342.         // href, there is no useful <a> around the target
  8343.         if (linkNode && !linkNode.hasAttribute("href"))
  8344.         linkNode = null;
  8345.     }
  8346.     if (linkNode) {
  8347.              var wrapper = new XPCNativeWrapper(linkNode, "href", "getAttribute()", "ownerDocument");
  8348.         if (event.button == 0 && !event.ctrlKey && !event.shiftKey &&
  8349.         !event.altKey && !event.metaKey) {
  8350.             // A Web panel's links should target the main content area.  Do this
  8351.             // if no modifier keys are down and if there's no target or the target equals
  8352.             // _main (the IE convention) or _content (the Mozilla convention).
  8353.             // The only reason we field _main and _content here is for the markLinkVisited
  8354.             // hack.
  8355.                target = wrapper.getAttribute("target");
  8356.                var docWrapper = new XPCNativeWrapper(wrapper.ownerDocument, "location");
  8357.                var locWrapper = new XPCNativeWrapper(docWrapper.location, "href");
  8358.             if (fieldNormalClicks &&
  8359.             (!target || target == "_content" || target  == "_main"))
  8360.             // IE uses _main, SeaMonkey uses _content, we support both
  8361.                {
  8362.                  if (!wrapper.href)
  8363.                    return true;
  8364.                  if (wrapper.getAttribute("onclick"))
  8365.                    return true;
  8366.                  // javascript links should be executed in the current browser
  8367.                  if (wrapper.href.substr(0, 11) === "javascript:")
  8368.                    return true;
  8369.          // data links should be executed in the current browser
  8370.          if (wrapper.href.substr(0, 5) === "data:") {
  8371.            return true;
  8372.           }
  8373.                  if (!webPanelSecurityCheck(locWrapper.href, wrapper.href)) {
  8374.                    return false;
  8375.                  }
  8376.  
  8377.                 var postData = { };
  8378.                 var url = getShortcutOrURI(wrapper.href, postData);
  8379.                 if (!url)
  8380.                 return true;
  8381.                 markLinkVisited(wrapper.href, linkNode);
  8382.                 loadURI(url, null, postData.value);
  8383.                 event.preventDefault();
  8384.  
  8385.                 return false;
  8386.             }
  8387.         else if (linkNode.getAttribute("rel") == "sidebar") {
  8388.             // This is the Opera convention for a special link that - when clicked - allows
  8389.             // you to add a sidebar panel.  We support the Opera convention here.  The link's
  8390.             // title attribute contains the title that should be used for the sidebar panel.
  8391.             openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "",
  8392.             "centerscreen,chrome,dialog,resizable,dependent",
  8393.             wrapper.getAttribute("title"),
  8394.             wrapper.href, null, null, null, null, true);
  8395.             event.preventDefault();
  8396.             return false;
  8397.         }
  8398.     else if (target == "_search") {
  8399.         // Used in WinIE as a way of transiently loading pages in a sidebar.  We
  8400.         // mimic that WinIE functionality here and also load the page transiently.
  8401.  
  8402.              // javascript links targeting the sidebar shouldn't be allowed
  8403.              // we copied this from IE, and IE blocks this completely
  8404.              if (wrapper.href.substr(0, 11) === "javascript:")
  8405.                return false;
  8406.  
  8407.              // data: URIs are just as dangerous
  8408.              if (wrapper.href.substr(0, 5) === "data:")
  8409.                return false;
  8410.  
  8411.              if (!webPanelSecurityCheck(locWrapper.href, wrapper.href))
  8412.                return false;
  8413.  
  8414.         openWebPanel(gNavigatorBundle.getString("webPanels"), wrapper.href);
  8415.         event.preventDefault();
  8416.         return false;
  8417.     }
  8418. }
  8419. else {
  8420.     handleLinkClick(event, wrapper.href, linkNode);
  8421. }
  8422.  
  8423. return true;
  8424. } else {
  8425.     // Try simple XLink
  8426.     var href;
  8427.     linkNode = target;
  8428.     while (linkNode) {
  8429.         if (linkNode.nodeType == Node.ELEMENT_NODE) {
  8430.             var wrapper = new XPCNativeWrapper(linkNode, "getAttributeNS()");
  8431.  
  8432.             href = wrapper.getAttributeNS("http://www.w3.org/1999/xlink", "href");
  8433.             break;
  8434.         }
  8435.         linkNode = linkNode.parentNode;
  8436.     }
  8437.     if (href) {
  8438.         var baseURI = new XPCNativeWrapper(linkNode, "baseURI").baseURI;
  8439.         href = makeURLAbsolute(baseURI, href);
  8440.         handleLinkClick(event, href, null);
  8441.         return true;
  8442.     }
  8443. }
  8444. if (event.button == 1 &&
  8445.        !event.getPreventDefault() &&
  8446. gPrefService.getBoolPref("middlemouse.contentLoadURL")) {
  8447.     middleMousePaste(event);
  8448. }
  8449.  
  8450. return true;
  8451. }
  8452.  
  8453. function handleLinkClick(event, href, linkNode)
  8454. {
  8455.     switch (event.button) {
  8456.         case 0:
  8457.                 if (event.ctrlKey) {
  8458.                     openNewTabWith(href, linkNode, event, true);
  8459.                     event.preventBubble();
  8460.                     return true;
  8461.                 }
  8462.                 // if left button clicked
  8463.                 if (event.shiftKey) {
  8464.                     openNewWindowWith(href, linkNode, true);
  8465.                     event.preventBubble();
  8466.                     return true;
  8467.                 }
  8468.  
  8469.                 if (event.altKey) {
  8470.                     saveURL(href, linkNode ? gatherTextUnder(linkNode) : "", null, true, true);
  8471.                     return true;
  8472.                 }
  8473.  
  8474.                 return false;
  8475.                 case 1:                                                         // if middle button clicked
  8476.                 var tab;
  8477.                 try {
  8478.                     tab = gPrefService.getBoolPref("browser.tabs.opentabfor.middleclick")
  8479.                 }
  8480.                 catch(ex) {
  8481.                     tab = true;
  8482.                 }
  8483.                 if (tab)
  8484.                 openNewTabWith(href, linkNode, event, true);
  8485.             else
  8486.                 openNewWindowWith(href, linkNode, true);
  8487.                 event.preventBubble();
  8488.                 return true;
  8489.             }
  8490.             return false;
  8491.         }
  8492.  
  8493.         function middleMousePaste(event)
  8494.         {
  8495.             var url = readFromClipboard();
  8496.             if (!url)
  8497.     return;
  8498.   var postData = { };
  8499.   url = getShortcutOrURI(url, postData);
  8500.   if (!url)
  8501.     return;
  8502.  
  8503.   openUILink(url,
  8504.              event,
  8505.              true /* ignore the fact this is a middle click */);
  8506.  
  8507.   event.preventBubble();
  8508.             }
  8509.  
  8510.             function makeURLAbsolute( base, url )
  8511.             {
  8512.                 // Construct nsIURL.
  8513.                 var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  8514.                 .getService(Components.interfaces.nsIIOService);
  8515.                 var baseURI  = ioService.newURI(base, null, null);
  8516.  
  8517.                 return ioService.newURI(baseURI.resolve(url), null, null).spec;
  8518. }
  8519.  
  8520.             function saveFrameDocument()
  8521.             {
  8522.                 var focusedWindow = document.commandDispatcher.focusedWindow;
  8523.                 if (isContentFrame(focusedWindow))
  8524.                 saveDocument(focusedWindow.document);
  8525.             }
  8526.  
  8527.             /*
  8528.             * Note that most of this routine has been moved into C++ in order to
  8529.             * be available for all <browser> tags as well as gecko embedding. See
  8530.             * mozilla/content/base/src/nsContentAreaDragDrop.cpp.
  8531.             *
  8532.             * Do not add any new fuctionality here other than what is needed for
  8533.             * a standalone product.
  8534.             */
  8535.  
  8536.             var contentAreaDNDObserver = {
  8537.                 onDrop: function (aEvent, aXferData, aDragSession)
  8538.                 {
  8539.                     var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  8540.  
  8541.                     // valid urls don't contain spaces ' '; if we have a space it
  8542.                     // isn't a valid url, or if it's a javascript: or data: url,
  8543.                     // bail out
  8544.                     if (!url || !url.length || url.indexOf(" ", 0) != -1 ||
  8545.                     /^\s*(javascript|data):/.test(url))
  8546.                         return;
  8547.  
  8548.                     getBrowser().dragDropSecurityCheck(aEvent, aDragSession, url);
  8549.  
  8550.                     switch (document.firstChild.getAttribute('windowtype')) {
  8551.                         case "navigator:browser":
  8552.                         var postData = { };
  8553.                         var uri = getShortcutOrURI(url, postData);
  8554.                         loadURI(uri, null, postData.value);
  8555.                         break;
  8556.                         case "navigator:view-source":
  8557.                         viewSource(url);
  8558.                         break;
  8559.                     }
  8560.  
  8561.                     // keep the event from being handled by the dragDrop listeners
  8562.                     // built-in to gecko if they happen to be above us.
  8563.                     aEvent.preventDefault();
  8564.                 },
  8565.  
  8566.                 getSupportedFlavours: function ()
  8567.                 {
  8568.                     var flavourSet = new FlavourSet();
  8569.                     flavourSet.appendFlavour("text/x-moz-url");
  8570.                     flavourSet.appendFlavour("text/unicode");
  8571.                     flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  8572.                     return flavourSet;
  8573.                 }
  8574.  
  8575.             };
  8576.  
  8577.             // For extensions
  8578.             function getBrowser()
  8579.             {
  8580.                 if (!gBrowser)
  8581.                 gBrowser = document.getElementById("content");
  8582.                 return gBrowser;
  8583.             }
  8584.  
  8585.             function MultiplexHandler(event)
  8586.             { try {
  8587.                 var node = event.target;
  8588.                 var name = node.getAttribute('name');
  8589.  
  8590.                 if (name == 'detectorGroup') {
  8591.                     SetForcedDetector(true);
  8592.                     SelectDetector(event, false);
  8593.                 } else if (name == 'charsetGroup') {
  8594.                     var charset = node.getAttribute('id');
  8595.                     charset = charset.substring('charset.'.length, charset.length)
  8596.                     SetForcedCharset(charset);
  8597.                     SetDefaultCharacterSet(charset);
  8598.                 } else if (name == 'charsetCustomize') {
  8599.                     //do nothing - please remove this else statement, once the charset prefs moves to the pref window
  8600.                 } else {
  8601.                     SetForcedCharset(node.getAttribute('id'));
  8602.                     SetDefaultCharacterSet(node.getAttribute('id'));
  8603.                 }
  8604.             } catch(ex) { browserDebug ("Caught Exception: " + ex + "\n"); }
  8605.         }
  8606.  
  8607.         function SetDefaultCharacterSet(charset)
  8608.         {
  8609.             BrowserSetDefaultCharacterSet(charset);
  8610.         }
  8611.  
  8612.         function SelectDetector(event, doReload)
  8613.         {
  8614.             var uri =  event.target.getAttribute("id");
  8615.             var prefvalue = uri.substring('chardet.'.length, uri.length);
  8616.             if ("off" == prefvalue) { // "off" is special value to turn off the detectors
  8617.                 prefvalue = "";
  8618.             }
  8619.  
  8620.             try {
  8621.                 var pref = Components.classes["@mozilla.org/preferences-service;1"]
  8622.                 .getService(Components.interfaces.nsIPrefBranch);
  8623.                 var str =  Components.classes["@mozilla.org/supports-string;1"]
  8624.                 .createInstance(Components.interfaces.nsISupportsString);
  8625.  
  8626.                 str.data = prefvalue;
  8627.                 pref.setComplexValue("intl.charset.detector",
  8628.                 Components.interfaces.nsISupportsString, str);
  8629.                 if (doReload) window._content.location.reload();
  8630.             }
  8631.             catch (ex) {
  8632.                 browserDebug("Failed to set the intl.charset.detector preference.\n");
  8633.             }
  8634.         }
  8635.  
  8636.         function SetForcedDetector(doReload)
  8637.         {
  8638.             BrowserSetForcedDetector(doReload);
  8639.         }
  8640.  
  8641.         function SetForcedCharset(charset)
  8642.         {
  8643.             BrowserSetForcedCharacterSet(charset);
  8644.         }
  8645.  
  8646.         function BrowserSetDefaultCharacterSet(aCharset)
  8647.         {
  8648.             // no longer needed; set when setting Force; see bug 79608
  8649.         }
  8650.  
  8651.         function BrowserSetForcedCharacterSet(aCharset)
  8652.         {
  8653.             var docCharset = getBrowser().docShell.QueryInterface(
  8654.             Components.interfaces.nsIDocCharset);
  8655.             docCharset.charset = aCharset;
  8656.             BrowserReloadWithFlags(nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);
  8657.         }
  8658.  
  8659.         function BrowserSetForcedDetector(doReload)
  8660.         {
  8661.             getBrowser().documentCharsetInfo.forcedDetector = true;
  8662.             if (doReload)
  8663.             BrowserReloadWithFlags(nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);
  8664.         }
  8665.  
  8666.         function UpdateCurrentCharset()
  8667.         {
  8668.             var menuitem = null;
  8669.  
  8670.             // exctract the charset from DOM
  8671.             var wnd = document.commandDispatcher.focusedWindow;
  8672.             if ((window == wnd) || (wnd == null)) wnd = window._content;
  8673.             menuitem = document.getElementById('charset.' + wnd.document.characterSet);
  8674.  
  8675.             if (menuitem) {
  8676.                 // uncheck previously checked item to workaround Mac checkmark problem
  8677.                 // bug 98625
  8678.                 if (gPrevCharset) {
  8679.                     var pref_item = document.getElementById('charset.' + gPrevCharset);
  8680.                     if (pref_item)
  8681.                     pref_item.setAttribute('checked', 'false');
  8682.                 }
  8683.                 menuitem.setAttribute('checked', 'true');
  8684.             }
  8685.         }
  8686.  
  8687.         function UpdateCharsetDetector()
  8688.         {
  8689.             // showStack();
  8690.             var prefvalue;
  8691.  
  8692.             try {
  8693.                 var pref = Components.classes["@mozilla.org/preferences-service;1"]
  8694.                 .getService(Components.interfaces.nsIPrefBranch);
  8695.                 prefvalue = pref.getComplexValue("intl.charset.detector",
  8696.                 Components.interfaces.nsIPrefLocalizedString).data;
  8697.             }
  8698.             catch (ex) {
  8699.                 prefvalue = "";
  8700.             }
  8701.  
  8702.             if (prefvalue == "") prefvalue = "off";
  8703.             // browserDebug("intl.charset.detector = "+ prefvalue + "\n");
  8704.  
  8705.             prefvalue = 'chardet.' + prefvalue;
  8706.             var menuitem = document.getElementById(prefvalue);
  8707.  
  8708.             if (menuitem) {
  8709.                 menuitem.setAttribute('checked', 'true');
  8710.             }
  8711.         }
  8712.  
  8713.         function UpdateMenus(event)
  8714.         {
  8715.             // use setTimeout workaround to delay checkmark the menu
  8716.             // when onmenucomplete is ready then use it instead of oncreate
  8717.             // see bug 78290 for the detail
  8718.             UpdateCurrentCharset();
  8719.             setTimeout(UpdateCurrentCharset, 0);
  8720.             UpdateCharsetDetector();
  8721.             setTimeout(UpdateCharsetDetector, 0);
  8722.         }
  8723.  
  8724.         function CreateMenu(node)
  8725.         {
  8726.             // browserDebug (" Calling CreateMenu to make a charset menu from within Browser.js\n\n");
  8727.             // showStack();
  8728.             var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  8729.             observerService.notifyObservers(null, "charsetmenu-selected", node);
  8730.         }
  8731.  
  8732.         function charsetLoadListener (event)
  8733.         {
  8734.             var charset = window._content.document.characterSet;
  8735.  
  8736.             if (charset.length > 0 && (charset != gLastBrowserCharset)) {
  8737.                 if (!gCharsetMenu)
  8738.                 gCharsetMenu = Components.classes['@mozilla.org/rdf/datasource;1?name=charset-menu'].getService().QueryInterface(Components.interfaces.nsICurrentCharsetListener);
  8739.                 gCharsetMenu.SetCurrentCharset(charset);
  8740.                 gPrevCharset = gLastBrowserCharset;
  8741.                 gLastBrowserCharset = charset;
  8742.             }
  8743.         }
  8744.  
  8745.  
  8746.         /* Begin Page Style Functions */
  8747.         function getStyleSheetArray(frame)
  8748.         {
  8749.             var styleSheets = frame.document.styleSheets;
  8750.             var styleSheetsArray = new Array(styleSheets.length);
  8751.             for (var i = 0; i < styleSheets.length; i++) {
  8752.                 styleSheetsArray[i] = styleSheets[i];
  8753.             }
  8754.             return styleSheetsArray;
  8755.         }
  8756.  
  8757.         function getAllStyleSheets(frameset)
  8758.         {
  8759.             var styleSheetsArray = getStyleSheetArray(frameset);
  8760.             for (var i = 0; i < frameset.frames.length; i++) {
  8761.                 var frameSheets = getAllStyleSheets(frameset.frames[i]);
  8762.                 styleSheetsArray = styleSheetsArray.concat(frameSheets);
  8763.             }
  8764.             return styleSheetsArray;
  8765.         }
  8766.  
  8767.         function stylesheetFillPopup(menuPopup)
  8768.         {
  8769.             var noStyle = menuPopup.firstChild;
  8770.             var persistentOnly = noStyle.nextSibling;
  8771.             var sep = persistentOnly.nextSibling;
  8772.             while (sep.nextSibling)
  8773.             menuPopup.removeChild(sep.nextSibling);
  8774.  
  8775.             var styleSheets = getAllStyleSheets(window._content);
  8776.             var currentStyleSheets = [];
  8777.             var styleDisabled = getMarkupDocumentViewer().authorStyleDisabled;
  8778.             var haveAltSheets = false;
  8779.             var altStyleSelected = false;
  8780.  
  8781.             for (var i = 0; i < styleSheets.length; ++i) {
  8782.                 var currentStyleSheet = styleSheets[i];
  8783.  
  8784.                 // Skip any stylesheets that don't match the screen media type.
  8785.                 var media = currentStyleSheet.media.mediaText.toLowerCase();
  8786.                 if (media && (media.indexOf("screen") == -1) && (media.indexOf("all") == -1))
  8787.                 continue;
  8788.  
  8789.                 if (currentStyleSheet.title) {
  8790.                     if (!currentStyleSheet.disabled)
  8791.                     altStyleSelected = true;
  8792.  
  8793.                     haveAltSheets = true;
  8794.  
  8795.                     var lastWithSameTitle = null;
  8796.                     if (currentStyleSheet.title in currentStyleSheets)
  8797.                     lastWithSameTitle = currentStyleSheets[currentStyleSheet.title];
  8798.  
  8799.                     if (!lastWithSameTitle) {
  8800.                         var menuItem = document.createElement("menuitem");
  8801.                         menuItem.setAttribute("type", "radio");
  8802.                         menuItem.setAttribute("label", currentStyleSheet.title);
  8803.                         menuItem.setAttribute("data", currentStyleSheet.title);
  8804.                         menuItem.setAttribute("checked", !currentStyleSheet.disabled && !styleDisabled);
  8805.                         menuPopup.appendChild(menuItem);
  8806.                         currentStyleSheets[currentStyleSheet.title] = menuItem;
  8807.                     } else {
  8808.                         if (currentStyleSheet.disabled)
  8809.                         lastWithSameTitle.removeAttribute("checked");
  8810.                     }
  8811.                 }
  8812.             }
  8813.  
  8814.             noStyle.setAttribute("checked", styleDisabled);
  8815.             persistentOnly.setAttribute("checked", !altStyleSelected && !styleDisabled);
  8816.             persistentOnly.hidden = (window._content.document.preferredStylesheetSet) ? true : false;
  8817.             sep.hidden = (noStyle.hidden && persistentOnly.hidden) || !haveAltSheets;
  8818.             return true;
  8819.         }
  8820.  
  8821.         function stylesheetInFrame(frame, title) {
  8822.             var docStyleSheets = frame.document.styleSheets;
  8823.  
  8824.             for (var i = 0; i < docStyleSheets.length; ++i) {
  8825.                 if (docStyleSheets[i].title == title)
  8826.                 return true;
  8827.             }
  8828.             return false;
  8829.         }
  8830.  
  8831.         function stylesheetSwitchFrame(frame, title) {
  8832.             var docStyleSheets = frame.document.styleSheets;
  8833.  
  8834.             for (var i = 0; i < docStyleSheets.length; ++i) {
  8835.                 var docStyleSheet = docStyleSheets[i];
  8836.  
  8837.                 if (title == "_nostyle")
  8838.                 docStyleSheet.disabled = true;
  8839.             else if (docStyleSheet.title)
  8840.             docStyleSheet.disabled = (docStyleSheet.title != title);
  8841.         else if (docStyleSheet.disabled)
  8842.         docStyleSheet.disabled = false;
  8843.     }
  8844. }
  8845.  
  8846. function stylesheetSwitchAll(frameset, title) {
  8847.     if (!title || title == "_nostyle" || stylesheetInFrame(frameset, title)) {
  8848.         stylesheetSwitchFrame(frameset, title);
  8849.     }
  8850.     for (var i = 0; i < frameset.frames.length; i++) {
  8851.         stylesheetSwitchAll(frameset.frames[i], title);
  8852.     }
  8853. }
  8854.  
  8855. function setStyleDisabled(disabled) {
  8856.     getMarkupDocumentViewer().authorStyleDisabled = disabled;
  8857. }
  8858.  
  8859. /* End of the Page Style functions */
  8860.  
  8861. function clearObsoletePrefs()
  8862. {
  8863.     // removed 10/03/2003
  8864.     try {
  8865.         PREF.clearUserPref("timebomb.first_launch_time");
  8866.     } catch (e) {}
  8867.  
  8868.     // removed 10/16/2003
  8869.     // migrate firebird cookie prefs, if they exist.
  8870.     try {
  8871.         PREF.clearUserPref("network.cookie.enable");
  8872.         // No error: it means this pref was not the default one, cookie were disabled.
  8873.         PREF.SetIntPref("network.cookie.cookieBehavior", 2);
  8874.     } catch (e) {
  8875.         try {
  8876.             PREF.clearUserPref("network.cookie.enableForOriginatingWebsiteOnly");
  8877.             // No error: it means that enableForOriginatingWebsiteOnly was true.
  8878.             PREF.SetIntPref("network.cookie.cookieBehavior", 1);
  8879.         } catch (e) {
  8880.             // here, either we already have migrated the cookie pref
  8881.             // or the new and old behavior are the same (0). In any case: nothing to do.
  8882.         }
  8883.     }
  8884.  
  8885.     // removed 03/09/2003
  8886.     // last of the forked cookie prefs
  8887.     try {
  8888.         PREF.clearUserPref("network.cookie.enableForCurrentSessionOnly");
  8889.         // No error, therefore we were limiting cookies to session
  8890.         PREF.setIntPref("network.cookie.lifetimePolicy", 2);
  8891.     } catch (e) {
  8892.         // nothing to do in this case
  8893.     }
  8894.  
  8895.     try {
  8896.         PREF.clearUserPref("network.cookie.warnAboutCookies");
  8897.         // No error: the pref is set to ask for cookies, set the correct pref
  8898.         // This will replace the setting if enableForCurrentSessionOnly was
  8899.         // also true, because dialogs explictly allow accepting for session
  8900.         PREF.setIntPref("network.cookie.lifetimePolicy", 1);
  8901.     } catch (e) {
  8902.         // nothing to do in this case
  8903.     }
  8904.  
  8905.     // removed 10/22/2003
  8906.     try {
  8907.         PREF.clearUserPref("browser.search.defaultengine");
  8908.     } catch (e) {}
  8909.  
  8910.     // removed 11/01/2003
  8911.     try {
  8912.         PREF.clearUserPref("print.use_global_printsettings");
  8913.     } catch (e) {}
  8914.     try {
  8915.         PREF.clearUserPref("print.save_print_settings");
  8916.     } catch (e) {}
  8917.  
  8918. }
  8919.  
  8920. var BrowserOffline = {
  8921.     /////////////////////////////////////////////////////////////////////////////
  8922.     // BrowserOffline Public Methods
  8923.     init: function ()
  8924.     {
  8925.         var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  8926.         os.addObserver(this, "network:offline-status-changed", false);
  8927.  
  8928.         if (!this._uiElement)
  8929.         this._uiElement = document.getElementById("goOfflineMenuitem");
  8930.  
  8931.         // set the initial state
  8932.         var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  8933.         var isOffline = false;
  8934.         try {
  8935.             isOffline = gPrefService.getBoolPref("browser.offline");
  8936.         }
  8937.         catch (e) { }
  8938.         ioService.offline = isOffline;
  8939.  
  8940.         this._updateOfflineUI(isOffline);
  8941.     },
  8942.  
  8943.     uninit: function ()
  8944.     {
  8945.         try {
  8946.             var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  8947.             os.removeObserver(this, "network:offline-status-changed");
  8948.         } catch (ex) {
  8949.         }
  8950.     },
  8951.  
  8952.     toggleOfflineStatus: function ()
  8953.     {
  8954.         if (!this._canGoOffline()) {
  8955.             this._updateOfflineUI(false);
  8956.             return;
  8957.         }
  8958.  
  8959.         var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  8960.         ioService.offline = !ioService.offline;
  8961.  
  8962.         gPrefService.setBoolPref("browser.offline", ioService.offline);
  8963.     },
  8964.  
  8965.     /////////////////////////////////////////////////////////////////////////////
  8966.     // nsIObserver
  8967.     observe: function (aSubject, aTopic, aState)
  8968.     {
  8969.         if (aTopic != "network:offline-status-changed")
  8970.         return;
  8971.  
  8972.         this._updateOfflineUI(aState == "offline");
  8973.     },
  8974.  
  8975.     /////////////////////////////////////////////////////////////////////////////
  8976.     // BrowserOffline Implementation Methods
  8977.     _canGoOffline: function ()
  8978.     {
  8979.         var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  8980.         if (os) {
  8981.             try {
  8982.                 var cancelGoOffline = Components.classes["@mozilla.org/supports-PRBool;1"].createInstance(Components.interfaces.nsISupportsPRBool);
  8983.                 os.notifyObservers(cancelGoOffline, "offline-requested", null);
  8984.  
  8985.                 // Something aborted the quit process.
  8986.                 if (cancelGoOffline.data)
  8987.                 return false;
  8988.             }
  8989.             catch (ex) {
  8990.             }
  8991.         }
  8992.         return true;
  8993.     },
  8994.  
  8995.     _uiElement: null,
  8996.     _updateOfflineUI: function (aOffline)
  8997.     {
  8998.         var offlineLocked = gPrefService.prefIsLocked("network.online");
  8999.         if (offlineLocked)
  9000.         this._uiElement.setAttribute("disabled", "true");
  9001.  
  9002.         this._uiElement.setAttribute("checked", aOffline);
  9003.     }
  9004. };
  9005.  
  9006. function WindowIsClosing()
  9007. {
  9008.     var browser = getBrowser();
  9009.     var cn = browser.tabContainer.childNodes;
  9010.     var numtabs = cn.length;
  9011.     var reallyClose = browser.warnAboutClosingTabs(true);
  9012.  
  9013.     for (var i = 0; reallyClose && i < numtabs; ++i) {
  9014.         var ds = browser.getBrowserForTab(cn[i]).docShell;
  9015.  
  9016.         if (ds.contentViewer && !ds.contentViewer.permitUnload())
  9017.         reallyClose = false;
  9018.     }
  9019.  
  9020.     if (reallyClose) {
  9021.         // MERC (rpaul) destroy the queue timer so it does not try to keep accessing a null dashboard
  9022.         if (threatsQueue){
  9023.             if (threatsQueue.mTimer){
  9024.                     threatsQueue.mTimer.cancel();
  9025.             }
  9026.         }
  9027.         
  9028.         // hide balloonhelp widget if open
  9029.         if (balloonhelp) {
  9030.             balloonhelp.HideBalloonHelp();
  9031.         }
  9032.  
  9033.         //merc - TO
  9034.         //BLT 208970
  9035.         //close the dashboard window first
  9036.         //so netscape looks cleaner when closing
  9037.         if (dashboard.mDashboardWindow != null)
  9038.             dashboard.mDashboardWindow.close();
  9039.  
  9040.         return closeWindow(false);
  9041.     }
  9042.     return reallyClose;
  9043. }
  9044.  
  9045. var MailIntegration = {
  9046.     sendLinkForContent: function ()
  9047.     {
  9048.         this.sendMessage(Components.lookupMethod(window._content, 'location').call(window._content).href,
  9049.         Components.lookupMethod(window._content.document, 'title').call(window._content.document));
  9050.     },
  9051.  
  9052.     sendMessage: function (aBody, aSubject)
  9053.     {
  9054.         // generate a mailto url based on the url and the url's title
  9055.         var mailtoUrl = aBody ? "mailto:?body=" + encodeURIComponent(aBody) + "&subject=" + encodeURIComponent(aSubject) : "mailto:";
  9056.  
  9057.         var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  9058.         var uri = ioService.newURI(mailtoUrl, null, null);
  9059.  
  9060.         // now pass this url to the operating system
  9061.         this._launchExternalUrl(uri);
  9062.     },
  9063.  
  9064.     // a generic method which can be used to pass arbitrary urls to the operating system.
  9065.     // aURL --> a nsIURI which represents the url to launch
  9066.     _launchExternalUrl: function(aURL)
  9067.     {
  9068.         var extProtocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"].getService(Components.interfaces.nsIExternalProtocolService);
  9069.         if (extProtocolSvc)
  9070.             extProtocolSvc.loadUrl(aURL);
  9071.     },
  9072.  
  9073.     readMail: function ()
  9074.     {
  9075.         var shell = getShellService();
  9076.         if (shell)
  9077.             shell.openPreferredApplication(Components.interfaces.nsIShellService.APPLICATION_MAIL);
  9078.     },
  9079.  
  9080.     readNews: function ()
  9081.     {
  9082.         var shell = getShellService();
  9083.         if (shell)
  9084.             shell.openPreferredApplication(Components.interfaces.nsIShellService.APPLICATION_NEWS);
  9085.     },
  9086.  
  9087.     updateUnreadCount: function ()
  9088.     {
  9089.         var shell = Components.classes["@mozilla.org/browser/shell-service;1"]
  9090.                               .getService(Components.interfaces.nsIWindowsShellService);
  9091.         var unreadCount = shell.unreadMailCount;
  9092.         var message = gNavigatorBundle.getFormattedString("mailUnreadTooltip", [unreadCount]);
  9093.         var element = document.getElementById("mail-button");
  9094.         if (element)
  9095.             element.setAttribute("tooltiptext", message);
  9096.  
  9097.         message = gNavigatorBundle.getFormattedString("mailUnreadMenuitem", [unreadCount]);
  9098.         element = document.getElementById("Browser:ReadMail");
  9099.         if (element)
  9100.             element.setAttribute("label", message);
  9101.     }
  9102. };
  9103.  
  9104. function BrowserOpenExtensions(aOpenMode)
  9105. {
  9106.     const EMTYPE = "Extension:Manager";
  9107.  
  9108.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  9109.     .getService(Components.interfaces.nsIWindowMediator);
  9110.     var needToOpen = true;
  9111.     var windowType = EMTYPE + "-" + aOpenMode;
  9112.     var windows = wm.getEnumerator(windowType);
  9113.     while (windows.hasMoreElements()) {
  9114.         var theEM = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
  9115.         if (theEM.document.documentElement.getAttribute("windowtype") == windowType) {
  9116.             theEM.focus();
  9117.             needToOpen = false;
  9118.             break;
  9119.         }
  9120.     }
  9121.  
  9122.     if (needToOpen) {
  9123.         const EMURL = "chrome://mozapps/content/extensions/extensions.xul?type=" + aOpenMode;
  9124.         const EMFEATURES = "chrome,dialog=no,resizable";
  9125.         window.openDialog(EMURL, "", EMFEATURES);
  9126.     }
  9127. }
  9128.  
  9129. function AutofillEdit()
  9130. {
  9131.     const EMTYPE = "AutoFill:Manager";
  9132.  
  9133.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  9134.     .getService(Components.interfaces.nsIWindowMediator);
  9135.     var needToOpen = true;
  9136.     var windowType = EMTYPE;
  9137.     var windows = wm.getEnumerator(windowType);
  9138.     while (windows.hasMoreElements()) {
  9139.         var theEM = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
  9140.         var wtype=theEM.document.documentElement.getAttribute("windowtype");
  9141.         browserDebug("window type:"+wtype+"\n");
  9142.         if (theEM.document.documentElement.getAttribute("windowtype") == windowType) {
  9143.             theEM.focus();
  9144.             needToOpen = false;
  9145.             break;
  9146.         }
  9147.     }
  9148.     if (needToOpen) {
  9149.         const EMURL = "chrome://browser/content/pref/pref.xul";
  9150.         const EMFEATURES = "chrome,dialog=no,resizable";
  9151.         window.openDialog(EMURL, "", EMFEATURES);
  9152.     }
  9153. }
  9154.  
  9155. // MERC - JCH: Combined datacard and passcard button behaviour.
  9156. // Check whether page is passcardable first. If page isn't, then
  9157. // assume it's datacardable.
  9158. function DoCombinedAutofill()
  9159. {
  9160.     // Does page have password/username fields?
  9161.     // (The boolean means: true = ignore whether there is text in fields,
  9162.     // false = insist that both fields have text otherwise return false).
  9163.     if (CheckIsPasscardable(true)) {
  9164.         DoPasscardOneTime();
  9165.     } else {
  9166.         datacardButton();
  9167.     }
  9168. }
  9169.  
  9170. // MERC - JCH: Fired when datacard-passcard button fill form menu item invoked.
  9171. function DoCombinedFill(menuitem, doSubmit)
  9172. {
  9173.     if (CheckIsPasscardable(true)) {
  9174.         fillUsernamePassword(menuitem, doSubmit);
  9175.     } else {
  9176.         if (doSubmit)
  9177.             datacardUtils.DoAutoFillAndSubmit();
  9178.         else
  9179.             datacardUtils.DoAutoFill();
  9180.     }
  9181. }
  9182.  
  9183. // MERC - JCH: Fired when datacard-passcard button save form menu item invoked.
  9184. function DoCombinedSave()
  9185. {
  9186.     if (CheckIsPasscardable(true)) {
  9187.         savePasscard();
  9188.     } else {
  9189.         datacardUtils.SaveDatacard();
  9190.     }
  9191. }
  9192.  
  9193. // MERC - JCH: Fired when datacard-passcard button drop-down menu is opened.
  9194. function UpdateCombinedMenu(menuitem)
  9195. {
  9196.     clearDatacardMenu();
  9197.     clearPasscardMenu();
  9198.     if (CheckIsPasscardable(true)) {
  9199.         updatePasscardMenu(menuitem);
  9200.     } else {
  9201.         updateDatacardMenu();
  9202.     }
  9203. }
  9204.  
  9205.  
  9206. function AddKeywordForSearchField()
  9207. {
  9208.     var node = document.popupNode;
  9209.     var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  9210.                               .getService(Components.interfaces.nsIIOService);
  9211.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  9212.                         .getService(Components.interfaces.nsIURI);
  9213.     uri.spec = node.ownerDocument.URL;
  9214.  
  9215.     var keywordURL = ioService.newURI(node.form.action, node.ownerDocument.characterSet, uri);
  9216.     var spec = keywordURL.spec;
  9217.     var postData = "";
  9218.  
  9219.     if (node.form.method.toUpperCase() == "POST" &&
  9220.     (node.form.enctype == "application/x-www-form-urlencoded" || node.form.enctype == "")) {
  9221.         for (var i = 0; i < node.form.elements.length; ++i) {
  9222.             var e = node.form.elements[i];
  9223.             if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden" ||
  9224.           e instanceof HTMLTextAreaElement)
  9225.             postData += escape(e.name + "=" + (e == node ? "%s" : e.value)) + "&";
  9226.       else if (e instanceof HTMLSelectElement && e.selectedIndex >= 0)
  9227.         postData += escape(e.name + "=" + e.options[e.selectedIndex].value) + "&";
  9228.     else if ((e.type.toLowerCase() == "checkbox" ||
  9229.     e.type.toLowerCase() == "radio") && e.checked)
  9230.     postData += escape(e.name + "=" + e.value) + "&";
  9231. }
  9232. }
  9233. else {
  9234.     spec += "?" + escape(node.name) + "=%s";
  9235.     for (var i = 0; i < node.form.elements.length; ++i) {
  9236.         var e = node.form.elements[i];
  9237.         if (e == node) // avoid duplication of the target field value, which was populated above.
  9238.         continue;
  9239.  
  9240.         if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden" ||
  9241.           e instanceof HTMLTextAreaElement)
  9242.         spec += "&" + escape(e.name) + "=" + escape(e.value);
  9243.       else if (e instanceof HTMLSelectElement && e.selectedIndex >= 0)
  9244.     spec += "&" + escape(e.name) + "=" + escape(e.options[e.selectedIndex].value);
  9245. else if ((e.type.toLowerCase() == "checkbox" ||
  9246. e.type.toLowerCase() == "radio") && e.checked)
  9247. spec += "&" + escape(e.name) + "=" + escape(e.value);
  9248. }
  9249. }
  9250. openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "",
  9251. "centerscreen,chrome,dialog,resizable,dependent",
  9252. "", spec, null, node.ownerDocument.characterSet, null, null,
  9253. false, "", true, postData);
  9254. }
  9255.  
  9256. // MERC - This function opens the options panel as specified by the
  9257. // optionToOpen parameter we need to setup string constants for all of these
  9258. // panels, ie WEB_FEATURES = 2 so anyone can call any panel
  9259. function openPrefs(optionToOpen) {
  9260.     // WARNING: KLUGE ALERT!!!
  9261.     gPrefService.setIntPref('browser.preferences.lastpanel', optionToOpen);
  9262.     openPreferences();
  9263. }
  9264.  
  9265. // MERC (DP): opens the site controls prefs dialog with the entry for the
  9266. // current tab selected.
  9267. function openSiteControlPrefs() {
  9268.     var url = gBrowser.currentURI.spec;
  9269.  
  9270.     // is this a controlled site?
  9271.     var controlledSite = sitecontrols.getControlledSiteFromURL(url);
  9272.     var site;
  9273.     if (!controlledSite) {
  9274.         site = sitecontrols.DEFAULT_SITE;
  9275.     } else {
  9276.         site = controlledSite;
  9277.     }
  9278.  
  9279.     gPrefService.setCharPref('browser.preferences.selectedSite', site);
  9280.     openPrefs(PREF_SITECONTROLS);
  9281. }
  9282.  
  9283. function getTridentDocument()
  9284. {
  9285.     var hpDoc = null;
  9286.     try
  9287.     {
  9288.         hpDoc = gBrowser.contentDocument.QueryInterface(nsIHTMLPluginDocument);
  9289.     }
  9290.     catch(e) { } // Not trident
  9291.     return hpDoc;
  9292. }
  9293.  
  9294. // MERC (DP): enables/disables the "Clear Download Manager History" menu item in the
  9295. // downloads toolbar button dropdown
  9296. function updateDownloadsMenu(menu) {
  9297.     var dlMgr = Components.classes["@mozilla.org/download-manager;1"].getService(Components.interfaces.nsIDownloadManager);
  9298.  
  9299.     var clearDownloadsItem = document.getElementById('clearDownloadsHistory');
  9300.     var clearDownloadsCmd = document.getElementById('History:ClearDownloads');
  9301.  
  9302.     if(dlMgr.canCleanUp) {
  9303.         clearDownloadsItem.removeAttribute('disabled');
  9304.         clearDownloadsCmd.removeAttribute('disabled');
  9305.     } else {
  9306.         clearDownloadsItem.setAttribute('disabled', 'true');
  9307.         clearDownloadsCmd.setAttribute('disabled', 'true');
  9308.     }
  9309. }
  9310.  
  9311.  
  9312. // Clear out the specific datacards from the menu
  9313. function clearDatacardMenu() {
  9314.     var menu = document.getElementById('combinedFormFillPopup');
  9315.     if (!menu) return;
  9316.     var dcSep = document.getElementById('combinedFormFillDatacardSep');
  9317.     if (!dcSep) return;
  9318.     dcSep.setAttribute('hidden', 'true');
  9319.     var node = dcSep;
  9320.     while (node) {
  9321.         var temp = node;
  9322.         node = node.nextSibling;
  9323.         if (temp.hasAttribute('datacard'))
  9324.             menu.removeChild(temp);
  9325.     }
  9326. }
  9327.  
  9328. // MERC - JCH: Element IDs were modified to work with the
  9329. // new combined datacard-passcard button.
  9330. function updateDatacardMenu() {
  9331.     // Grab the menu items
  9332.     var formFill = document.getElementById('combinedFillFormMenuItem');
  9333.     var formFillAndSubmit = document.getElementById('combinedFillAndSubmitMenuItem');
  9334.     var save = document.getElementById('combinedSaveMenuItem');
  9335.     // See if the current page is fillable
  9336.     var htmlFields = datacardUtils.RipFields();
  9337.     var fillable = datacardUtils.IsPageAutoFillable(
  9338.                                    gBrowser.currentURI,
  9339.                                    htmlFields,
  9340.                                    true);  // check for data
  9341.     var isBlacklisted = datacardUtils.IsSiteBlacklisted(gBrowser.currentURI);
  9342.     if (fillable) {
  9343.         if (!isBlacklisted && datacardUtils.DatacardsExist()) {
  9344.             var menu = document.getElementById('combinedFormFillPopup');
  9345.             var dcSep = document.getElementById('combinedFormFillDatacardSep');
  9346.             var pcSep = document.getElementById('combinedFormFillPasscardSep');
  9347.             formFill.removeAttribute('disabled');
  9348.             formFillAndSubmit.removeAttribute('disabled');
  9349.             dcSep.removeAttribute('hidden');
  9350.             var allDatacards = datacardUtils.GetDatacardList();
  9351.             var siteDatacard = datacardUtils.FindDatacardForURI(gBrowser.currentURI);
  9352.             for (var i = 0; i < allDatacards.length; i++) {
  9353.                 var item = document.createElement('menuitem');
  9354.                 item.setAttribute('label', allDatacards[i]);
  9355.                 item.setAttribute('type', 'checkbox');
  9356.                 item.setAttribute('tooltiptext', 'Use this datacard');
  9357.                 item.setAttribute('datacard', 'true');
  9358.                 if (allDatacards[i] == siteDatacard)
  9359.                     item.setAttribute('checked', 'true');
  9360.                 item.setAttribute('oncommand', 'datacardUtils.DoAutoFill(undefined,"'+allDatacards[i]+'");');
  9361.                 menu.insertBefore(item, pcSep);
  9362.             }
  9363.         } else {
  9364.             formFill.setAttribute('disabled','true');
  9365.             formFillAndSubmit.setAttribute('disabled','true');
  9366.         }
  9367.     } else {
  9368.         formFill.setAttribute('disabled','true');
  9369.         formFillAndSubmit.setAttribute('disabled','true');
  9370.     }
  9371.  
  9372.     // check if the user has entered any data on the page
  9373.     var bHasData = false;
  9374.     for (var j = 0; j < htmlFields.values.length; j++) {
  9375.         if (htmlFields.values[j] != '') {
  9376.             bHasData = true;
  9377.             break;
  9378.         }
  9379.     }
  9380.  
  9381.     // enable/disable the Save Form menu option
  9382.     if (!isBlacklisted && (fillable || bHasData))
  9383.         save.removeAttribute('disabled');
  9384.     else
  9385.         save.setAttribute('disabled','true');
  9386. }
  9387.  
  9388. function datacardButton() {
  9389.     if (gPrefService.getPrefType('datacard.fillandsubmit') &&
  9390.         gPrefService.getBoolPref('datacard.fillandsubmit'))
  9391.     {
  9392.         datacardUtils.DoAutoFillAndSubmit();
  9393.     } else {
  9394.         datacardUtils.DoAutoFill();
  9395.     }
  9396. }
  9397.  
  9398.  
  9399. var gCurrentNotificationBar = null;
  9400.  
  9401.  
  9402. function specDisplayNotificationBar(barId, aTitle, numNew, numAll, aURL, hpSomeDoc)
  9403. {
  9404.     var myTitle = aTitle;
  9405. //    browserDebug("displayNotificationBarSpec called\n");
  9406.     if (barId == "rsspretty") {
  9407. //        browserDebug("displayNotificationBarSpec: is rsspretty\n");
  9408.         if (aURL) {
  9409.             if (aURL.substr(0,5) != "feed:") aURL = "feed:" + aURL;
  9410.            BMSVC.updateLivemarkUnread(aURL,numNew);
  9411.         }
  9412.         if (aTitle && aTitle.length > 40) {
  9413.             myTitle = aTitle.substr(0,40) + "...";
  9414.         }
  9415.         var browser = null;
  9416.         if (hpSomeDoc)
  9417.         {
  9418. //            browserDebug("displayNotificationBarSpec: is hpSomeDoc\n");
  9419.             var cnTabs = gBrowser.tabContainer.childNodes;
  9420.             var numtabs = cnTabs.length;
  9421.             if (numtabs>=1)
  9422.             {
  9423.                 for (var i = 0; i < numtabs; ++i)
  9424.                 {
  9425.                     var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  9426.                     if (doc && doc == hpSomeDoc)
  9427.                         browser = gBrowser.getBrowserForTab(cnTabs[i])
  9428.                 }
  9429.             }
  9430.         }
  9431.         displayNotificationBar(barId, [myTitle,numNew,numAll,aURL,browser]);
  9432.         return;
  9433.     }
  9434.     displayNotificationBar(barId, [myTitle,numNew,numAll,aURL,hpSomeDoc]);
  9435.     return;
  9436. }
  9437. /*
  9438. JMC: Enforces order of precedence between all possible
  9439. simultaneous notification bars...
  9440. */
  9441. function displayNotificationBar(barId, extraData)
  9442. {
  9443.     browserDebug("Trying to show notification bar for : " + barId + "\n");
  9444.     // Simple case - no other bars
  9445.     if (!gCurrentNotificationBar) {
  9446.         showNBar(barId, extraData);
  9447.     } else if (barPriority(barId) >= barPriority(gCurrentNotificationBar)) {
  9448.         showNBar(barId, extraData);
  9449.     } else {
  9450.         browserDebug("Not showing it - not important enough.\n");
  9451.     }
  9452. }
  9453.  
  9454.  
  9455. function hideNotificationBar(barId, thisBrowser)
  9456. {
  9457.     if (gCurrentNotificationBar == barId) {
  9458.         thisBrowser.hideMessage(thisBrowser.selectedBrowser, "top");
  9459.         gCurrentNotificationBar = null;
  9460.     }
  9461. }
  9462.  
  9463.  
  9464. function barPriority(barId)
  9465. {
  9466.     var priority;
  9467.     switch (barId) {
  9468.     case "phishing" :
  9469.         priority = 9;
  9470.         break;
  9471.     case "spyware" :
  9472.         priority = 10;
  9473.         break;
  9474.     case "webmail" :
  9475.         priority = 1;
  9476.         break;
  9477.     case "rss" :
  9478.         priority = 2;
  9479.         break;
  9480.     case "rsspretty":
  9481.         priority = 2;
  9482.         break;
  9483.     case "popup" :
  9484.         priority = 3;
  9485.         break;
  9486.     case "datacard" :
  9487.         priority = 4;
  9488.         break;
  9489.     case "passcard" :
  9490.         priority = 5;
  9491.         break;
  9492.     case "xpi" :
  9493.         priority = 6;
  9494.         break;
  9495.     case "missing-plugin" :
  9496.         priority = 6;
  9497.         break;
  9498.     }
  9499.     return priority;
  9500. }
  9501.  
  9502.  
  9503. function showNBar(barId, extraData)
  9504. {
  9505.     browserDebug("Showing bar : " + barId + "\n");
  9506.     var browser = gBrowser.selectedBrowser;
  9507.     var tabbrowser = getBrowser();
  9508.     var bundle_browser = document.getElementById("bundle_browser");
  9509.     var brandBundle = document.getElementById("bundle_brand");
  9510.     var brandShortName = brandBundle.getString("brandShortName");
  9511.     var imgIcon = "chrome://browser/skin/Info.png";
  9512.     var message = "";
  9513.     var buttonString = "";
  9514.     var deckIdx = 0;
  9515.     var aSource;
  9516.     var aPopup;
  9517.     var aDocShell;
  9518.  
  9519.     switch (barId) {
  9520.     case "phishing" :
  9521.         // don't show bar if pref is not set
  9522.         if (!gPrefService.getBoolPref("trustsettings.showwarnings")) return;
  9523.         var siteURL = extraData[0];
  9524.         var matchingPartners = blacklistUtils.lastSitePartners.join(", ");
  9525.         message = bundle_browser.getFormattedString("phishingNotification", [siteURL.host, matchingPartners]);
  9526.         deckIdx = 3;
  9527.         break;
  9528.  
  9529.     case "spyware" :
  9530.         // don't show bar if pref is not set
  9531.         if (!gPrefService.getBoolPref("trustsettings.showwarnings")) return;
  9532.         var siteURL = extraData[0];
  9533.         var matchingPartners = blacklistUtils.lastSitePartners.join(", ");
  9534.         message = bundle_browser.getFormattedString("spywareNotification", [siteURL.host, matchingPartners]);
  9535.         deckIdx = 4;
  9536.         break;
  9537.  
  9538.     case "webmail" :
  9539.         deckIdx = 5;
  9540.         imgIcon = extraData[0];
  9541.         message = extraData[1];
  9542.         break;
  9543.  
  9544.     case "rss" :
  9545.         deckIdx = 0;
  9546.         message = bundle_browser.getFormattedString("rssWarning", [brandShortName]);
  9547.         aPopup = "blockedRSSOptions";
  9548.         imgIcon = "chrome://browser/skin/page-livemarks.png";
  9549.         break;
  9550.  
  9551.     case "rsspretty" :
  9552.         deckIdx = 7;
  9553.         imgIcon = extraData[0]; // Title
  9554.         message = extraData[1]; // Num New
  9555.         buttonString = extraData[2]; // Num Total
  9556.         aSource = extraData[3]; // URL
  9557.         if (extraData[4]) browser=extraData[4]; //Browser
  9558. //        browserDebug("trying rssPretty, "+imgIcon+", "+message+", "+buttonString+"\n");
  9559.         break;
  9560.  
  9561.     case "popup" :
  9562.         deckIdx = 6;
  9563.         //var popupCount = gBrowser.selectedBrowser.pageReport.length;
  9564.         //if (popupCount > 1)
  9565.         //    message = bundle_browser.getFormattedString("popupWarningMultiple", [brandShortName, popupCount]);
  9566.         //else
  9567.         message = bundle_browser.getFormattedString("popupWarning", [brandShortName]);
  9568.         break;
  9569.  
  9570.     case "datacard" :
  9571.         deckIdx = 2;
  9572.         break;
  9573.  
  9574.     case "passcard" :
  9575.         deckIdx = 1;
  9576.         message = bundle_browser.getString("passcardMsg");
  9577.         imgIcon = "chrome://browser/skin/icons/passwordsm_h.png";
  9578.         break;
  9579.  
  9580.     case "xpi" :
  9581.         deckIdx = 0;
  9582.         imgIcon = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";
  9583.         var messageKey = "xpinstallWarning";
  9584.         var buttonKey = "xpinstallWarningButton";
  9585.         var shell = extraData[0];
  9586.         var host = browser.docShell.QueryInterface(Components.interfaces.nsIWebNavigation).currentURI.host;
  9587.         aSource = "xpinstall-install-edit-permissions";
  9588.         if (!gPrefService.getBoolPref("xpinstall.enabled")) {
  9589.             message = bundle_browser.getFormattedString("xpinstallDisabledWarning",    [brandShortName, host]);
  9590.             buttonString = bundle_browser.getString("xpinstallDisabledWarningButton");
  9591.         }
  9592.         else {
  9593.             message = bundle_browser.getFormattedString(messageKey, [brandShortName, host]);
  9594.             buttonString = bundle_browser.getString(buttonKey);
  9595.         }
  9596.         aDocShell = shell;
  9597.         break;
  9598.  
  9599.     case "missing-plugin" :
  9600.         browser = extraData[0];
  9601.         imgIcon = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";
  9602.         message = bundle_browser.getString("missingpluginsMessage.title");
  9603.         buttonString = bundle_browser.getString("missingpluginsMessage.button.label");
  9604.         aSource = "missing-plugin";
  9605.         break;
  9606.     }
  9607.  
  9608.     gBrowser.hideMessage(browser, "both");
  9609.     browserDebug('Bar will show message : ' + message + '\n');
  9610.     gBrowser.showMessage(browser, imgIcon, message, buttonString,
  9611.                          aDocShell, aSource, aPopup, "top", true, deckIdx);
  9612.     gCurrentNotificationBar = barId;
  9613. }
  9614.  
  9615.  
  9616. // MERC - JCH
  9617. function openFormfillPrefs()
  9618. {
  9619.     gPrefService.setCharPref('browser.preferences.formfillORpasscard', 'formfilltab');
  9620.     openPrefs(PREF_AUTOFILL);
  9621. }
  9622.  
  9623.  
  9624. // MERC - JCH: This is called from nsHTMLPluginDocument.cpp.
  9625. function IsTridentFillable()
  9626. {
  9627.      if (blacklistUtils.IsSiteInPhishList(gBrowser.currentURI)) {
  9628.             displayNotificationBar("phishing",[gBrowser.currentURI]);
  9629.             // ShowPhishingSiteWarning();
  9630.         } else if (blacklistUtils.IsSiteInSpywareList(gBrowser.currentURI)) {
  9631.             displayNotificationBar("spyware",[gBrowser.currentURI]);
  9632.         }
  9633.         datacardUtils.DoPageLoadedCheck();
  9634. }
  9635.  
  9636.  
  9637. // MERC (DP): simply calls toggleDisplayEngineSiteControl() for the current tab.
  9638. // called from nsHTMLPluginDocument::ToggleEngine()
  9639. function BrowserToggleDisplayEngineSiteControl()
  9640. {
  9641.     //browserDebug("Browser Engine Toggle : \n\n");
  9642.     //showStack();
  9643.     urlLoadFromBar = true;
  9644.     gBrowser.mCurrentTab.toggleDisplayEngineSiteControl();
  9645. }
  9646.  
  9647. // MERC JCH: If current engine statusbar popup is invoked and current
  9648. // page is about:blank, then disable engine options.
  9649. // MERC MRR: Make this more general, so it always shows the right state.
  9650. function setEngineSwitchMenuItemState()
  9651. {
  9652.     var hpDoc = getTridentDocument();
  9653.     var url = getWebNavigation().currentURI.spec;
  9654.     var aboutrx = /^about:/;
  9655.     var feedsrx = /^feeds:/;
  9656.     if ((aboutrx.test(url) && url != "about:blank") || feedsrx.test(url))
  9657.     {
  9658.         document.getElementById("displayLikeFirefox").setAttribute("disabled", "true");
  9659.         document.getElementById("displayLikeIE").setAttribute("disabled", "true");
  9660.     }
  9661.     else if (hpDoc)
  9662.     {
  9663.         document.getElementById("displayLikeIE").setAttribute("disabled", "true");
  9664.         document.getElementById("displayLikeIE").setAttribute("checked", "true");
  9665.         document.getElementById("displayLikeFirefox").removeAttribute("checked");
  9666.         document.getElementById("displayLikeFirefox").removeAttribute("disabled");
  9667.     }
  9668.     else
  9669.     {
  9670.         document.getElementById("displayLikeFirefox").setAttribute("disabled", "true");
  9671.         document.getElementById("displayLikeFirefox").setAttribute("checked", "true");
  9672.         document.getElementById("displayLikeIE").removeAttribute("checked");
  9673.         document.getElementById("displayLikeIE").removeAttribute("disabled");
  9674.     }
  9675. }
  9676.  
  9677.  
  9678.  
  9679. function BrowserClosedByCloseButton()
  9680. {
  9681.     var webBrowserPrint = PrintUtils.getWebBrowserPrint();
  9682.     if (webBrowserPrint.doingPrintPreview) {
  9683.         // setTimeout(FinallyClose, 10);
  9684.         PrintUtils.exitPrintPreview();
  9685.     }
  9686.     else {
  9687.         FinallyClose();
  9688.     }
  9689. }
  9690.  
  9691.  
  9692. function FinallyClose()
  9693. {
  9694.     if (WindowIsClosing())
  9695.         window.close();
  9696. }
  9697.  
  9698. //Merc , SLiu
  9699. function ShowPrintErrorDialogForTrident(errorId)
  9700. {
  9701.     const bundleURL = "chrome://global/locale/printing.properties";
  9702.  
  9703.     const sbsContractID = "@mozilla.org/intl/stringbundle;1";
  9704.     const sbsIID = Components.interfaces.nsIStringBundleService;
  9705.     const sbs = Components.classes[sbsContractID].getService(sbsIID);
  9706.  
  9707.     const lsContractID = "@mozilla.org/intl/nslocaleservice;1";
  9708.     const lsIID = Components.interfaces.nsILocaleService;
  9709.     const ls = Components.classes[lsContractID].getService(lsIID);
  9710.     var appLocale = ls.getApplicationLocale();
  9711.     var strBundle = sbs.createBundle(bundleURL, appLocale);
  9712.     var titleStr=null;
  9713.     var msg=null;
  9714.     if(errorId==PRINT_PREVIEW_REQ_WHILE_TRIDENT_LOADING_ERROR)
  9715.     {
  9716.         titleStr=strBundle.GetStringFromName("printpreview_error_dialog_title");
  9717.         msg=strBundle.GetStringFromName("NS_ERROR_GFX_PRINTER_DOC_IS_BUSY_PP");
  9718.     }
  9719. else if(errorId==PRINT_REQ_WHILE_TRIDENT_LOADING_ERROR)
  9720. {
  9721.     titleStr=strBundle.GetStringFromName("print_req_error_dialog_title");
  9722.     msg=strBundle.GetStringFromName("NS_ERROR_GFX_PRINTER_DOC_IS_BUSY");
  9723. }
  9724. if(titleStr && msg)
  9725. {
  9726.     var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  9727.     promptSvc.alert(null,titleStr, msg);
  9728. }
  9729. }
  9730.  
  9731. /////////////// livemark handling
  9732.  
  9733. // MERC - JCH: Receives RSS data from Trident. Called from nsHTMLPluginDocument.cpp.
  9734. function OnTridentLinkFound(href, rel, title, type, doc)
  9735. {
  9736.     var link = document.createElementNS(XHTML_NS, "link");
  9737.     link.setAttribute("href", href);
  9738.     link.setAttribute("title", title);
  9739.     link.setAttribute("type", type);
  9740.     link.setAttribute("rel", rel);
  9741.  
  9742.  
  9743.     var event = new Object();
  9744.     event.target = link;
  9745.     event.isTrusted = true;
  9746.  
  9747.     // CC MERC bug # 173710
  9748.     // Required this info to update RSS Feed when
  9749.     // toolbar has been customize. See function BrowserToolboxCustomizeDone
  9750.     if(isSameUri!= null && isSameUri==gBrowser.currentURI.spec){
  9751.       if(rssFeed) {
  9752.           rssFeed.push(event,doc);
  9753.         }
  9754.     }else{
  9755.         rssFeed= new Array(event,doc);
  9756.         isSameUri=gBrowser.currentURI.spec;
  9757.   }
  9758.   livemarkOnLinkAdded(event, doc);
  9759.  
  9760. }
  9761.  
  9762.  
  9763.  
  9764. // XXX this event listener can/should probably be combined with the onLinkAdded
  9765. // listener in tabbrowser.xml, which only listens for favicons and then passes
  9766. // them to onLinkIconAvailable in the ProgressListener.  We could extend the
  9767. // progress listener to have a generic onLinkAvailable and have tabbrowser pass
  9768. // along all events.  It should give us the browser for the tab, as well as
  9769. // the actual event.
  9770. // MERC - JCH: Added the extra 'doc' argument to allow Trident RSS feed data
  9771. // to display properly.
  9772. function livemarkOnLinkAdded(event, doc)
  9773. {
  9774.     browserDebug("livemarkOnLinkAdded() ~~~~~~~~\n");
  9775.  
  9776.     // browserDebug ("Think doc is " + doc);
  9777.  
  9778.       if (!event.isTrusted)
  9779.         return;
  9780.  
  9781.     if (!gLivemarksButton)
  9782.     gLivemarksButton = document.getElementById("livemark-button");
  9783.  
  9784.     // from tabbrowser.xml
  9785.     // mechanism for reading properties of the underlying XPCOM object
  9786.     // (ignoring potential getters/setters added by malicious content)
  9787.     var safeGetProperty = function(obj, propname) {
  9788.         return Components.lookupMethod(obj, propname).call(obj);
  9789.     }
  9790.  
  9791.     var erel = event.target.rel;
  9792.     var etype = event.target.type;
  9793.     var etitle = event.target.title;
  9794.  
  9795.     // this is a blogger post service URL; so skip it
  9796.     if (erel && erel == "service.post")
  9797.     return;
  9798.  
  9799.  
  9800.  
  9801.     if (etype == "application/rss+xml" ||
  9802.     etype == "application/atom+xml" ||
  9803.     etype == "application/x.atom+xml" ||
  9804.     etitle.indexOf("RSS") != -1 ||
  9805.     etitle.indexOf("Atom") != -1 ||
  9806.     etitle.indexOf("rss") != -1)
  9807.     {
  9808.  
  9809.         // const targetDoc;
  9810.         var targetDoc;
  9811.         if (doc != null) {
  9812.             targetDoc = doc;
  9813.         } else {
  9814.             targetDoc = safeGetProperty(event.target, "ownerDocument");
  9815.         }
  9816.  
  9817.         // find which tab this is for, and set the attribute on the browser
  9818.         // should there be a getTabForDocument method on tabbedbrowser?
  9819.         var browserForLink = null;
  9820.         if (gBrowser.mTabbedMode) {
  9821.             var browserIndex = gBrowser.getBrowserIndexForDocument(targetDoc);
  9822.             if (browserIndex == -1) {
  9823.                 browserDebug ("Uhoh - couldn't get browserindex for targetdoc");
  9824.  
  9825.                 return;
  9826.             }
  9827.             browserForLink = gBrowser.getBrowserAtIndex(browserIndex);
  9828.         } else if (gBrowser.mCurrentBrowser.contentDocument == targetDoc) {
  9829.             browserForLink = gBrowser.mCurrentBrowser;
  9830.         }
  9831.  
  9832.  
  9833.         if (!browserForLink) {
  9834.             // ??? this really shouldn't happen..
  9835.             browserDebug("Uhoh - couldn't find browserForLink");
  9836.             return;
  9837.         }
  9838.  
  9839.         var livemarkLinks = [];
  9840.         if (browserForLink.livemarkLinks != null)
  9841.             livemarkLinks = browserForLink.livemarkLinks;
  9842.  
  9843.         var wrapper = new XPCNativeWrapper(event.target, "href", "type", "title");
  9844.  
  9845.         livemarkLinks.push({ href: wrapper.href,
  9846.                              type: wrapper.type,
  9847.                              title: wrapper.title});
  9848.  
  9849.         browserForLink.livemarkLinks = livemarkLinks;
  9850.         if ((browserForLink == gBrowser || browserForLink == gBrowser.mCurrentBrowser) && gLivemarksButton)
  9851.         gLivemarksButton.setAttribute("livemarks", "true");
  9852.  
  9853.     }
  9854. }
  9855.  
  9856. // this is called both from onload and also whenever the user
  9857. // switches tabs; we update whether we show or hide the livemark
  9858. // button based on whether the window has livemarks set.
  9859. function updatePageLivemarks()
  9860. {
  9861.     // browserDebug("~~~~~~ BROWSER.JS updatePageLivemarks() ~~~~~~~~\n");
  9862.  
  9863.     if (!gLivemarksButton)
  9864.     gLivemarksButton = document.getElementById("livemark-button");
  9865.  
  9866.     if (!gLivemarksButton)
  9867.         return;
  9868.  
  9869.     var livemarkLinks = gBrowser.mCurrentBrowser.livemarkLinks;
  9870.     if (!livemarkLinks || livemarkLinks.length == 0) {
  9871.  
  9872.         gLivemarksButton.removeAttribute("livemarks");
  9873.         gLivemarksButton.setAttribute("tooltiptext", gNavigatorBundle.getString("livemarkNoLivemarksTooltip"));
  9874.     } else {
  9875.  
  9876.         gLivemarksButton.setAttribute("livemarks", "true");
  9877.         gLivemarksButton.setAttribute("tooltiptext", gNavigatorBundle.getString("livemarkHasLivemarksTooltip"));
  9878.     }
  9879. }
  9880.  
  9881. // MERC - JCH: Called from nsHTMLPluginDocument.cpp to remove livemarks button
  9882. function wrappedUpdatePageLivemarks()
  9883. {
  9884.     // Clear livemark data
  9885.  
  9886.     gBrowser.mCurrentBrowser.livemarkLinks = null;
  9887.  
  9888.     updatePageLivemarks();
  9889. }
  9890.  
  9891.  
  9892. function livemarkFillPopup(menuPopup)
  9893. {
  9894. //    browserDebug("livemarkFillPopup() ~~~~~~~~\n");
  9895.     var livemarkLinks = gBrowser.mCurrentBrowser.livemarkLinks;
  9896.     if (livemarkLinks == null) {
  9897.         // XXX hack -- menu opening depends on setting of an "open"
  9898.         // attribute, and the menu refuses to open if that attribute is
  9899.         // set (because it thinks it's already open).  onpopupshowing gets
  9900.         // called after the attribute is unset, and it doesn't get unset
  9901.         // if we return false.  so we unset it here; otherwise, the menu
  9902.         // refuses to work past this point.
  9903.         menuPopup.parentNode.removeAttribute("open");
  9904.         return false;
  9905.     }
  9906.  
  9907.     if (livemarkLinks.length == 1) {
  9908.         menuPopup.parentNode.removeAttribute("open");
  9909.         loadURIWithOpenPref(livemarkLinks[0].href,"browser.tabs.searchbarresult.open", null, null);
  9910.         return false;
  9911.     }
  9912.  
  9913.   // MSD - I think the following may leak resources.  Should delete the result of the removeChild.
  9914.     while (menuPopup.firstChild) {
  9915.         menuPopup.removeChild(menuPopup.firstChild);
  9916.     }
  9917.  
  9918.     for (var i = 0; i < livemarkLinks.length; i++) {
  9919.         var markinfo = livemarkLinks[i];
  9920.  
  9921.         var menuItem = document.createElement("menuitem");
  9922.         var baseTitle = markinfo.title || markinfo.href;
  9923.         var labelStr = gNavigatorBundle.getFormattedString("livemarkVisit", [baseTitle]);
  9924.         menuItem.setAttribute("label", labelStr);
  9925.         menuItem.setAttribute("data", markinfo.href);
  9926.         menuItem.setAttribute("tooltiptext", markinfo.href);
  9927.         menuPopup.appendChild(menuItem);
  9928.     }
  9929.  
  9930.     return true;
  9931. }
  9932.  
  9933. function livemarkAddMark(wincontent, data, altRef)
  9934. {
  9935. //    browserDebug("~~~~~~ BROWSER.JS livemarkAddMark() ~~~~~~~~\n");
  9936.     var title = wincontent.document.title;
  9937.     //  BookmarksUtils.addLivemark(wincontent.document.baseURI, data, title);
  9938.     var refURI;
  9939.     if (altRef) {
  9940.         try {
  9941.             var channels = gBrowser.contentDocument.getElementsByTagName('channel');
  9942.             refURI = channels[0].getAttribute('rdf:about');
  9943.         } catch (ex) {}
  9944.     }
  9945.     if (!refURI) {
  9946.         refURI = wincontent.document.baseURI;
  9947.     }
  9948.  
  9949.     spui.addLivemark(refURI, data, title);
  9950.     reshuffleToolbars(true);
  9951. }
  9952.  
  9953. function updatePageFavIcon(aBrowser, aListener) {
  9954.     var uri = aBrowser.currentURI;
  9955.  
  9956.     if (!gBrowser.shouldLoadFavIcon(uri))
  9957.     return;
  9958.  
  9959.     // if we made it here with this null, then no <link> was found for
  9960.     // the page load.  We try to fetch a generic favicon.ico.
  9961.     if (aBrowser.mFavIconURL == null) {
  9962.         aBrowser.mFavIconURL = gBrowser.buildFavIconString(uri);
  9963. //        browserDebug( "))      WMWMWMWMWMW===> updatePageFavIcon built default path: \""+aBrowser.mFavIconURL+"\"\n" );
  9964.         // give it to the listener as well
  9965.         // XXX - there is no listener for non-tabbed-mode: this is why
  9966.         // the urlbar has no favicon when you switch from tabbed mode to
  9967.         // non-tabbed-mode.
  9968.         if (aListener)
  9969.         aListener.mIcon = aBrowser.mFavIconURL;
  9970.     }
  9971. //    browserDebug( "))      WMWMWMWMWMW===> updatePageFavIcon resulted in: \""+aBrowser.mFavIconURL+"\"\n" );
  9972.  
  9973.     if (aBrowser == gBrowser.mCurrentBrowser)
  9974.     PageProxySetIcon(aBrowser.mFavIconURL);
  9975.  
  9976.     if (aBrowser.mFavIconURL != null)
  9977.     BookmarksUtils.loadFavIcon(uri.spec, aBrowser.mFavIconURL);
  9978. }
  9979.  
  9980. function getUILink(item)
  9981. {
  9982.     var regionBundle = document.getElementById("bundle_browser_region");
  9983.  
  9984.     if (item == "tellAFriend")
  9985.     return regionBundle.getString("tellAFriendURL");
  9986.  
  9987.     if (item == "promote")
  9988.     return regionBundle.getString("promoteURL");
  9989.  
  9990.     return "";
  9991. }
  9992.  
  9993. function isBidiEnabled(){
  9994.     var rv = false;
  9995.  
  9996.     var systemLocale;
  9997.     try {
  9998.         var localService = Components.classes["@mozilla.org/intl/nslocaleservice;1"]
  9999.         .getService(Components.interfaces.nsILocaleService);
  10000.         systemLocale = localService.getSystemLocale().getCategory("NSILOCALE_CTYPE").substr(0,3);
  10001.     } catch (e){}
  10002.  
  10003.     rv = ( (systemLocale == "he-") || (systemLocale == "ar-") || (systemLocale == "syr") ||
  10004.     (systemLocale == "fa-") || (systemLocale == "ur-") );
  10005.  
  10006.     if (!rv) {
  10007.         // check the overriding pref
  10008.         var mPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  10009.         try {
  10010.             rv = mPrefs.getBoolPref("bidi.browser.ui");
  10011.         }
  10012.         catch (e){}
  10013.     }
  10014.  
  10015.     return rv;
  10016. }
  10017.  
  10018. function GetFrameDocumentsFromWindow(aWindow){
  10019.     if (aWindow.getComputedStyle(aWindow.document.body, "").direction == "ltr")
  10020.     aWindow.document.dir = "rtl";
  10021. else
  10022.     aWindow.document.dir = "ltr";
  10023.  
  10024.     for (var run = 0; run < aWindow.frames.length; run++)
  10025.     GetFrameDocumentsFromWindow(aWindow.frames[run]);
  10026. }
  10027.  
  10028. function SwitchDocumentDirection(){
  10029.     GetFrameDocumentsFromWindow(window.content);
  10030. }
  10031.  
  10032. function SwitchFocusedTextEntryDirection() {
  10033.     if (isBidiEnabled())
  10034.     {
  10035.         var focusedElement = document.commandDispatcher.focusedElement;
  10036.         if (focusedElement)
  10037.         if (window.getComputedStyle(focusedElement, "").direction == "ltr")
  10038.         focusedElement.style.direction = "rtl";
  10039.     else
  10040.         focusedElement.style.direction = "ltr";
  10041.     }
  10042. }
  10043.  
  10044.  
  10045. function missingPluginInstaller(){
  10046.     this.missingPlugins = new Object();
  10047. }
  10048.  
  10049. missingPluginInstaller.prototype.installSinglePlugin = function(aEvent){
  10050.   // Check if the event is trust-worthy.
  10051.   if (!aEvent.isTrusted) {
  10052.     return;
  10053.   }
  10054.     var tabbrowser = getBrowser();
  10055.     var missingPluginsArray = new Object;
  10056.  
  10057.     var tagMimetype;
  10058.     var pluginsPage;
  10059.   if (aEvent.target instanceof HTMLAppletElement) {
  10060.         tagMimetype = "application/x-java-vm";
  10061.   } else if (aEvent.target instanceof HTMLObjectElement) {
  10062.         tagMimetype = aEvent.target.type;
  10063.         pluginsPage = aEvent.target.getAttribute("codebase");
  10064.     } else {
  10065.         tagMimetype = aEvent.target.type;
  10066.         pluginsPage = aEvent.target.getAttribute("pluginspage");
  10067.     }
  10068.  
  10069.     missingPluginsArray[tagMimetype] = {mimetype: tagMimetype, pluginsPage: pluginsPage};
  10070.  
  10071.     if (missingPluginsArray) {
  10072.         window.openDialog("chrome://mozapps/content/plugins/pluginInstallerWizard.xul",
  10073.         "PFSWindow", "modal,chrome,resizable=yes", {plugins: missingPluginsArray, tab: tabbrowser.mCurrentTab});
  10074.     }
  10075.  
  10076.     aEvent.preventDefault();
  10077. }
  10078.  
  10079. missingPluginInstaller.prototype.newMissingPlugin = function(aEvent){
  10080.   // Check if the event is trust-worthy.
  10081.   if (!aEvent.isTrusted) {
  10082.     return;
  10083.   }
  10084.     // For broken non-object plugin tags, register a click handler so
  10085.     // that the user can click the plugin replacement to get the new
  10086.     // plugin. Object tags can, and often do, deal with that themselves,
  10087.     // so don't stomp on the page developers toes.
  10088.  
  10089.   if (!(aEvent.target instanceof HTMLObjectElement)) {
  10090.         aEvent.target.addEventListener("click",
  10091.         gMissingPluginInstaller.installSinglePlugin,
  10092.         false);
  10093.     }
  10094.  
  10095.     var tabbrowser = getBrowser();
  10096.     const browsers = tabbrowser.mPanelContainer.childNodes;
  10097.  
  10098.     var window = aEvent.target.ownerDocument.__parent__;
  10099.     // walk up till the toplevel window
  10100.     while (window.parent != window)
  10101.     window = window.parent;
  10102.  
  10103.     var i = 0;
  10104.     for (; i < browsers.length; i++) {
  10105.         if (tabbrowser.getBrowserAtIndex(i).contentWindow == window)
  10106.         break;
  10107.     }
  10108.  
  10109.     var tab = tabbrowser.mTabContainer.childNodes[i];
  10110.  
  10111.     if (!gMissingPluginInstaller.missingPlugins)
  10112.     gMissingPluginInstaller.missingPlugins = new Object();
  10113.  
  10114.     if (!gMissingPluginInstaller.missingPlugins[tab])
  10115.     gMissingPluginInstaller.missingPlugins[tab] = new Object();
  10116.  
  10117.     var tagMimetype;
  10118.     var pluginsPage;
  10119.   if (aEvent.target instanceof HTMLAppletElement) {
  10120.         tagMimetype = "application/x-java-vm";
  10121.   } else if (aEvent.target instanceof HTMLObjectElement) {
  10122.         tagMimetype = aEvent.target.type;
  10123.         pluginsPage = aEvent.target.getAttribute("codebase");
  10124.     } else {
  10125.         tagMimetype = aEvent.target.type;
  10126.         pluginsPage = aEvent.target.getAttribute("pluginspage");
  10127.     }
  10128.  
  10129.     gMissingPluginInstaller.missingPlugins[tab][tagMimetype] = {
  10130.         mimetype: tagMimetype,
  10131.         pluginsPage: pluginsPage
  10132.     };
  10133.  
  10134.         displayNotificationBar("missing-plugin", [tabbrowser.getBrowserAtIndex(i)]);
  10135. }
  10136.  
  10137. missingPluginInstaller.prototype.clearMissingPlugins = function(aTab){
  10138.     this.missingPlugins[aTab] = null;
  10139. }
  10140.  
  10141.  
  10142. missingPluginInstaller.prototype.observe = function(aSubject, aTopic, aData){
  10143.     switch (aTopic) {
  10144.         case "missing-plugin":
  10145.         // get the urls of missing plugins
  10146.         var tabbrowser = getBrowser();
  10147.         var missingPluginsArray = gMissingPluginInstaller.missingPlugins[tabbrowser.mCurrentTab];
  10148.  
  10149.         if (missingPluginsArray) {
  10150.             window.openDialog("chrome://mozapps/content/plugins/pluginInstallerWizard.xul",
  10151.             "PFSWindow", "modal,chrome,resizable=yes", {plugins: missingPluginsArray, tab: tabbrowser.mCurrentTab});
  10152.         }
  10153.         hideNotificationBar(tabbrowser, "xpi");
  10154.         // tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  10155.         break;
  10156.     }
  10157. }
  10158. var gMissingPluginInstaller = new missingPluginInstaller();
  10159.  
  10160. function AboutTabBrowsing() {
  10161.     var aboutPage = gPrefService.getCharPref("browser.tabs.abouturl");
  10162.  
  10163.     loadURI(aboutPage);
  10164. }
  10165.  
  10166. function AboutSiteControls() {
  10167.     var aboutPage = gPrefService.getCharPref("browser.sitecontrols.abouturl");
  10168.  
  10169.     loadURI(aboutPage);
  10170. }
  10171.  
  10172.  
  10173. function submitFormdata(fNew,fAction,fMeathod,elementList) {
  10174.     // fNew is boolean: true means open in a new tab, false means open in this tab
  10175.     // fAction is the URL for the post
  10176.     // fMeathod is "post" or "get"
  10177.     // elementList must be an Array() of element-value pairs
  10178.     //             where elementList[n].value is put into elementList[n].name input
  10179.     //                         NOTE: if elementList[n].type is defined it will be set as well
  10180.     //                               i.e. for passwords
  10181.     //initially, it puts the form onto an existing tab
  10182.     try {
  10183.         if (fNew) {
  10184.             BrowserOpenTab();
  10185.         }
  10186.         var myDoc=document.getElementById("content").selectedBrowser.contentDocument;
  10187.         var retval=document.getElementById("content").selectedBrowser;
  10188.         var body=myDoc.getElementsByTagName("body")[0];
  10189.         var myForm=myDoc.createElement("form");
  10190.         myForm.name="readyForMe";
  10191.         var newInput;
  10192.         if (!elementList || elementList.length < 1) {
  10193.             browserDebug("submitFormdata not doing much: no elements\n");
  10194.         } else {
  10195.             for (var i = 0;i<elementList.length;i++) {
  10196.                 newInput=myDoc.createElement("input");
  10197.                 newInput.name=elementList[i].name;
  10198.                 newInput.value=elementList[i].value;
  10199.                 if (elementList[i].type) {
  10200.                     newInput.type=elementList[i].type;
  10201.                 }
  10202.                 myForm.appendChild(newInput);
  10203.                 browserDebug("Added input name="+elementList[i].name+"\n");
  10204.             }
  10205.         }
  10206.         myForm.action=fAction;
  10207.         myForm.method=fMeathod;
  10208.         myForm.target="_self";
  10209.         body.appendChild(myForm);
  10210.         browserDebug("submitting form\n");
  10211.         myForm.submit();
  10212.         browserDebug("done submitPost()\n");
  10213.     } catch (ex) {
  10214.         browserDebug("Exception in submitFormdata\n");
  10215.         browserDebug(ex);
  10216.     }
  10217. }
  10218.  
  10219. function webmailHandleURI(urlStr,extra) {
  10220.     webmail.debug("webmailHandleURI();");
  10221.     webmail.handleURI(urlStr);
  10222. }
  10223.  
  10224. function SetTridentCookies(cookieStr)
  10225. {
  10226. //    browserDebug ("Setting Trident Cookies with " + cookieStr + "\n\n");
  10227.     return true;
  10228. }
  10229.  
  10230.  
  10231. function OpenSiteTrustSettings(aTabIndex) {
  10232.  
  10233.     if (aTabIndex == null)
  10234.         aTabIndex = 0;
  10235.  
  10236.     // not in tabbed mode, ignore this action
  10237.     if (gPrefService.getBoolPref("browser.tabs.autoHide") &&  gBrowser.mTabContainer.childNodes.length < 2)
  10238.         return;
  10239.  
  10240.     var myTab = gBrowser.mCurrentTab;
  10241.  
  10242.     // if we're not in tabbed mode, then do nothing
  10243.     if (!myTab) return;
  10244.  
  10245.     var siteControlPopup = document.getElementById('SiteControlsPopup');
  10246.  
  10247.     var scTabbox = document.getElementById('scp_tabbox');
  10248.     if (scTabbox)
  10249.         scTabbox.selectedIndex=aTabIndex;
  10250.  
  10251.     // wrap around a timeout function to avoid conflicting popup focuses
  10252.     if (siteControlPopup) {
  10253.         setTimeout("document.getElementById('SiteControlsPopup').showPopup(gBrowser.mCurrentTab, -1, -1, 'popup', 'bottomleft', 'topleft');",100);
  10254.     }
  10255.     event.preventBubble();
  10256.  
  10257. }
  10258.  
  10259.  
  10260. //MERC (CCOTE) Set tooltip text for a menu item in the pop-up menu blocker(Enable/Disable pop-up blocker)
  10261. // The tooltiptext for a menu item was not behaving properly to fix the problem this function was created
  10262. function setTooltiptext()
  10263. {
  10264.     // Get the menu element that we will be working with
  10265.     var menuitem = document.getElementById("popupblocker-onoff");
  10266.     var menuname=  menuitem.label;
  10267.  
  10268.     if (menuname =="Enable pop-up blocker"){
  10269.         menuitem.setAttribute("tooltiptext", "Turn pop-up blocking on");
  10270.     }
  10271.     else{
  10272.         menuitem.setAttribute("tooltiptext", "Turn pop-up blocking off");
  10273.     }
  10274. }
  10275.  
  10276. // BC: Logout User
  10277. function logOutUser() {
  10278.     if (!canQuitApplication())
  10279.   return;
  10280.  
  10281.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  10282.     var windowManagerInterface = windowManager.QueryInterface( Components.interfaces.nsIWindowMediator);
  10283.     var enumerator = windowManagerInterface.getEnumerator( null );
  10284.     var appShell = Components.classes['@mozilla.org/appshell/appShellService;1'].getService();
  10285.     appShell = appShell.QueryInterface( Components.interfaces.nsIAppShellService );
  10286.  
  10287.     // flag to see if the user clicked no on confirmation to close any of the windows
  10288.     var stillExit = true;
  10289.  
  10290.     var nativeAppSupport = null;
  10291.     try {
  10292.       nativeAppSupport = appShell.nativeAppSupport;
  10293.     }
  10294.     catch ( ex ) {
  10295.     }
  10296.  
  10297.     //loop through each window in the application
  10298.     while ( enumerator.hasMoreElements()  && stillExit)
  10299.     {
  10300.        var domWindow = enumerator.getNext();
  10301.        if (("tryToClose" in domWindow) && !domWindow.tryToClose())
  10302.          return false;
  10303.  
  10304.       // if the user has multiple tabs open in a window confirm
  10305.       if (userConfirms(domWindow)) {
  10306.            domWindow.close();
  10307.       } else {
  10308.           var stillExit = false;
  10309.       }
  10310.     };  if (!canQuitApplication())
  10311.       return;
  10312.  
  10313.   if (stillExit) {
  10314.         appShell.restartBrowser(); // This can also be appShell.quit(Components.interfaces.nsIAppShellService.eRestartQuit);
  10315.         return false;
  10316.     }
  10317.  
  10318.     return true;
  10319. }
  10320. /*****
  10321.  * MERC (rpaul) - object to observe download completion and to execute the downloaded
  10322.  * file based on site control
  10323. */
  10324. function gDownloads() {}
  10325.  
  10326. gDownloads.prototype = {
  10327.     os: null,
  10328.  
  10329.     register: function() {
  10330.     os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  10331.     // MERC (rpaul) add the download done topic to the observer service
  10332.     if (os)
  10333.         os.addObserver(this, 'dl-done', false);
  10334.     },
  10335.  
  10336.     unregister: function() {
  10337.         if (os)
  10338.             os.removeObserver(this, "dl-done");
  10339.     },
  10340.  
  10341.     observe: function(subject, topic, data) {
  10342.          if (topic == "dl-done") {
  10343.                  var dl = subject.QueryInterface(Components.interfaces.nsIDownload);
  10344.                  var rv = false;
  10345.                  var confirmLaunch = true;
  10346.                 if (dl){
  10347.                     var site = sitecontrols.SCSVC.getResourceForURI(dl.source.spec);
  10348.                     if (site) {
  10349.                         var runPrograms = sitecontrols.SCSVC.readSiteControlResource(site, 'allowRunPrograms');
  10350.                         var path = dl.targetFile.path;
  10351.                         if (runPrograms == "true" && path.substring(path.length - 4, path.length) == ".exe")
  10352.                         {
  10353.                             confirmLaunch = sitecontrols.SCSVC.readSiteControlResource(site, 'askBeforeRunning');
  10354.                             if (confirmLaunch == "true"){
  10355.                                 const IPS = Components.interfaces.nsIPromptService;
  10356.                                 var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  10357.                                    .getService(IPS);
  10358.                         var msg = "Netscape is attempting to launch the file: \n\n" + path;
  10359.                         msg += "\n\nDo you want to continue ? ";
  10360.                                 rv = ps.confirm(window, "Run Program", msg);
  10361.                             } // end confirm launch
  10362.  
  10363.                             if (rv == true || confirmLaunch == "false")
  10364.                                 dl.targetFile.launch();
  10365.  
  10366.                         }
  10367.                     }
  10368.             }
  10369.         }
  10370.     },
  10371. }
  10372.  
  10373. function ToggleSecurityDashboard() {
  10374.     if (dashboard && dashboard.mDashboardWindow == null) {
  10375.         dashboard.init();
  10376.         OpenDashboardWindow('scroll');
  10377.     } else if (dashboard.mDashboardWindow) {
  10378.         CloseDashboardWindow();
  10379.     }
  10380. }
  10381. /*****
  10382.  * MERC (rpaul) - Opens the security dashboard
  10383.  * @param aEffect: one of "fade", "scroll", "none"
  10384. */
  10385. function OpenDashboardWindow(aEffect) {
  10386.     if (aEffect == null) {
  10387.         aEffect = "none";
  10388.     } 
  10389.     if (dashboard.mDashboardWindow != null)
  10390.         return;
  10391.     
  10392.     var params = {gBrowser: gBrowser,
  10393.                                 sitecontrols: sitecontrols,
  10394.                               dashboard: dashboard,
  10395.                               threatsQueue: threatsQueue,
  10396.                               balloonhelp: balloonhelp,
  10397.                               effectType: aEffect,
  10398.                               spyWareScanner: spyWareScanner,
  10399.                                 }
  10400.  
  10401.     // MERC: (rpaul) for BLT Bug #: 211283: the window name has to be unique for every browser window
  10402.     // otherwise, the params will be associated with the first window name, hence window.arguments will be null
  10403.     // for every subsequent new browser window!
  10404.     var windowName = "securityDashboard" + document.getElementById('main-window').getAttribute('windowID');
  10405.     // hold reference to this window so when it is open, the main window can have a handle to it.
  10406.     dashboard.mDashboardWindow = window.openDialog("chrome://browser/content/securitydashboard/dashboard.xul",windowName,"chrome, alwaysRaised, dependent", params);
  10407.     
  10408.     if (dashboard.mDashboardWindow != null) {
  10409.         var secDash = document.getElementById('securityDashboard');        
  10410.         if (secDash && !secDash.hasAttribute('isOpen')) {
  10411.             secDash.setAttribute('isOpen', true);
  10412.         }
  10413.     }
  10414. }
  10415.  
  10416. function CloseDashboardWindow() {
  10417.     if (dashboard.mDashboardWindow != null)
  10418.         dashboard.mDashboardWindow.ScrollDown();
  10419. }
  10420.  
  10421. function RestoreDashboard() {
  10422.     if (dashboard.mDashboardWindow != null)
  10423.         return;
  10424.     var secDash = document.getElementById('securityDashboard');
  10425.     if (secDash) {
  10426.         if (secDash.hasAttribute('isOpen')) {
  10427.             dashboard.mDashboardWindow = null;
  10428.             OpenDashboardWindow();
  10429.         }
  10430.     }    
  10431. }
  10432.