home *** CD-ROM | disk | FTP | other *** search
/ PC Advisor 2005 August / PCADVD_121.iso / internet / nsb-setup.exe / chrome / browser.jar / content / browser / search / search-editor.js < prev    next >
Encoding:
JavaScript  |  2004-12-08  |  17.5 KB  |  630 lines

  1. /* -*- Mode: Java; tab-width: 8; 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>
  24.  *    Blake Ross <BlakeR1234@aol.com>
  25.  *
  26.  * Alternatively, the contents of this file may be used under the terms of
  27.  * either the GNU General Public License Version 2 or later (the "GPL"), or 
  28.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  29.  * in which case the provisions of the GPL or the LGPL are applicable instead
  30.  * of those above. If you wish to allow use of your version of this file only
  31.  * under the terms of either the GPL or the LGPL, and not to allow others to
  32.  * use your version of this file under the terms of the NPL, indicate your
  33.  * decision by deleting the provisions above and replace them with the notice
  34.  * and other provisions required by the GPL or the LGPL. If you do not delete
  35.  * the provisions above, a recipient may use your version of this file under
  36.  * the terms of any one of the NPL, the GPL or the LGPL.
  37.  *
  38.  * ***** END LICENSE BLOCK ***** */
  39.  
  40.  
  41.  
  42. // global(s)
  43. var bundle = srGetStrBundle("chrome://communicator/locale/search/search-editor.properties");
  44. var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
  45. promptService = promptService.QueryInterface(Components.interfaces.nsIPromptService);
  46. var pref = null;
  47. var RDF = null;
  48. var RDFC = null;
  49. var RDFCUtils = null;
  50. var catDS = null;
  51. var internetSearchDS = null;
  52.  
  53. try
  54. {
  55.   pref = Components.classes["@mozilla.org/preferences-service;1"]
  56.                    .getService(Components.interfaces.nsIPrefBranch);
  57.  
  58.   RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  59.   if (RDF)  RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
  60.  
  61.   RDFC = Components.classes["@mozilla.org/rdf/container;1"].getService();
  62.   if (RDFC) RDFC = RDFC.QueryInterface(Components.interfaces.nsIRDFContainer);
  63.  
  64.   RDFCUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].getService();
  65.   if (RDFCUtils)  RDFCUtils = RDFCUtils.QueryInterface(Components.interfaces.nsIRDFContainerUtils);
  66. }
  67. catch(e)
  68. {
  69.   pref = null;
  70.   RDF = null;
  71.   RDFC = null;
  72.   RDFCUtils = null;
  73. }
  74.  
  75.  
  76.  
  77. function debug(msg)
  78. {
  79.   // uncomment for noise
  80.   // dump(msg+"\n");
  81. }
  82.  
  83.  
  84.  
  85. function doLoad()
  86. {
  87.   // adjust category popup
  88.   var internetSearch = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"].getService();
  89.   if (internetSearch) internetSearch = internetSearch.QueryInterface(Components.interfaces.nsIInternetSearchService);
  90.   if (internetSearch)
  91.   {
  92.     internetSearchDS = internetSearch.QueryInterface(Components.interfaces.nsIRDFDataSource);
  93.  
  94.     catDS = internetSearch.GetCategoryDataSource();
  95.     if (catDS)  catDS = catDS.QueryInterface(Components.interfaces.nsIRDFDataSource);
  96.     if (catDS)
  97.     {
  98.       var categoryList = document.getElementById("categoryList");
  99.       if (categoryList)
  100.       {
  101.         categoryList.database.AddDataSource(catDS);
  102.         categoryList.builder.rebuild();
  103.       }
  104.       var engineList = document.getElementById("engineList");
  105.       if (engineList)
  106.       {
  107.         engineList.database.AddDataSource(catDS);
  108.         engineList.builder.rebuild();
  109.       }
  110.     }
  111.   }
  112.  
  113.   // try and determine last category name used
  114.   var lastCategoryName = "";
  115.   try
  116.   {
  117.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  118.                          .getService(Components.interfaces.nsIPrefBranch);
  119.     lastCategoryName = pref.getCharPref( "browser.search.last_search_category" );
  120.  
  121.     if (lastCategoryName != "")
  122.     {
  123.       // strip off the prefix if necessary
  124.       var prefix="NC:SearchCategory?category=";
  125.       if (lastCategoryName.indexOf(prefix) == 0)
  126.       {
  127.         lastCategoryName = lastCategoryName.substr(prefix.length);
  128.       }
  129.     }
  130.  
  131.   }
  132.   catch( e )
  133.   {
  134.     debug("Exception in SearchPanelStartup\n");
  135.     lastCategoryName = "";
  136.   }
  137.   debug("\nSearchPanelStartup: lastCategoryName = '" + lastCategoryName + "'\n");
  138.  
  139.   // select the appropriate category
  140.   var categoryList = document.getElementById( "categoryList" );
  141.   var categoryPopup = document.getElementById( "categoryPopup" );
  142.   if( categoryList && categoryPopup )
  143.   {
  144.     var found = false;
  145.     for( var i = 0; i < categoryPopup.childNodes.length; i++ )
  146.     {
  147.       if( ( lastCategoryName == "" && categoryPopup.childNodes[i].getAttribute("value") == "NC:SearchEngineRoot" ) ||
  148.           ( categoryPopup.childNodes[i].getAttribute("id") == lastCategoryName ) )
  149.       {
  150.         categoryList.selectedItem = categoryPopup.childNodes[i];
  151.         found = true;
  152.         break;
  153.       }
  154.     }
  155.     if (categoryPopup.childNodes.length > 0)
  156.     {
  157.       if (found == false)
  158.       {
  159.         categoryList.selectedItem = categoryPopup.childNodes[0];
  160.       }
  161.       chooseCategory(categoryList.selectedItem);
  162.     }
  163.   }
  164.  
  165. }
  166.  
  167.  
  168.  
  169. function Commit()
  170. {
  171.   // flush
  172.   if (catDS)
  173.   {
  174.     var flushableDS = catDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
  175.     if (flushableDS)
  176.     {
  177.       flushableDS.Flush();
  178.     }
  179.   }
  180.  
  181.   return true;
  182. }
  183.  
  184.  
  185.  
  186. function doUnload()
  187. {
  188.     // Get the current window position/size.
  189.     var x = window.screenX;
  190.     var y = window.screenY;
  191.     var h = window.outerHeight;
  192.     var w = window.outerWidth;
  193.  
  194.     // Store these into the window attributes (for persistence).
  195.     var win = document.getElementById( "search-editor-window" );
  196.     win.setAttribute( "x", x );
  197.     win.setAttribute( "y", y );
  198.     win.setAttribute( "height", h );
  199.     win.setAttribute( "width", w );
  200. }
  201.  
  202.  
  203.  
  204. /* Note: doSort() does NOT support natural order sorting, unless naturalOrderResource is valid,
  205.          in which case we sort ascending on naturalOrderResource
  206.  */
  207. function doSort(sortColName, naturalOrderResource)
  208. {
  209.   var node = document.getElementById(sortColName);
  210.   // determine column resource to sort on
  211.   var sortResource = node.getAttribute('resource');
  212.   if (!sortResource) return(false);
  213.  
  214.   var sortDirection="ascending";
  215.   var isSortActive = node.getAttribute('sortActive');
  216.   if (isSortActive == "true")
  217.   {
  218.     sortDirection = "ascending";
  219.  
  220.     var currentDirection = node.getAttribute('sortDirection');
  221.     if (currentDirection == "ascending")
  222.     {
  223.       if (sortResource != naturalOrderResource)
  224.       {
  225.         sortDirection = "descending";
  226.       }
  227.     }
  228.     else if (currentDirection == "descending")
  229.     {
  230.       if (naturalOrderResource != null && naturalOrderResource != "")
  231.       {
  232.         sortResource = naturalOrderResource;
  233.       }
  234.     }
  235.   }
  236.  
  237.   var isupports = Components.classes["@mozilla.org/xul/xul-sort-service;1"].getService();
  238.   if (!isupports)    return(false);
  239.   var xulSortService = isupports.QueryInterface(Components.interfaces.nsIXULSortService);
  240.   if (!xulSortService)    return(false);
  241.   try
  242.   {
  243.     xulSortService.sort(node, sortResource, sortDirection);
  244.   }
  245.   catch(ex)
  246.   {
  247.     debug("Exception calling xulSortService.sort()");
  248.   }
  249.   return(true);
  250. }
  251.  
  252.  
  253.  
  254. function chooseCategory( aNode )
  255. {
  256.   var category = "NC:SearchCategory?category=" + aNode.getAttribute("id");
  257.   debug("chooseCategory: '" + category + "'\n");
  258.  
  259.   var treeNode = document.getElementById("engineList");
  260.   if (treeNode)
  261.   {
  262.     dump("*** Set search engine list to category=" + category + "\n");
  263.     treeNode.setAttribute( "ref", category );
  264.     treeNode.builder.rebuild();
  265.   }
  266.   return(true);
  267. }
  268.  
  269.  
  270.  
  271. function AddEngine()
  272. {
  273.   var allenginesList = document.getElementById("allengines");
  274.   if (!allenginesList)  return(false);
  275.   var select_list = allenginesList.selectedItems;
  276.   if (!select_list) return(false)
  277.   if (select_list.length < 1) return(false);
  278.  
  279.   // make sure we have at least one category to add engine into
  280.   var categoryPopup = document.getElementById( "categoryPopup" );
  281.   if (!categoryPopup) return(false);
  282.   if (categoryPopup.childNodes.length < 1)
  283.   {
  284.     if (NewCategory() == false) return(false);
  285.   }
  286.  
  287.   var engineList = document.getElementById("engineList");
  288.   if (!engineList)  return(false);
  289.  
  290.   var ref = engineList.getAttribute("ref");
  291.   if ((!ref) || (ref == ""))  return(false);
  292.  
  293.   var categoryRes = RDF.GetResource(ref);
  294.   if (!categoryRes) return(false);
  295.  
  296.   RDFCUtils.MakeSeq(catDS, categoryRes);
  297.  
  298.   RDFC.Init(catDS, categoryRes);
  299.  
  300.   var urlRes = RDF.GetResource("http://home.netscape.com/NC-rdf#URL");
  301.   if (!urlRes)  return(false);
  302.   var typeRes = RDF.GetResource("http://home.netscape.com/NC-rdf#searchtype");
  303.   if (!typeRes) return(false);
  304.   var engineRes = RDF.GetResource("http://home.netscape.com/NC-rdf#Engine");
  305.   if (!engineRes) return(false);
  306.  
  307.   for (var x = 0; x < select_list.length; x++)
  308.   {
  309.     var id = select_list[x].getAttribute("id");
  310.     if ((!id) || (id == ""))  return(false);
  311.     var idRes = RDF.GetResource(id);
  312.     if (!idRes) return(false);
  313.  
  314.     // try and find/use alias to search engine
  315.     var privateEngineFlag = internetSearchDS.HasAssertion(idRes, typeRes, engineRes, true);
  316.     if (privateEngineFlag == true)
  317.     {
  318.       var node = internetSearchDS.GetTarget(idRes, urlRes, true);
  319.       if (node) node = node.QueryInterface(Components.interfaces.nsIRDFLiteral);
  320.       if (node)
  321.       {
  322.         if (node.Value)
  323.         {
  324.           id = node.Value;
  325.           idRes = RDF.GetResource(id);
  326.           if (!idRes) return(false);
  327.         }
  328.       }
  329.     }
  330.  
  331.     var nodeIndex = RDFC.IndexOf(idRes);
  332.     if (nodeIndex < 1)
  333.     {
  334.       RDFC.AppendElement(idRes);
  335.     }
  336.   }
  337.  
  338.   return(true);
  339. }
  340.  
  341.  
  342.  
  343. function RemoveEngine()
  344. {
  345.   var engineList = document.getElementById("engineList");
  346.   if (!engineList)  return(false);
  347.   var select_list = engineList.selectedItems;
  348.   if (!select_list) return(false)
  349.   if (select_list.length < 1) return(false);
  350.  
  351.   var ref = engineList.getAttribute("ref");
  352.   if ((!ref) || (ref == ""))  return(false);
  353.   var categoryRes = RDF.GetResource(ref);
  354.   if (!categoryRes) return(false);
  355.  
  356.   RDFC.Init(catDS, categoryRes);
  357.  
  358.   // Note: walk backwards to make deletion easier
  359.   for (var x = select_list.length - 1; x >= 0; x--)
  360.   {
  361.     var id = select_list[x].getAttribute("id");
  362.     if ((!id) || (id == ""))  return(false);
  363.     var idRes = RDF.GetResource(id);
  364.     if (!idRes) return(false);
  365.  
  366.     var nodeIndex = RDFC.IndexOf(idRes);
  367.     if (nodeIndex > 0)
  368.     {
  369.       RDFC.RemoveElementAt(nodeIndex, true, idRes);
  370.     }
  371.   }
  372.  
  373.   return(true);
  374. }
  375.  
  376.  
  377.  
  378. function MoveUp()
  379. {
  380.   return  MoveDelta(-1);
  381. }
  382.  
  383.  
  384.  
  385. function MoveDown()
  386. {
  387.   return  MoveDelta(1);
  388. }
  389.  
  390.  
  391.  
  392. function MoveDelta(delta)
  393. {
  394.   var engineList = document.getElementById("engineList");
  395.   if (!engineList)  return(false);
  396.   var select_list = engineList.selectedItems;
  397.   if (!select_list) return(false)
  398.   if (select_list.length != 1)  return(false);
  399.  
  400.   var ref = engineList.getAttribute("ref");
  401.   if (!ref) return(false);
  402.   var categoryRes = RDF.GetResource(ref);
  403.   if (!categoryRes) return(false);
  404.  
  405.   var id = select_list[0].id;
  406.   if (!id)  return(false);
  407.   var idRes = RDF.GetResource(id);
  408.   if (!idRes) return(false);
  409.  
  410.   RDFC.Init(catDS, categoryRes);
  411.  
  412.   var nodeIndex = RDFC.IndexOf(idRes);
  413.   if (nodeIndex < 1)  return(false);    // how did that happen?
  414.  
  415.   var numItems = RDFC.GetCount();
  416.  
  417.   var newPos = -1;
  418.   if (((delta == -1) && (nodeIndex > 1)) ||
  419.     ((delta == 1) && (nodeIndex < numItems)))
  420.   {
  421.     newPos = nodeIndex + delta;
  422.     RDFC.RemoveElementAt(nodeIndex, true, idRes);
  423.   }
  424.   if (newPos > 0)
  425.   {
  426.     RDFC.InsertElementAt(idRes, newPos, true);
  427.   }
  428.  
  429.   selectItems(engineList, ref, id);
  430.  
  431.   return(true);
  432. }
  433.  
  434. function doMoveDirectionEnabling()
  435. {
  436.   var engineList = document.getElementById("engineList")
  437.   var selectedItems = engineList.selectedItems;
  438.   var nodeIndex = -1;
  439.   if (selectedItems && selectedItems.length == 1) {
  440.     var ref = engineList.getAttribute("ref");
  441.     var categoryResource = RDF.GetResource(ref);
  442.     var elementResource = RDF.GetResource(selectedItems[0].id);
  443.     RDFC.Init(catDS, categoryResource);
  444.     nodeIndex = RDFC.IndexOf(elementResource);
  445.   }
  446.   
  447.   var moveUpButton = document.getElementById("up");
  448.   var moveDownButton = document.getElementById("down");
  449.  
  450.   if (nodeIndex <= 1)
  451.     moveUpButton.setAttribute("disabled", "true");
  452.   else
  453.     moveUpButton.removeAttribute("disabled");
  454.   
  455.   if (nodeIndex < 0 || nodeIndex >= RDFC.GetCount())
  456.     moveDownButton.setAttribute("disabled", "true");
  457.   else
  458.     moveDownButton.removeAttribute("disabled");
  459. }
  460.  
  461.  
  462. function NewCategory()
  463. {
  464.   var promptStr = bundle.GetStringFromName("NewCategoryPrompt");
  465.   var newTitle = bundle.GetStringFromName("NewCategoryTitle");
  466.   var result = {value:null};
  467.   var confirmed = promptService.prompt(window, newTitle, promptStr, result, null, {value:0});
  468.   if (!confirmed || (!result.value) || result.value == "")      return(false);
  469.  
  470.   var newName = RDF.GetLiteral(result.value);
  471.   if (!newName) return(false);
  472.  
  473.   var categoryRes = RDF.GetResource("NC:SearchCategoryRoot");
  474.   if (!categoryRes) return(false);
  475.  
  476.   RDFC.Init(catDS, categoryRes);
  477.  
  478.   var randomID = Math.random();
  479.   var categoryID = "NC:SearchCategory?category=urn:search:category:" + randomID.toString();
  480.   var currentCatRes = RDF.GetResource(categoryID);
  481.   if (!currentCatRes) return(false);
  482.  
  483.   var titleRes = RDF.GetResource("http://home.netscape.com/NC-rdf#title");
  484.   if (!titleRes)  return(false);
  485.  
  486.   // set the category's name
  487.   catDS.Assert(currentCatRes, titleRes, newName, true);
  488.  
  489.   // and insert the category
  490.   RDFC.AppendElement(currentCatRes);
  491.  
  492.   RDFCUtils.MakeSeq(catDS, currentCatRes);
  493.  
  494.   // try and select the new category
  495.   var categoryList = document.getElementById( "categoryList" );
  496.   var select_list = categoryList.getElementsByAttribute("id", categoryID);
  497.   if (select_list && select_list.length > 0)
  498.   {
  499.     categoryList.selectedItem = select_list[0];
  500.     chooseCategory(categoryList.selectedItem);
  501.   }
  502.   return(true);
  503. }
  504.  
  505.  
  506.  
  507. function RenameCategory()
  508. {
  509.   // make sure we have at least one category
  510.   var categoryPopup = document.getElementById( "categoryPopup" );
  511.   if (!categoryPopup) return(false);
  512.   if (categoryPopup.childNodes.length < 1)  return(false);
  513.  
  514.   var categoryList = document.getElementById( "categoryList" );
  515.   var currentName = categoryList.selectedItem.getAttribute("label");
  516.   var promptStr = bundle.GetStringFromName("RenameCategoryPrompt");
  517.   var renameTitle = bundle.GetStringFromName("RenameCategoryTitle");
  518.   var result = {value:currentName};
  519.   var confirmed = promptService.prompt(window,renameTitle,promptStr,result,null,{value:0});
  520.   if (!confirmed || (!result.value) || (result.value == "") || result.value == currentName)     return(false);
  521.  
  522.   var currentCatID = categoryList.selectedItem.getAttribute("id");
  523.   var currentCatRes = RDF.GetResource(currentCatID);
  524.   if (!currentCatRes) return(false);
  525.  
  526.   var titleRes = RDF.GetResource("http://home.netscape.com/NC-rdf#title");
  527.   if (!titleRes)  return(false);
  528.  
  529.   var newName = RDF.GetLiteral(result.value);
  530.   if (!newName) return(false);
  531.  
  532.   var oldName = catDS.GetTarget(currentCatRes, titleRes, true);
  533.   if (oldName)  oldName = oldName.QueryInterface(Components.interfaces.nsIRDFLiteral);
  534.   if (oldName)
  535.   {
  536.     catDS.Change(currentCatRes, titleRes, oldName, newName);
  537.   }
  538.   else
  539.   {
  540.     catDS.Assert(currentCatRes, titleRes, newName, true);
  541.   }
  542.  
  543.   // force popup to update
  544.   chooseCategory(categoryList.selectedItem);
  545.  
  546.   return(true);
  547. }
  548.  
  549.  
  550.  
  551. function RemoveCategory()
  552. {
  553.   // make sure we have at least one category
  554.   var categoryPopup = document.getElementById( "categoryPopup" );
  555.   if (!categoryPopup) return(false);
  556.   if (categoryPopup.childNodes.length < 1)  return(false);
  557.  
  558.   var promptStr = bundle.GetStringFromName("RemoveCategoryPrompt");
  559.   if (!confirm(promptStr))  return(false);
  560.  
  561.   var categoryRes = RDF.GetResource("NC:SearchCategoryRoot");
  562.   if (!categoryRes) return(false);
  563.  
  564.   var categoryList = document.getElementById( "categoryList" );
  565.   if (!categoryList)  return(false);
  566.  
  567.   var idNum = categoryList.selectedIndex;
  568.  
  569.   var id = categoryList.selectedItem.getAttribute("id");
  570.   if ((!id) || (id == ""))  return(false);
  571.  
  572.   var idRes = RDF.GetResource(id);
  573.   if (!idRes) return(false);
  574.  
  575.   RDFC.Init(catDS, categoryRes);
  576.  
  577.   var nodeIndex = RDFC.IndexOf(idRes);
  578.   if (nodeIndex < 1)  return(false);    // how did that happen?
  579.  
  580.   RDFC.RemoveElementAt(nodeIndex, true, idRes);
  581.  
  582.   // try and select another category
  583.   if (idNum > 0)  --idNum;
  584.   else    idNum = 0;
  585.  
  586.   if (categoryPopup.childNodes.length > 0)
  587.   {
  588.     categoryList.selectedItem = categoryPopup.childNodes[idNum];
  589.     chooseCategory(categoryList.selectedItem);
  590.   }
  591.   else
  592.   {
  593.     // last category was deleted, so empty out engine list
  594.     var treeNode = document.getElementById("engineList");
  595.     if (treeNode)
  596.     {
  597.       treeNode.setAttribute( "ref", "" );
  598.     }
  599.   }
  600.   return(true);
  601. }
  602.  
  603.  
  604.  
  605. function selectItems(listbox, containerID, targetID)
  606. {
  607.   var select_list = listbox.getElementsByAttribute("id", targetID);
  608.   for (var x=0; x<select_list.length; x++)
  609.   {
  610.     var node = select_list[x];
  611.     if (!node)  continue;
  612.  
  613.     var parent = node.parentNode;
  614.     if (!parent)  continue;
  615.  
  616.     var id = parent.getAttribute("ref");
  617.     if (!id || id=="")
  618.     {
  619.       id = parent.getAttribute("id");
  620.     }
  621.     if (!id || id=="")  continue;
  622.  
  623.     if (id == containerID)
  624.     {
  625.       listbox.selectItem(node);
  626.       break;
  627.     }
  628.   }
  629. }
  630.