home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 October / Gamestar_77_2005-10_dvd.iso / Programy / nsb-install-8-0.exe / chrome / browser.jar / content / browser / search / search-panel.js < prev    next >
Encoding:
Text File  |  2005-07-29  |  40.6 KB  |  1,299 lines

  1. /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* ***** BEGIN LICENSE BLOCK *****
  3.  * Version: NPL 1.1/GPL 2.0/LGPL 2.1
  4.  *
  5.  * The contents of this file are subject to the Netscape Public License
  6.  * Version 1.1 (the "License"); you may not use this file except in
  7.  * compliance with the License. You may obtain a copy of the License at
  8.  * http://www.mozilla.org/NPL/
  9.  *
  10.  * Software distributed under the License is distributed on an "AS IS" basis,
  11.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12.  * for the specific language governing rights and limitations under the
  13.  * License.
  14.  *
  15.  * The Original Code is mozilla.org code.
  16.  *
  17.  * The Initial Developer of the Original Code is 
  18.  * Netscape Communications Corporation.
  19.  * Portions created by the Initial Developer are Copyright (C) 1998
  20.  * the Initial Developer. All Rights Reserved.
  21.  *
  22.  * Contributor(s):
  23.  *    Robert John Churchill   <rjc@netscape.com> (Original Author)
  24.  *    Peter Annema            <disttsc@bart.nl>
  25.  *    Blake Ross              <blakeross@telocity.com>
  26.  *    Ben Goodger             <ben@netscape.com>
  27.  *    Rob Ginda               <rginda@netscape.com>
  28.  *    Steve Lamm              <slamm@netscape.com>
  29.  *    Samir Gehani            <sgehani@netscape.com>
  30.  *
  31.  * Alternatively, the contents of this file may be used under the terms of
  32.  * either the GNU General Public License Version 2 or later (the "GPL"), or 
  33.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  34.  * in which case the provisions of the GPL or the LGPL are applicable instead
  35.  * of those above. If you wish to allow use of your version of this file only
  36.  * under the terms of either the GPL or the LGPL, and not to allow others to
  37.  * use your version of this file under the terms of the NPL, indicate your
  38.  * decision by deleting the provisions above and replace them with the notice
  39.  * and other provisions required by the GPL or the LGPL. If you do not delete
  40.  * the provisions above, a recipient may use your version of this file under
  41.  * the terms of any one of the NPL, the GPL or the LGPL.
  42.  *
  43.  * ***** END LICENSE BLOCK ***** */
  44.  
  45. const ISEARCH_CONTRACTID       = "@mozilla.org/rdf/datasource;1?name=internetsearch";
  46. const RDFSERVICE_CONTRACTID    = "@mozilla.org/rdf/rdf-service;1";
  47. const BMARKS_CONTRACTID        = "@mozilla.org/browser/bookmarks-service;1";
  48.  
  49. const nsIBookmarksService      = Components.interfaces.nsIBookmarksService;
  50. const nsIRDFService            = Components.interfaces.nsIRDFService;
  51. const nsIRDFLiteral            = Components.interfaces.nsIRDFLiteral;
  52. const nsIRDFDataSource         = Components.interfaces.nsIRDFDataSource;
  53. const nsIRDFRemoteDataSource   = Components.interfaces.nsIRDFRemoteDataSource;
  54. const nsIInternetSearchService = Components.interfaces.nsIInternetSearchService;
  55.  
  56. const DEBUG = false;
  57.  
  58. var debug;
  59. if (!DEBUG)
  60. {
  61.   debug = function(msg) {};
  62. }
  63. else
  64. {
  65.   debug = function(msg)
  66.   {
  67.     dump("\t ^^^ search-panel.js: " + msg + "\n");
  68.   };
  69. }
  70.  
  71. var rootNode;
  72. var textArc;
  73. var modeArc;
  74. var searchBundle;
  75. var regionalBundle;
  76. var gSearchButtonText = null;
  77. var gStopButtonText = null;
  78.  
  79. var sidebarInitiatedSearch = false;
  80.  
  81. var RDF_observer =
  82. {
  83.   onAssert : function(ds, src, prop, target)
  84.   {
  85.     if (src == rootNode) {
  86.       if (prop == textArc)
  87.         rememberSearchText(target);
  88.       else if (prop == modeArc)
  89.         updateSearchMode();
  90.     }
  91.   },
  92.  
  93.   onUnassert : function(ds, src, prop, target)
  94.   {
  95.   },
  96.  
  97.   onChange : function(ds, src, prop, old_target, new_target)
  98.   {
  99.     if (src == rootNode) {
  100.       if (prop == textArc)
  101.         rememberSearchText(new_target);
  102.       else if (prop == modeArc)
  103.         updateSearchMode();
  104.     }
  105.   },
  106.  
  107.   onMove : function(ds, old_src, new_src, prop, target)
  108.   {
  109.   },
  110.  
  111.   onBeginUpdateBatch : function(ds)
  112.   {
  113.   },
  114.  
  115.   onEndUpdateBatch   : function(ds)
  116.   {
  117.   }
  118. }
  119.  
  120. function showStack() {
  121.     dump("\n STACK DUMP: \n");
  122.     try {
  123.         var borkbork = 1 / 0;
  124.         var foobar;
  125.         foobar.Cannibal;
  126.         throw "foobar";
  127.     } catch (e){
  128.         dump(e.stack);
  129.     }
  130. }
  131.  
  132. // This gets called when page loads or rdf loaded.
  133. function rememberSearchText(target)
  134. {
  135.   if (sidebarInitiatedSearch) {
  136.     // this avoids updating the sidebar textbox twice
  137.     return;
  138.   }
  139.   if (target) {
  140.     target = target.QueryInterface(nsIRDFLiteral).Value;
  141.     if (target) {
  142.       // convert plusses (+) back to spaces
  143.       target = target.replace(/\+/g, " ");
  144.       var textNode = document.getElementById("sidebar-search-text");
  145.  
  146.       if (target != textNode.value) {
  147.         // category is unknown, therefore use "All Engines"
  148.         var categoryPopup = document.getElementById( "categoryPopup" );
  149.         var categoryList = document.getElementById( "categoryList" );
  150.         if (categoryPopup && categoryList) {
  151.           categoryList.selectedItem = categoryPopup.childNodes[0];
  152.         }
  153.       }
  154.  
  155.       textNode.value = decodeURI(target);
  156.       
  157.       doEnabling();
  158.     }
  159.   }
  160.   
  161.   // show the results tab
  162.   switchTab(0);
  163. }
  164.  
  165. function getIndexToSelect(haveDefault, defaultEngine, enginePopup)
  166. {
  167.     if (haveDefault)
  168.     {
  169.         // iterate over constrained engine list for a default engine match
  170.         for (var i = 0; i < enginePopup.childNodes.length; ++i)
  171.         {
  172.             if (enginePopup.childNodes[i].id == defaultEngine)
  173.             {
  174.                 // found match with default engine!
  175.                 return i;
  176.             }
  177.         }
  178.     }
  179.  
  180.     return 0; // default to first engine at index '0'
  181. }
  182.  
  183. function getMinVer()
  184. {
  185.   var minVerStr = nsPreferences.
  186.     copyUnicharPref("browser.search.basic.min_ver");
  187.   var minVer = parseFloat(minVerStr);
  188.   if (isNaN(minVer))
  189.     minVer = 0; // no pref or not a number so default to min ver 0.0
  190.  
  191.   debug("Float value of minVer = " + minVer);
  192.   return minVer;
  193. }
  194.  
  195. /** 
  196.  * Constrain the list of engines to only those that
  197.  * contain ver >= browser.search.basic.min_ver pref 
  198.  * value to be displayed in the basic popup list of 
  199.  * engines.
  200.  */
  201. function constrainBasicList()
  202. {
  203.   debug("constrainBasicList");
  204.  
  205.   var basicEngineMenu = document.getElementById("basicEngineMenu");
  206.   if (!basicEngineMenu)
  207.   {
  208.     debug("Ack!  basicEngineList is empty!");
  209.     return;
  210.   }
  211.  
  212.   var basicEngines = basicEngineMenu.childNodes[1];
  213.   var len = basicEngines.childNodes.length;
  214.   var currDesc;
  215.   var currVer;
  216.   var haveDefault = false;
  217.  
  218.   debug("Found " + len + " sherlock plugins.");
  219.  
  220.   // MERC - JCH: GET THE PERSISTED SEARCH ENGINE AS SET IN SIDEBAR SEARCH OR NAV BAR SEARCH DROPDOWN MENUS
  221.   var broadcaster = window.top.document.getElementById('searchEngineBroadcaster');
  222.   var defaultEngine = broadcaster.getAttribute("searchengine");
  223.  
  224.   //var defaultEngine = nsPreferences.
  225.    // copyUnicharPref("browser.search.defaultengine");
  226.  
  227.   // we constrain the basic list to all engines with ver >= minVer
  228.   var minVer = getMinVer();
  229.  
  230.   for (var i = 0; i < len; ++i)
  231.   {
  232.     currDesc = basicEngines.childNodes[i].getAttribute("desc");
  233.     debug("Engine[" + i + "] = " + currDesc);
  234.  
  235.     // only keep AOL and Netscape
  236.     var keepIt = false;
  237.     var currName = basicEngines.childNodes[i].getAttribute("label");
  238.     if(currName == "AOL" || currName == "Netscape") {
  239.         keepIt = true;
  240.     }
  241.  
  242.     // make sure we leave the default engine (check if we already have 
  243.     // the default to avoid duplicates)
  244. //    if (basicEngines.childNodes[i].id == defaultEngine && !haveDefault)
  245. //    {
  246. //      haveDefault = true;
  247. //    }
  248. //    else
  249.     {
  250.       // remove if not a basic engine
  251.       currVer = basicEngines.childNodes[i].getAttribute("ver");
  252.       
  253.       if (!currVer || isNaN(parseFloat(currVer)))
  254.       {
  255.         // missing version attr or not a number: default to ver 1.0
  256.         currVer = 1;
  257.       }
  258.       debug("Version of " + (currDesc ? currDesc : "<unknown>") + 
  259.             " is: " + currVer);
  260.  
  261.       if (parseFloat(currVer) < minVer || !keepIt)
  262.       {
  263.         try
  264.         {
  265.           basicEngines.removeChild(basicEngines.childNodes[i]);
  266.           --i;
  267.           --len;
  268.         }
  269.         catch (ex)
  270.         {
  271.           debug("Exception: Couldn't remove " + currDesc +
  272.                 " from engine list!");
  273.         }
  274.       }
  275.     }
  276.   }
  277.  
  278.   // mark selected engine
  279.   var selected = getIndexToSelect(haveDefault, defaultEngine, basicEngines);
  280.   basicEngineMenu.selectedItem = basicEngines.childNodes[selected];
  281. }
  282.  
  283. function updateSearchMode()
  284. {
  285.   debug("updateSearchMode");
  286.  
  287.   var searchMode = nsPreferences.getIntPref("browser.search.mode");
  288.   var categoryBox = document.getElementById("categoryBox");
  289.   var basicBox = document.getElementById("basicBox");
  290.  
  291.   debug("search mode is " + searchMode);
  292.   if (searchMode == 0)
  293.   {
  294.     categoryBox.setAttribute("collapsed", "true");
  295.     basicBox.removeAttribute("collapsed");
  296.     switchTab(0);
  297.  
  298.     constrainBasicList();
  299.   }
  300.   else
  301.   {
  302.     categoryBox.removeAttribute("collapsed");
  303.     basicBox.setAttribute("collapsed", "true");
  304.     switchTab(1);
  305.   }
  306.  
  307.   return searchMode;
  308. }
  309.  
  310. function readRDFString(aDS,aRes,aProp) {
  311.     // Put in try catch incase aDS is not a the right type
  312.     try {
  313.       var n = aDS.GetTarget(aRes, aProp, true);
  314.       if (n)
  315.         return n.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  316.   } catch (ex) {
  317.   }
  318.   return null;
  319. }
  320.  
  321.  
  322. function ensureDefaultEnginePrefs(aRDF,aDS) 
  323. {
  324.   var prefbranch = Components.classes["@mozilla.org/preferences-service;1"]
  325.                              .getService(Components.interfaces.nsIPrefBranch);
  326.   var defaultName = prefbranch.getComplexValue("browser.search.defaultenginename",
  327.                                                Components.interfaces.nsIPrefLocalizedString).data;
  328.   var kNC_Root = aRDF.GetResource("NC:SearchEngineRoot");
  329.   var kNC_child = aRDF.GetResource("http://home.netscape.com/NC-rdf#child");
  330.   var kNC_Name = aRDF.GetResource("http://home.netscape.com/NC-rdf#Name");
  331.           
  332.   var arcs = aDS.GetTargets(kNC_Root, kNC_child, true);
  333.   while (arcs.hasMoreElements()) {
  334.     var engineRes = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  335.     var name = readRDFString(aDS, engineRes, kNC_Name);
  336.     if (name == defaultName)
  337.       prefbranch.setCharPref("browser.search.defaultengine", engineRes.Value);
  338.   }
  339. }
  340.  
  341. function AskChangeDefaultEngine(aSelectedEngine)
  342. {
  343.   const kDontAskAgainPref  = "browser.search.set_default.dont_ask_again";
  344.   const kDefaultEnginePref = "browser.search.defaultengine";
  345.  
  346.   // don't prompt user if selection is same as old default engine
  347.   var oldDefault = nsPreferences.copyUnicharPref(kDefaultEnginePref);
  348.   if (aSelectedEngine.getAttribute("value") == oldDefault)
  349.     return;
  350.  
  351.   // check "don't ask again" pref
  352.   var dontAskAgain = nsPreferences.getBoolPref(kDontAskAgainPref, false);
  353.   var change = false; // should we change the default engine?
  354.  
  355.   // if "don't ask again" pref was set
  356.   if (dontAskAgain)
  357.   {
  358.     change = true;
  359.   }
  360.   else
  361.   {
  362.     // prompt user if we should change their default engine
  363.     var promptSvc = Components.
  364.                       classes["@mozilla.org/embedcomp/prompt-service;1"].
  365.                       getService(Components.interfaces.nsIPromptService);
  366.     if (!promptSvc)
  367.       return;
  368.     var title = searchBundle.getString("changeEngineTitle"); 
  369.     var dontAskAgainMsg = searchBundle.getString("dontAskAgainMsg"); 
  370.     var engineName = aSelectedEngine.getAttribute("label");
  371.     if (!engineName || engineName == "")
  372.       engineName = searchBundle.getString("thisEngine");
  373.     var changeEngineMsg = searchBundle.stringBundle.formatStringFromName(
  374.                           "changeEngineMsg", [engineName], 1); 
  375.  
  376.     var checkbox = {value:0};
  377.     change = promptSvc.confirmCheck(window, title, changeEngineMsg, 
  378.                dontAskAgainMsg, checkbox);
  379.  
  380.     // store "don't ask again" pref from checkbox value (if changed)
  381.     debug("dontAskAgain: " + dontAskAgain);
  382.     debug("checkbox.value: " + checkbox.value);
  383.     if (checkbox.value != dontAskAgain)
  384.       nsPreferences.setBoolPref(kDontAskAgainPref, checkbox.value);
  385.   }
  386.  
  387.   // if confirmed true, i.e., change default engine, then set pref
  388.   if (change)
  389.     nsPreferences.setUnicharPref(kDefaultEnginePref, aSelectedEngine.value);
  390.  
  391.   disableNavButtons();
  392. }
  393.  
  394. function disableNavButtons()
  395. {
  396.   var nextButton = document.getElementById("next-results");
  397.   var prevButton = document.getElementById("prev-results");
  398.   if (nextButton && nextButton.getAttribute("disabled") != "true")
  399.     nextButton.setAttribute("disabled", "true");
  400.   if (prevButton && prevButton.getAttribute("disabled") != "true")
  401.     prevButton.setAttribute("disabled", "true");
  402. }
  403.  
  404. function ensureSearchPref()
  405. {
  406.   var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  407.                       .getService(Components.interfaces.nsIRDFService);
  408.   var prefbranch = Components.classes["@mozilla.org/preferences-service;1"]
  409.                              .getService(Components.interfaces.nsIPrefBranch);
  410.   var ds = rdf.GetDataSource("rdf:internetsearch");
  411.   var kNC_Name = rdf.GetResource("http://home.netscape.com/NC-rdf#Name");
  412.   var defaultEngine;
  413.  
  414.   try {
  415.     defaultEngine = prefbranch.getCharPref("browser.search.defaultengine");
  416.   } catch(ex) {
  417.     ensureDefaultEnginePrefs(rdf, ds);
  418.     defaultEngine = prefbranch.getCharPref("browser.search.defaultengine");
  419.   }
  420. }
  421.  
  422. // Initialize the Search panel:
  423. // 1) init the category list
  424. // 2) load the search engines associated with this category
  425. // 3) initialize the checked state of said engines
  426. function SearchPanelStartup()
  427. {
  428.  
  429.   searchBundle = document.getElementById("searchBundle");
  430.  
  431.   var rdf  = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  432.   rootNode = rdf.GetResource("NC:LastSearchRoot", true);
  433.   textArc  = rdf.GetResource("http://home.netscape.com/NC-rdf#LastText", true);
  434.   modeArc  = rdf.GetResource("http://home.netscape.com/NC-rdf#SearchMode", true);
  435.   
  436.   ensureSearchPref()
  437.   
  438.   var resultList = document.getElementById("resultList");
  439.   resultList.database.AddObserver(RDF_observer);
  440.  
  441.   var categoryList = document.getElementById("categoryList");
  442.   var internetSearch = Components.classes[ISEARCH_CONTRACTID].getService(nsIInternetSearchService);
  443.   var catDS = internetSearch.GetCategoryDataSource();
  444.   if (catDS) {
  445.     catDS = catDS.QueryInterface(nsIRDFDataSource);
  446.     categoryList.database.AddDataSource(catDS);
  447.     categoryList.builder.rebuild();
  448.     var engineList = document.getElementById("searchengines");
  449.     engineList.database.AddDataSource(catDS);
  450.     engineList.builder.rebuild();
  451.     engineList.addEventListener("CheckboxStateChange", saveEngine, false);
  452.   }
  453.  
  454.   // try and determine last category name used
  455.   var lastCategoryName = nsPreferences.copyUnicharPref("browser.search.last_search_category", "");
  456.   if (lastCategoryName) {
  457.     // strip off the prefix if necessary
  458.     var prefix = "NC:SearchCategory?category=";
  459.     if (lastCategoryName.indexOf(prefix) == 0)
  460.       lastCategoryName = lastCategoryName.substr(prefix.length);
  461.   }
  462.  
  463.   // select the appropriate category
  464.   var categoryPopup = document.getElementById("categoryPopup");
  465.   var found = false;
  466.   for (var i = 0; i < categoryPopup.childNodes.length; ++i) {
  467.     if (lastCategoryName == "" &&
  468.         categoryPopup.childNodes[i].getAttribute("value") == "NC:SearchEngineRoot" ||
  469.         categoryPopup.childNodes[i].getAttribute("id") == lastCategoryName)
  470.     {
  471.       categoryList.selectedItem = categoryPopup.childNodes[i];
  472.       found = true;
  473.       break;
  474.     }
  475.   }
  476.   if (!found)
  477.     categoryList.selectedItem = categoryPopup.childNodes[0];
  478.  
  479.   if (!lastCategoryName)
  480.     lastCategoryName = "NC:SearchEngineRoot";
  481.   else if (lastCategoryName != "NC:SearchEngineRoot")
  482.     lastCategoryName = "NC:SearchCategory?category=" + lastCategoryName;
  483.  
  484.   var treeNode = document.getElementById("searchengines");
  485.   treeNode.setAttribute("ref", lastCategoryName);
  486.  
  487.   loadEngines(lastCategoryName);
  488.  
  489.   // MERC (ccampbell): now observes a broadcaster in browser.xul scope
  490.   var broadcaster = window.top.document.getElementById('searchEngineBroadcaster');
  491.   debug('initializing search engine observer [ broadcaster: '+broadcaster+' ]');
  492.   var engineList = document.getElementById('basicEngineMenu');
  493.   //document.addBroadcastListenerFor(broadcaster, engineList, 'searchengine');
  494.   //document.addBroadcastListenerFor(broadcaster, engineList, 'src');
  495.   broadcaster.addEventListener("DOMAttrModified", onSearchEngineChanged, false);
  496.  
  497.   // if we have search results, show them, otherwise show engines
  498.   if (updateSearchMode() != 0)
  499.   {
  500.     if (haveSearchResults())
  501.       switchTab(0);
  502.     else
  503.       switchTab(1);
  504.   }
  505. }
  506.  
  507.  
  508. // MERC (ccampbell)
  509. function onSearchEngineChanged(evt) {
  510.   debug('onSearchEngineChanged()');
  511.  
  512.   // We are only going to react to changes to the 'searchengine' attribute
  513.   if (evt.attrName != 'searchengine')
  514.     return;
  515.  
  516.   // If the new value is the same as the current engine selection, bail out
  517.   var engineList = document.getElementById('basicEngineMenu');
  518.   if (evt.newValue == engineList.getAttribute('value')) {
  519.     debug('  no change!');
  520.     return;
  521.   }
  522.   debug('  changing engine to: '+evt.newValue+'\n');
  523.  
  524.   var engines = engineList.menupopup;
  525.   debug('  there are '+engines.childNodes.length+' items to check against');
  526.   for (var i = 0; i < engines.childNodes.length; i++) {
  527.     var thisVal = engines.childNodes[i].getAttribute('value');
  528.     debug('    checking against: '+thisVal);
  529.     if (thisVal == evt.newValue) {
  530.       debug('      CHANGING MENU!\n');
  531.       engineList.selectedItem = engines.childNodes[i];
  532.       return;
  533.     }
  534.   }
  535. }
  536.  
  537.  
  538. // MERC (ccampbell)
  539. function searchEngineSelected(evt) {
  540.   debug('searchEngineSelected()');
  541.   var broadcaster = window.top.document.getElementById('searchEngineBroadcaster');
  542.   var engineList = document.getElementById('basicEngineMenu');
  543.  
  544.   broadcaster.setAttribute('searchengine',engineList.getAttribute('value'));
  545.   broadcaster.setAttribute('src',engineList.getAttribute('src'));
  546. }
  547.  
  548.  
  549. function haveSearchResults()
  550. {
  551.   var ds = document.getElementById("resultList").database;
  552.   if (!ds)
  553.     return false;
  554.  
  555.   var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  556.   var source = rdf.GetResource("NC:LastSearchRoot", true);
  557.   var childProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#LastText", true);
  558.   var target = ds.GetTarget(source, childProperty, true);
  559.   if (target) {
  560.     target = target.QueryInterface(nsIRDFLiteral).Value;
  561.     if (target) {
  562.       // convert plusses (+) back to spaces
  563.       target = target.replace(/\+/g, " ");
  564.       var textNode = document.getElementById("sidebar-search-text");
  565.       textNode.value = decodeURI(target);
  566.       return true;
  567.     }
  568.   }
  569.   return false;
  570. }
  571.  
  572. function getNumEngines()
  573. {
  574.   var listbox = document.getElementById("searchengines");
  575.   return listbox.getElementsByTagName("listitem").length;
  576. }
  577.  
  578. function chooseCategory(aNode)
  579. {
  580.   var category = !aNode.id ? "NC:SearchEngineRoot" :
  581.                              "NC:SearchCategory?category=" + aNode.getAttribute("id");
  582.   nsPreferences.setUnicharPref("browser.search.last_search_category", category);
  583.  
  584.   var treeNode = document.getElementById("searchengines");
  585.   treeNode.setAttribute("ref", category);
  586.  
  587.   loadEngines(category);
  588. }
  589.  
  590. function saveEngine(event)
  591. {
  592.   var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  593.   var localStore = rdf.GetDataSource("rdf:local-store");
  594.   if (!localStore)
  595.     return;
  596.  
  597.   var checkedProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#checked", true);
  598.   var engines = event.currentTarget;
  599.   var categorySRC = rdf.GetResource(engines.ref, true);
  600.  
  601.   var itemNode = event.target;
  602.   var engineSRC = rdf.GetResource(itemNode.id, true);
  603.  
  604.   if (itemNode.checked)
  605.     localStore.Assert(categorySRC, checkedProperty, engineSRC, true);
  606.   else
  607.     localStore.Unassert(categorySRC, checkedProperty, engineSRC, true);
  608.  
  609.   // save changes; flush out the localstore
  610.   try {
  611.     var flushableStore = localStore.QueryInterface(nsIRDFRemoteDataSource);
  612.     flushableStore.Flush();
  613.   }
  614.   catch (ex) {}
  615. }
  616.  
  617. // initialize the appropriate engine list, and the checked state of the engines
  618. function loadEngines(aCategory)
  619. {
  620.   var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  621.   var localStore = rdf.GetDataSource("rdf:local-store");
  622.   if (localStore) {
  623.     var engineBox = document.getElementById("searchengines");
  624.     var numEngines = engineBox.childNodes.length;
  625.     var checkedProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#checked", true);
  626.     var categorySRC = rdf.GetResource(aCategory, true);
  627.     for (var x = 0; x < numEngines; ++x) {
  628.       var listitemNode = engineBox.childNodes[x];
  629.       if (listitemNode.localName == "listitem") {
  630.         var engineURI = listitemNode.getAttribute("id");
  631.         var engineSRC = rdf.GetResource(engineURI, true);
  632.   
  633.         var hasAssertion = localStore.HasAssertion(categorySRC, checkedProperty, engineSRC, true);
  634.         if (hasAssertion)
  635.           listitemNode.checked = true;
  636.       }
  637.     }
  638.   }
  639. }
  640.  
  641. function SearchPanelShutdown()
  642. {
  643.   var tree = document.getElementById("resultList");
  644.   tree.database.RemoveObserver(RDF_observer);
  645. }
  646.  
  647. function doStop()
  648. {
  649.   if (!gSearchButtonText)
  650.     gSearchButtonText = searchBundle.getString("searchButtonText");
  651.  
  652.   var searchButtonNode = document.getElementById("searchButton");
  653.   searchButtonNode.removeAttribute("stop");
  654.   searchButtonNode.setAttribute("label", gSearchButtonText);
  655.  
  656.   // should stop button press also stop the load of the page in the browser? I think so.
  657.   var progressNode = parent.document.getElementById("statusbar-icon");
  658.   if (progressNode)
  659.     progressNode.setAttribute("mode", "normal");
  660.  
  661.   // stop any network connections
  662.   var internetSearchService = Components.classes[ISEARCH_CONTRACTID].getService(nsIInternetSearchService);
  663.   internetSearchService.Stop();
  664.  
  665.   // show appropriate column(s)
  666.   var navWindow = getNavigatorWindow(false);
  667.   var resultsList = navWindow ? navWindow._content.document.getElementById("resultsList") : null;
  668.   if (!resultsList)
  669.     return;
  670.  
  671.   var searchURL = resultsList.getAttribute("ref");
  672.   if (!searchURL)
  673.     return;
  674.  
  675.   var internetSearch = internetSearchService.QueryInterface(nsIRDFDataSource);
  676.  
  677.   // get various services
  678.   var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  679.  
  680.   var searchResource       = rdf.GetResource(searchURL, true);
  681.   var priceProperty        = rdf.GetResource("http://home.netscape.com/NC-rdf#Price", true);
  682.   var availabilityProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#Availability", true);
  683.   var relevanceProperty    = rdf.GetResource("http://home.netscape.com/NC-rdf#Relevance", true);
  684.   var dateProperty         = rdf.GetResource("http://home.netscape.com/NC-rdf#Date", true);
  685.   var trueProperty         = rdf.GetLiteral("true");
  686.   var hasPriceFlag         = internetSearch.HasAssertion(searchResource, priceProperty, trueProperty, true);
  687.   var hasAvailabilityFlag  = internetSearch.HasAssertion(searchResource, availabilityProperty, trueProperty, true);
  688.   var hasRelevanceFlag     = internetSearch.HasAssertion(searchResource, relevanceProperty, trueProperty, true);
  689.   var hasDateFlag          = internetSearch.HasAssertion(searchResource, dateProperty, trueProperty, true);
  690.   var colNode;
  691.   var sortSetFlag = false;
  692.  
  693.   if (hasPriceFlag) {
  694.     colNode = navWindow._content.document.getElementById("PriceColumn");
  695.     if (colNode) {
  696.       colNode.removeAttribute("hidden");
  697.       if (!sortSetFlag) {
  698.         top._content.setInitialSort(colNode, "ascending");
  699.         sortSetFlag = true;
  700.       }
  701.     }
  702.   }
  703.  
  704.   if (hasAvailabilityFlag) {
  705.     colNode = navWindow._content.document.getElementById("AvailabilityColumn");
  706.     if (colNode)
  707.       colNode.removeAttribute("hidden");
  708.   }
  709.  
  710.   if (hasDateFlag) {
  711.     colNode = navWindow._content.document.getElementById("DateColumn");
  712.     if (colNode)
  713.       colNode.removeAttribute("hidden");
  714.   }
  715.  
  716.   if (hasRelevanceFlag) {
  717.     colNode = navWindow._content.document.getElementById("RelevanceColumn");
  718.     if (colNode) {
  719.       colNode.removeAttribute("hidden");
  720.       if (!sortSetFlag) {
  721.         navWindow._content.setInitialSort(colNode, "descending");
  722.         sortSetFlag = true;
  723.       }
  724.     }
  725.   }
  726.  
  727.   if (!sortSetFlag) {
  728.     colNode = navWindow._content.document.getElementById("PageRankColumn");
  729.     if (colNode)
  730.       navWindow._content.setInitialSort(colNode, "ascending");
  731.   }
  732.     
  733.   dumpe
  734.  
  735.   switchTab(0);
  736. }
  737.  
  738. function doSearch()
  739. {    
  740.     gPageNumber = 1;
  741.   var navWindow = getNavigatorWindow(true);
  742. //    var blah = navWindow.document.getAnonymousElementByAttribute(null, 'class' , 'searchbar-textbox');
  743.     
  744.     // Update search text on personal toolbar
  745. //    try {
  746.         //navWindow.document.getElementById('searchbar')
  747.         navWindow.document.getAnonymousElementByAttribute(navWindow.document.getElementById('searchbar'), 'class', 'searchbar-textbox').value = document.getElementById('sidebar-search-text').value;
  748. //    } catch (ex) {
  749. //    }
  750.  
  751.     // Load search
  752.   if (navWindow._content)
  753.     onNavWindowLoad();
  754.   else {
  755.     navWindow.addEventListener("load", onNavWindowLoad, false);
  756.   }
  757. }
  758.  
  759. // MERC - Stevo : Only called when user clicks on "Search" button on sidebar.
  760. function onNavWindowLoad() {
  761.   var navWindow = getNavigatorWindow(true);
  762.  
  763.   // hide various columns
  764.   if (navWindow && "_content" in navWindow && "isMozillaSearchWindow" in navWindow._content) {
  765.     colNode = navWindow._content.document.getElementById("RelevanceColumn");
  766.     if (colNode)
  767.       colNode.setAttribute("hidden", "true");
  768.  
  769.     colNode = navWindow._content.document.getElementById("PriceColumn");
  770.     if (colNode)
  771.       colNode.setAttribute("hidden", "true");
  772.  
  773.     colNode = navWindow._content.document.getElementById("AvailabilityColumn");
  774.     if (colNode)
  775.       colNode.setAttribute("hidden", "true");
  776.   }
  777.  
  778.   // get user text to find
  779.   var textNode = document.getElementById("sidebar-search-text");
  780.  
  781.   if (!textNode.value) {
  782.     alert(searchBundle.getString("enterstringandlocation"));
  783.     return;
  784.   }
  785.  
  786.   var searchMode = nsPreferences.getIntPref("browser.search.mode", 0);
  787.   var engineURIs = [];
  788.   if (searchMode > 0) {
  789.     var foundEngine = false;
  790.     var itemNode;
  791.     var engineBox = document.getElementById("searchengines");
  792.  
  793.     // in advanced search mode, get selected search engines
  794.     // (for the current search category)
  795.     for (var x = 0; x < engineBox.childNodes.length; ++x) {
  796.       itemNode = engineBox.childNodes[x];
  797.  
  798.       if (itemNode.localName == "listitem" && itemNode.checked) {
  799.         var engineURI = itemNode.id;
  800.  
  801.         if (engineURI) {
  802.           engineURIs[engineURIs.length] = engineURI;
  803.           foundEngine = true;
  804.         }
  805.       }
  806.     }
  807.  
  808.     if (!foundEngine) {
  809.       if (getNumEngines() == 1) {
  810.         // only one engine in this category, check it
  811.         itemNode = engineBox.firstChild;
  812.         engineURIs[engineURIs.length] = itemNode.id;
  813.       }
  814.       else {
  815.         for (var i = 0; i < engineBox.childNodes.length; ++i) {
  816.           itemNode = engineBox.childNodes[i];
  817.           var theID = itemNode.id;
  818.           if (theID.indexOf("NetscapeSearch.src") != -1) {
  819.             engineURIs[engineURIs.length] = theID;
  820.             foundEngine = true;
  821.             break;
  822.           }
  823.         }
  824.  
  825.         if (!foundEngine) {
  826.           alert(searchBundle.getString("enterstringandlocation"));
  827.           return;
  828.         }
  829.       }
  830.     }
  831.   }
  832.   else
  833.   {
  834.       var basicEngines = document.getElementById("basicEngineMenu");
  835.     engineURIs[0] = basicEngines.selectedItem.id;
  836.     debug("basic mode URI = " + engineURIs[0]);
  837.   }
  838.  
  839.   if (!gStopButtonText)
  840.     gStopButtonText = searchBundle.getString("stopButtonText");
  841.  
  842.   var searchButtonNode = document.getElementById("searchButton");
  843.   searchButtonNode.setAttribute("stop", "true");
  844.   searchButtonNode.setAttribute("label", gStopButtonText);
  845.  
  846.   var progressNode = top.document.getElementById("statusbar-icon");
  847.   if (progressNode)
  848.     progressNode.setAttribute("mode", "undetermined");
  849.  
  850.   // run the search
  851.   OpenSearch(textNode.value, engineURIs);
  852.   switchTab(0);
  853. }
  854.  
  855. function checkSearchProgress()
  856. {
  857.     dump("Calling checksearchprogress\n");
  858.   var activeSearchFlag = false;
  859.   var navWindow = getNavigatorWindow(false);
  860.  
  861.   if (navWindow) {
  862.     var resultsList = document.getElementById("resultList");
  863.     if (resultsList) {
  864.       var treeref = resultsList.getAttribute("ref");
  865.       var ds = resultsList.database;
  866.       if (ds && treeref) {
  867.         try {
  868.           var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  869.           var source = rdf.GetResource(treeref, true);
  870.           var loadingProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#loading", true);
  871.           var target = ds.GetTarget(source, loadingProperty, true);
  872.           if (target)
  873.             target = target.QueryInterface(nsIRDFLiteral).Value;
  874.           activeSearchFlag = target == "true" ? true : false;          
  875.                   // MERC - Stevo
  876.                   // Check if there are any results if not disable nav buttons
  877.                   var resultsList = document.getElementById("resultList");
  878.                   if (resultsList) {
  879.                       if (resultsList.getRowCount() <= 0)
  880.                           disableNavButtons();
  881.                     }          
  882.         }
  883.         catch (ex) {
  884.           activeSearchFlag = false;
  885.         }
  886.       }      
  887.     }
  888.   }
  889.  
  890.   if (activeSearchFlag)
  891.     setTimeout("checkSearchProgress()", 1000);
  892.   else
  893.     doStop();
  894.  
  895.   return activeSearchFlag;
  896. }
  897.  
  898. function sidebarOpenURL(listitem)
  899. {
  900.   var id = listitem.id;
  901.   if (!id)
  902.     return;
  903.  
  904.   // rjc: add support for anonymous resources; if the node has
  905.   // a "#URL" property, use it, otherwise default to using the id
  906.   try {
  907.     var ds = document.getElementById("resultList").database;
  908.     if (ds) {
  909.       var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  910.       var src = rdf.GetResource(id, true);
  911.       var prop = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true);
  912.       var target = ds.GetTarget(src, prop, true);
  913.       if (target) {
  914.         target = target.QueryInterface(nsIRDFLiteral).Value;
  915.         if (target)
  916.           id = target;
  917.       }
  918.     }
  919.   } catch (ex) {
  920.   }
  921.  
  922.   // mark result as visited
  923.   listitem.setAttribute("visited", "true");
  924.   
  925.   loadURLInContent(id);
  926. }
  927.  
  928. function OpenSearch(aSearchStr, engineURIs)
  929. {
  930.   var searchEngineURI = nsPreferences.copyUnicharPref("browser.search.defaultengine", null);
  931.   var defaultSearchURL = nsPreferences.getLocalizedUnicharPref("browser.search.defaulturl", null);
  932.  
  933.   if (!defaultSearchURL) {
  934.     regionalBundle = document.getElementById("regionalBundle");
  935.     defaultSearchURL = regionalBundle.getString("defaultSearchURL");
  936.   }
  937.  
  938.   var searchDS = Components.classes[ISEARCH_CONTRACTID].getService(nsIInternetSearchService);
  939.  
  940.   var escapedSearchStr = encodeURIComponent(aSearchStr);
  941.   sidebarInitiatedSearch = true;
  942.   searchDS.RememberLastSearchText(escapedSearchStr);
  943.   sidebarInitiatedSearch = false;
  944.  
  945.   try {
  946.     var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  947.                         .getService(Components.interfaces.nsIRDFService);
  948.     var rEngine = rdf.GetResource(searchEngineURI);
  949.     var kNC_Root = rdf.GetResource("NC:SearchEngineRoot");
  950.     var kNC_Name = rdf.GetResource("http://home.netscape.com/NC-rdf#Name");
  951.     // MERC - searchDS.GetTarget is not a function ?
  952.     var engineID = 'searchpanel:'+readRDFString(searchDS, rEngine, kNC_Name);
  953.     var searchPanel = document.getElementById('searchPanel');
  954.     searchPanel.setAttribute('perfmon', engineID);
  955.     window.top.perfmon.trackData(searchPanel);
  956.   } catch (ex) {
  957.     dump('search-panel.js: ERROR tracking search provider hits\n'+ex+'\n');
  958.   }
  959.  
  960.   var gURL;
  961.   var suppressSearchService = false;
  962.   try {
  963.     if (!engineURIs || engineURIs.length <= 1) {
  964.       // not called from sidebar or only one engine selected
  965.       if (engineURIs && engineURIs.length == 1) {
  966.         searchEngineURI = engineURIs[0];
  967.         gURL = "internetsearch:engine=" + searchEngineURI + "&text=" + escapedSearchStr;
  968.       }
  969.  
  970.       if (!searchEngineURI)
  971.         searchEngineURI = regionalBundle.getString("defaultSearchURL");
  972.  
  973.       // look up the correct search URL format for the given engine
  974.       try {
  975.         var whichButtons = new Object;
  976.         whichButtons.value = 0;
  977.         var searchURL = searchDS.GetInternetSearchURL(searchEngineURI, escapedSearchStr, 0, 0, whichButtons);
  978.         doNavButtonEnabling(whichButtons.value, searchDS, 0);
  979.         dump("JMC: searchEngineURI is : " + searchEngineURI + "\n");
  980.         // JMC: Hackish fix for fromPage urls, should generalize this
  981.         if (searchEngineURI.indexOf('NetscapeSearch') > -1)
  982.         {
  983.           var pref = Components.classes['@mozilla.org/preferences-service;1']
  984.                .getService(Components.interfaces.nsIPrefService)
  985.                .getBranch(null);
  986.           searchURL = pref.getCharPref('browser.sidebarSearch.URL') + escapedSearchStr;
  987.           // suppressSearchService = true;
  988.           // getNavigatorWindow(true).loadURI(searchURL);
  989.           //return;
  990.         }
  991.         
  992.       }
  993.       catch (ex) {
  994.         dump("Exception when calling GetInternetSearchURL: " + ex);
  995.         searchURL = "";
  996.       }
  997.  
  998.       defaultSearchURL = searchURL ? searchURL : defaultSearchURL + escapedSearchStr;
  999.       if (!searchURL)
  1000.         gURL = "";
  1001.  
  1002.       // load the results page of selected or default engine in the content area
  1003.       if (defaultSearchURL)
  1004.         loadURLInContent(defaultSearchURL, suppressSearchService);
  1005.     }
  1006.     else {
  1007.       // multiple providers
  1008.       searchURL = "";
  1009.       for (var i = 0; i < engineURIs.length; ++i) {
  1010.         searchURL += !searchURL ? "internetsearch:" : "&";
  1011.         searchURL += "engine=" + engineURIs[i];
  1012.       }
  1013.       searchURL += ("&text=" + escapedSearchStr);
  1014.       gURL = searchURL;
  1015.       loadURLInContent(encodeURI("chrome://browser/content/search/internetresults.xul?" + searchURL));
  1016.     }
  1017.   }
  1018.   catch (ex) {
  1019.     debug("Exception: " + ex);
  1020.   }
  1021.  
  1022.   setTimeout("checkSearchProgress()", 2000);
  1023. }
  1024.  
  1025. function saveSearch()
  1026. {
  1027.   var ds = document.getElementById("resultList").database;
  1028.   if (!ds)
  1029.     return;
  1030.  
  1031.   var lastSearchURI = "";
  1032.   var lastSearchText = "";
  1033.  
  1034.   var rdf = Components.classes[RDFSERVICE_CONTRACTID].getService(nsIRDFService);
  1035.   // look for last search URI
  1036.   var source = rdf.GetResource("NC:LastSearchRoot", true);
  1037.   var childProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#ref", true);
  1038.   var target = ds.GetTarget(source, childProperty, true);
  1039.   if (target) {
  1040.     target = target.QueryInterface(nsIRDFLiteral).Value;
  1041.     if (target)
  1042.       lastSearchURI = target;
  1043.   }
  1044.  
  1045.   // look for last search text
  1046.   childProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#LastText", true);
  1047.   target = ds.GetTarget(source, childProperty, true);
  1048.   if (target) {
  1049.     target = target.QueryInterface(nsIRDFLiteral).Value;
  1050.     if (target) {
  1051.       // convert plusses (+) back to spaces
  1052.       target = target.replace(/\+/g, " ");
  1053.       lastSearchText = decodeURI(target);
  1054.     }
  1055.   }
  1056.  
  1057.   if (!lastSearchURI)
  1058.     return;
  1059.  
  1060.   // rjc says: if lastSearchText is empty/null, that's still OK, synthesize the text
  1061.   if (!lastSearchText) {
  1062.     lastSearchText = lastSearchURI;
  1063.     var siteOffset = lastSearchText.indexOf("://");
  1064.     if (siteOffset > 0) {
  1065.       siteOffset += 3;
  1066.       var endOffset = lastSearchText.indexOf("/", siteOffset);
  1067.       if (endOffset > 0)
  1068.         lastSearchText = lastSearchText.substr(0, endOffset+1);
  1069.     }
  1070.   }
  1071.  
  1072.   var searchTitle = searchBundle.stringBundle.formatStringFromName(
  1073.                       "searchTitle", [lastSearchText], 1);
  1074.  
  1075.   var bmks = Components.classes[BMARKS_CONTRACTID].getService(nsIBookmarksService);
  1076.   bmks.addBookmarkImmediately(lastSearchURI, searchTitle, bmks.BOOKMARK_SEARCH_TYPE, null);
  1077. }
  1078.  
  1079. var gPageNumber = 1;
  1080. /**
  1081.  * showMoreResults
  1082.  *
  1083.  * Run a query to show the next/previous page of search results for the
  1084.  * current search term.
  1085.  * 
  1086.  * @param direction : -1 => previous
  1087.  *                     1 => next
  1088.  */
  1089. function showMoreResults(direction)
  1090. {
  1091.   // XXX check if we are in basic search mode
  1092.  
  1093.   // get search engine
  1094.   var engine = document.getElementById("basicEngineMenu").selectedItem;
  1095.   var engineURI = engine.id;
  1096.  
  1097.   // get search term
  1098.   var searchTerm = document.getElementById("sidebar-search-text").value;
  1099.   searchTerm = encodeURIComponent(searchTerm);
  1100.  
  1101.   // change page number
  1102.   if (direction > 0)
  1103.     ++gPageNumber;
  1104.   else
  1105.     --gPageNumber;
  1106.  
  1107.   // get qualified URL
  1108.   var searchService = Components.classes[ISEARCH_CONTRACTID].
  1109.                         getService(nsIInternetSearchService);
  1110.   var whichButtons = new Object;
  1111.   whichButtons.value = 0;
  1112.   var searchURL = searchService.GetInternetSearchURL(engineURI, searchTerm, 
  1113.                     direction, gPageNumber, whichButtons);
  1114.   doNavButtonEnabling(whichButtons.value, searchService, gPageNumber);
  1115.  
  1116.   // load URL in navigator
  1117.   loadURLInContent(searchURL, null, true);
  1118. }
  1119.  
  1120. function doNavButtonEnabling(whichButtons, searchService, pageNumber)
  1121. {
  1122.   var nextButton = document.getElementById("next-results");
  1123.   var nextDisabled = nextButton.getAttribute("disabled");
  1124.   var prevButton = document.getElementById("prev-results");
  1125.   var prevDisabled = prevButton.getAttribute("disabled");
  1126.  
  1127.   if (whichButtons & searchService.kHaveNext)
  1128.   {
  1129.     if (nextDisabled)
  1130.       nextButton.removeAttribute("disabled");
  1131.   }
  1132.   else 
  1133.   {
  1134.     if (!nextDisabled)
  1135.       nextButton.setAttribute("disabled", "true");
  1136.   }
  1137.   
  1138.   if ((pageNumber > 1) && (whichButtons & searchService.kHavePrev))
  1139.   {
  1140.     if (prevDisabled)
  1141.       prevButton.removeAttribute("disabled");
  1142.   }
  1143.   else 
  1144.   {
  1145.     if (!prevDisabled)
  1146.       prevButton.setAttribute("disabled", "true");
  1147.   }
  1148. }
  1149.  
  1150. function doCustomize()
  1151. {
  1152.   //Switching from Edit Categories back to All Engines then launching customize window
  1153.   var category = document.getElementById("categoryList");
  1154.   category.selectedIndex = 0;
  1155.   window.openDialog("chrome://browser/content/search/search-editor.xul", "internetsearch:editor", "centerscreen,chrome,resizable");
  1156. }
  1157.  
  1158. function loadURLInContent(url, suppressSearchService, reUseTab)
  1159.   if (reUseTab) {
  1160.       getNavigatorWindow(true).SearchLoadURL(url, null, true);
  1161.   } else {
  1162.       getNavigatorWindow(true).SearchLoadURL(url);
  1163.   } 
  1164.     
  1165.     
  1166.   /*
  1167.   if(pref.getCharPref("browser.tabs.searchbarresult.open") == 'overwrite') {
  1168.     navigatorWindow.loadURI(url);
  1169.   } else { // else == 'new'
  1170.    
  1171.     // open link in new tab
  1172.     var browser = top.document.getElementById("content");
  1173.     var theTab = browser.addTabAt(url);
  1174.     if (!pref.getBoolPref("browser.tabs.loadInBackground"))
  1175.       browser.selectedTab = theTab;
  1176.  
  1177.   }
  1178.   var internetSearch = Components.classes[ISEARCH_CONTRACTID].getService(nsIInternetSearchService);
  1179.   internetSearch.FindInternetSearchResults(url);
  1180.   */
  1181. }
  1182.  
  1183. function search_getBrowserURL()
  1184. {
  1185.   return nsPreferences.copyUnicharPref("browser.chromeURL", "chrome://browser/content/browser.xul");
  1186. }
  1187.  
  1188. function doEnabling()
  1189. {
  1190.   var searchButton = document.getElementById("searchButton");
  1191.   var sidebarSearchText = document.getElementById("sidebar-search-text");
  1192.   searchButton.disabled = !sidebarSearchText.value;
  1193.  
  1194. }
  1195.  
  1196. //Step up the dom until getting the desired node.
  1197. function getItemNode(aNode,nodeName)
  1198. {
  1199.   var node = aNode;
  1200.   while (node.localName != nodeName) {
  1201.     node = node.parentNode;
  1202.   }
  1203.   return node ? node : null;
  1204. }
  1205.  
  1206. function getArcValueForID(aArc, aID)
  1207. {
  1208.   var val = null;
  1209.  
  1210.   try
  1211.   {
  1212.     var ds = document.getElementById("resultList").database;
  1213.     if (ds)
  1214.     {
  1215.       var rdf = Components.classes[RDFSERVICE_CONTRACTID].
  1216.                   getService(nsIRDFService);
  1217.       var src = rdf.GetResource(aID, true);
  1218.       var prop = rdf.GetResource(
  1219.                   "http://home.netscape.com/NC-rdf#"+aArc, true);
  1220.       val = ds.GetTarget(src, prop, true);        
  1221.       if (val)
  1222.         val = val.QueryInterface(nsIRDFLiteral).Value;
  1223.     }
  1224.   } 
  1225.   catch (ex)
  1226.   {
  1227.     dump("Exception: no value for " + aArc + "!\t" + ex + "\n");
  1228.     val = null;
  1229.   }
  1230.  
  1231.   return val;
  1232. }
  1233.  
  1234. //Fill in tooltip in teh search results panel
  1235. function FillInDescTooltip(tipElement)
  1236. {
  1237.   var retValue = false;
  1238.  
  1239.   //Get the Name of the listitem for first item in the tooltip
  1240.   var nodeLabel = tipElement.getAttribute("label");
  1241.   var nodeID = tipElement.id;
  1242.  
  1243.   //Query RDF to get URL of listitem
  1244.   if (nodeID)
  1245.     var url = getArcValueForID("URL", nodeID);
  1246.  
  1247.   //Fill in the the text nodes
  1248.   //collapse them if there is not a node
  1249.   if (nodeLabel || url) {
  1250.     var tooltipTitle = document.getElementById("titleText");
  1251.     var tooltipUrl = document.getElementById("urlText"); 
  1252.     if (nodeLabel) {
  1253.       if (tooltipTitle.getAttribute("hidden") == "true")
  1254.         tooltipTitle.removeAttribute("hidden");
  1255.       tooltipTitle.setAttribute("value",nodeLabel);
  1256.     } 
  1257.     else  {
  1258.       tooltipTitle.setAttribute("hidden", "true");
  1259.     }
  1260.     if (url) {
  1261.       if (tooltipUrl.getAttribute("hidden") == "true")
  1262.         tooltipUrl.removeAttribute("hidden");
  1263.       if (url.length > 100)
  1264.         url = url.substr(0,100) + "...";
  1265.       tooltipUrl.setAttribute("value",url);
  1266.     }
  1267.     else {
  1268.       tooltipUrl.setAttribute("hidden", "true");
  1269.     }
  1270.     retValue = true;
  1271.   }
  1272.   return retValue;
  1273. }
  1274.  
  1275. var nsResultDNDObserver = 
  1276. {
  1277.   onDragStart: function(aEvent, aXferData, aDragAction)
  1278.   {
  1279.     var node = getItemNode(aEvent.target, "listitem");
  1280.     var URL = getArcValueForID("URL", node.id);
  1281.     var title = getArcValueForID("Name", node.id);
  1282.     var htmlString = "<a href=\"" + URL + "\">" + title + "</a>";
  1283.     var urlString = URL + "\n" + title;
  1284.  
  1285.     aXferData.data = new TransferData();
  1286.     aXferData.data.addDataForFlavour("text/x-moz-url", URL);
  1287.     aXferData.data.addDataForFlavour("text/unicode", urlString);
  1288.     aXferData.data.addDataForFlavour("text/html", htmlString); 
  1289.   }
  1290. };
  1291.  
  1292. function HandleResultDragGesture(aEvent)
  1293. {
  1294.   nsDragAndDrop.startDrag(aEvent, nsResultDNDObserver);
  1295.   return true;  
  1296. }
  1297.  
  1298.