/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Original Author(s): * Robert John Churchill * * Contributor(s): * Ben Goodger * Rob Ginda * Steve Lamm */ const WMEDIATOR_PROGID = "component://netscape/rdf/datasource?name=window-mediator"; const ISEARCH_PROGID = "component://netscape/rdf/datasource?name=internetsearch"; const RDFSERVICE_PROGID = "component://netscape/rdf/rdf-service"; const BMARKS_PROGID = "component://netscape/browser/bookmarks-service"; const nsIBookmarksService = Components.interfaces.nsIBookmarksService; const nsIWindowMediator = Components.interfaces.nsIWindowMediator; const nsIRDFService = Components.interfaces.nsIRDFService; const nsIRDFLiteral = Components.interfaces.nsIRDFLiteral; const nsIRDFDataSource = Components.interfaces.nsIRDFDataSource; const nsIRDFRemoteDataSource = Components.interfaces.nsIRDFRemoteDataSource; const nsIInternetSearchService = Components.interfaces.nsIInternetSearchService; const nsIPref = Components.interfaces.nsIPref; const STRINGBUNDLE_URL = "chrome://communicator/locale/search/search-panel.properties"; var rootNode = null; var textArc = null; var modeArc = null; var RDF_observer = new Object; var pref = null; var bundle = null; function debug(msg) { // uncomment for debugging information // dump(msg+"\n"); } // get the click count pref try { pref = Components.classes["component://netscape/preferences"]; if (pref) pref = pref.getService(nsIPref); } catch(e) { debug("Exception " + e + " trying to get prefs.\n"); } RDF_observer = { onAssert : function(ds, src, prop, target) { if ((src == rootNode) && (prop == textArc)) { rememberSearchText(target); } else if ((src == rootNode) && (prop == modeArc)) { updateSearchMode(); } }, onUnassert : function(ds, src, prop, target) { }, onChange : function(ds, src, prop, old_target, new_target) { if ((src == rootNode) && (prop == textArc)) { rememberSearchText(new_target); } else if ((src == rootNode) && (prop == modeArc)) { updateSearchMode(); } }, onMove : function(ds, old_src, new_src, prop, target) { }, beginUpdateBatch : function(ds) { }, endUpdateBatch : function(ds) { } } function rememberSearchText(target) { if (target) target = target.QueryInterface(nsIRDFLiteral); if (target) target = target.Value; if (target && (target != "")) { var textNode = document.getElementById("sidebar-search-text"); if (!textNode) return(false); // convert pluses (+) back to spaces target = target.replace(/+/i, " "); textNode.value = unescape(target); doEnabling(); } // show the results tab switchTab(0); } function updateSearchMode() { var searchMode = 0; try { if (pref) searchMode = pref.GetIntPref("browser.search.mode"); var categoryBox = document.getElementById("categoryBox"); if (categoryBox) { if (searchMode == 0) { categoryBox.setAttribute("collapsed", "true"); switchTab(0); } else { categoryBox.removeAttribute("collapsed"); switchTab(1); } } } catch(ex) { } return(searchMode); } // Initialize the Search panel: // 1) init the category list // 2) load the search engines associated with this category // 3) initialise the checked state of said engines. function SearchPanelStartup() { bundle = srGetStrBundle( STRINGBUNDLE_URL ); var tree = document.getElementById("Tree"); if (tree) { var rdf = Components.classes[RDFSERVICE_PROGID].getService(nsIRDFService); if (rdf) { rootNode = rdf.GetResource("NC:LastSearchRoot", true); textArc = rdf.GetResource("http://home.netscape.com/NC-rdf#LastText", true); modeArc = rdf.GetResource("http://home.netscape.com/NC-rdf#SearchMode", true); tree.database.AddObserver(RDF_observer); } } var internetSearch = Components.classes[ISEARCH_PROGID].getService(nsIInternetSearchService); if (internetSearch) { var catDS = internetSearch.GetCategoryDataSource(); if (catDS) catDS = catDS.QueryInterface(nsIRDFDataSource); if (catDS) { var categoryList = document.getElementById("categoryList"); if (categoryList) { categoryList.database.AddDataSource(catDS); var ref = categoryList.getAttribute("ref"); if (ref) categoryList.setAttribute("ref", ref); } var engineTree = document.getElementById("searchengines"); if (engineTree) { engineTree.database.AddDataSource(catDS); var ref = engineTree.getAttribute("ref"); if (ref) engineTree.setAttribute("ref", ref); } } } // try and determine last category name used var lastCategoryName = ""; try { if (pref) lastCategoryName = pref.CopyCharPref( "browser.search.last_search_category" ); if (lastCategoryName != "") { // strip off the prefix if necessary var prefix="NC:SearchCategory?category="; if (lastCategoryName.indexOf(prefix) == 0) { lastCategoryName = lastCategoryName.substr(prefix.length); } } } catch( e ) { debug("Exception in SearchPanelStartup\n"); lastCategoryName = ""; } debug("\nSearchPanelStartup: lastCategoryName = '" + lastCategoryName + "'\n"); // select the appropriate category var categoryList = document.getElementById( "categoryList" ); var categoryPopup = document.getElementById( "categoryPopup" ); if( categoryList && categoryPopup ) { var found = false; for( var i = 0; i < categoryPopup.childNodes.length; i++ ) { if( ( lastCategoryName == "" && categoryPopup.childNodes[i].getAttribute("data") == "NC:SearchEngineRoot" ) || ( categoryPopup.childNodes[i].getAttribute("id") == lastCategoryName ) ) { categoryList.selectedItem = categoryPopup.childNodes[i]; found = true; break; } } if (found == false) { categoryList.selectedItem = categoryPopup.childNodes[0]; } if (( lastCategoryName == "" ) || (lastCategoryName == null)) { lastCategoryName = "NC:SearchEngineRoot"; } if (lastCategoryName != "NC:SearchEngineRoot") { lastCategoryName = "NC:SearchCategory?category=" + lastCategoryName; } var treeNode = document.getElementById("searchengines"); treeNode.setAttribute( "ref", lastCategoryName ); } loadEngines( lastCategoryName ); var searchMode = updateSearchMode(); // if we have search results, show them, otherwise show engines if ((haveSearchResults() == true) || (searchMode == 0)) { switchTab(0); } else { switchTab(1); } } function haveSearchResults() { var resultsTree = document.getElementById("Tree"); if( !resultsTree) return(false); var ds = resultsTree.database; if (!ds) return(false); var rdf = Components.classes[RDFSERVICE_PROGID].getService(nsIRDFService); if (rdf) { var source = rdf.GetResource( "NC:LastSearchRoot", true); var childProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#LastText", true); var target = ds.GetTarget(source, childProperty, true); if (target) target = target.QueryInterface(nsIRDFLiteral); if (target) target = target.Value; if (target && target != "") { var textNode = document.getElementById("sidebar-search-text"); if (!textNode) return(false); // convert pluses (+) back to spaces target = target.replace(/+/i, " "); textNode.value = unescape(target); return(true); } } return(false); } function getNumEngines() { var treeChildrenNode = document.getElementById("engineKids"); var numChildren = treeChildrenNode.childNodes.length; debug("getNumEngines: numChildren = " + numChildren + "\n"); return(numChildren); } function chooseCategory( aNode ) { var category = !aNode.id ? "NC:SearchEngineRoot" : "NC:SearchCategory?category=" + aNode.getAttribute("id"); if (pref) pref.SetUnicharPref("browser.search.last_search_category", category); var treeNode = document.getElementById("searchengines"); if (treeNode) { debug("chooseCategory: ref='" + category + "'\n"); treeNode.setAttribute("ref", category); } loadEngines(category); return(true); } // check an engine representation in the engine list function doCheck(aNode) { saveEngines(); return(false); } function saveEngines() { var categoryList = document.getElementById("categoryList"); var category = categoryList.selectedItem.getAttribute("id"); if( category ) { category = "NC:SearchCategory?category=" + category; } else { category = "NC:SearchEngineRoot"; } debug("Category: " + category + "\n"); var rdf = Components.classes[RDFSERVICE_PROGID].getService(nsIRDFService); if (rdf) { var localStore = rdf.GetDataSource("rdf:local-store"); if( !localStore ) return(false); var engineBox = document.getElementById("engineKids"); if( !engineBox ) return false; var checkedProperty = rdf.GetResource( "http://home.netscape.com/NC-rdf#checked", true ); var categorySRC = rdf.GetResource( category, true ); debug("# of engines: " + engineBox.childNodes.length + "\n"); for (var x = 0; x < engineBox.childNodes.length; x++) { var treeitemNode = engineBox.childNodes[x]; var engineURI = treeitemNode.getAttribute("id"); var engineSRC = rdf.GetResource(engineURI, true); var checkboxNode = treeitemNode.firstChild.firstChild.firstChild; if( !checkboxNode ) continue; if( checkboxNode.checked == true || checkboxNode.checked == "true") { debug(" Check engine #" + x + " " + engineURI + "\n"); localStore.Assert( categorySRC, checkedProperty, engineSRC, true ); } else { debug("UnCheck engine #" + x + " " + engineURI + "\n"); localStore.Unassert( categorySRC, checkedProperty, engineSRC, true ); } } // save changes; flush out the localstore try { var flushableStore = localStore.QueryInterface(nsIRDFRemoteDataSource); if (flushableStore) flushableStore.Flush(); debug("Flushed changes\n\n"); } catch(ex) { } } } // initialise the appropriate engine list, and the checked state of the engines function loadEngines( aCategory ) { var rdf = Components.classes[RDFSERVICE_PROGID].getService(nsIRDFService); if (rdf) { var localStore = rdf.GetDataSource("rdf:local-store"); if (localStore) { var engineBox = document.getElementById("engineKids"); if( engineBox ) { var numEngines = engineBox.childNodes.length; var checkedProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#checked", true); var categorySRC = rdf.GetResource( aCategory, true ); for (var x = 0; x 0) { // in advanced search mode, get selected search engines // (for the current search category) var engineBox = document.getElementById("engineKids"); if (!engineBox) return(false); for (var x = 0; x 0) { siteOffset += 3; var endOffset = lastSearchText.indexOf("/", siteOffset); if (endOffset > 0) { lastSearchText = lastSearchText.substr(0, endOffset+1); } } } var bmks = Components.classes[BMARKS_PROGID].getService(nsIBookmarksService); var textNode = document.getElementById("sidebar-search-text"); if( !textNode ) return(false); var searchTitle = "Search: '" + lastSearchText + "'"; // using " + gSites; if (bmks) bmks.AddBookmark(lastSearchURI, searchTitle, bmks.BOOKMARK_SEARCH_TYPE, null); return(true); } function doCustomize() { window.openDialog("chrome://communicator/content/search/search-editor.xul", "_blank", "centerscreen,chrome,resizable"); } function loadURLInContent(url) { var appCore = getNavigatorWindowAppCore(); if (appCore) appCore.loadUrl(url); } // retrieves the most recent navigator window function getNavigatorWindow() { const WM_PROGID = "component://netscape/rdf/datasource?name=window-mediator"; var wm; if (top.document) { var possibleNavigator = top.document.getElementById("main-window"); if (possibleNavigator && possibleNavigator.getAttribute("windowtype") == "navigator:browser") return top; else { wm = nsJSComponentManager.getService(WM_PROGID, "nsIWindowMediator"); return wm ? wm.getMostRecentWindow("navigator:browser") : openNewNavigator(); } } else { wm = nsJSComponentManager.getService(WM_PROGID, "nsIWindowMediator"); return wm ? wm.getMostRecentWindow("navigator:browser") : openNewNavigator(); } } // retrieves the most recent navigator window's crap core. function getNavigatorWindowAppCore() { var navigatorWindow = getNavigatorWindow(); return navigatorWindow.appCore; } function openNewNavigator() { var newNavigator = open(search_getBrowserURL(), "_blank", "chrome,all,dialog=no"); dump("*** newNavigator - " + newNavigator + "\n"); return newNavigator; } function search_getBrowserURL() { var url = "chrome://navigator/content/navigator.xul"; if (pref) { var temp = pref.CopyCharPref("browser.chromeURL"); if (temp) url = temp; } return url; } function doEnabling() { var searchButton = document.getElementById("searchbutton"); var sidebarSearchText = document.getElementById("sidebar-search-text"); if ( sidebarSearchText.value == "" ) { // No input, disable search button if enabled. if ( !searchButton.getAttribute("disabled") ) searchButton.setAttribute("disabled","true"); } else { if ( searchButton.getAttribute("disabled") == "true") { searchButton.removeAttribute("disabled"); } } }