gecko-dev/suite/common/search/internetresults.js

220 lines
6.6 KiB
JavaScript

function searchResultsOpenURL(event)
{
var tree = document.getElementById("resultsList");
var node = tree.contentView.getItemAtIndex(tree.currentIndex);
var url = node.id;
var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
if (rdf) rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
if (rdf)
{
var ds = rdf.GetDataSource("rdf:internetsearch");
if (ds)
{
var src = rdf.GetResource(url, true);
var prop = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true);
var target = ds.GetTarget(src, prop, true);
if (target) target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
if (target) target = target.Value;
if (target) url = target;
}
}
// Ignore "NC:" urls.
if (url.substring(0, 3) == "NC:")
return false;
if ("loadURI" in top)
top.loadURI(url);
else
top._content.location.href = url;
return true;
}
// Workaround for bug 196057 (double onload event): accept only the first onload event
// ( This workaround will fix bug 147068 (duplicate search results).
// Without this fix, xpfe\components\search\src\nsInternetSearchService.cpp will
// crash when removing the same tree node twice. )
// If bug 196057 should be fixed eventually, this workaround does no harm -
// nevertheless it should be removed then
var gbProcessOnloadEvent = true;
function onLoadInternetResults()
{
if (gbProcessOnloadEvent)
{ // forbid other onload events
gbProcessOnloadEvent = false;
// clear any previous results on load
var iSearch = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
.getService(Components.interfaces.nsIInternetSearchService);
iSearch.ClearResultSearchSites();
// the search URI is passed in as a parameter, so get it and them root the results list
var searchURI = top._content.location.href;
if (searchURI) {
const lastSearchURIPref = "browser.search.lastMultipleSearchURI";
var offset = searchURI.indexOf("?");
if (offset > 0) {
nsPreferences.setUnicharPref(lastSearchURIPref, searchURI); // evil
searchURI = searchURI.substr(offset+1);
loadResultsList(searchURI);
}
else {
searchURI = nsPreferences.copyUnicharPref(lastSearchURIPref, "");
offset = searchURI.indexOf("?");
if (offset > 0) {
nsPreferences.setUnicharPref(lastSearchURIPref, searchURI); // evil
searchURI = searchURI.substr(offset+1);
loadResultsList(searchURI);
}
}
}
}
return true;
}
function loadResultsList( aSearchURL )
{
var resultsTree = document.getElementById( "resultsList" );
if (!resultsTree) return false;
resultsTree.setAttribute("ref", unescape(aSearchURL));
return true;
}
function doEngineClick( event, aNode )
{
event.target.checked = true;
var html = null;
var resultsTree = document.getElementById("resultsList");
var contentArea = document.getElementById("content");
var splitter = document.getElementById("results-splitter");
var engineURI = aNode.id;
if (engineURI == "allEngines") {
resultsTree.removeAttribute("hidden");
splitter.removeAttribute("hidden");
}
else
{
resultsTree.setAttribute("hidden", "true");
splitter.setAttribute("hidden", "true");
try
{
var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
if (rdf) rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
if (rdf)
{
var internetSearchStore = rdf.GetDataSource("rdf:internetsearch");
if (internetSearchStore)
{
var src = rdf.GetResource(engineURI, true);
var htmlProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#HTML", true);
html = internetSearchStore.GetTarget(src, htmlProperty, true);
if ( html ) html = html.QueryInterface(Components.interfaces.nsIRDFLiteral);
if ( html ) html = html.Value;
}
}
}
catch(ex)
{
}
}
if ( html )
{
var doc = frames[0].document;
if (doc)
{
doc.open("text/html", "replace");
doc.writeln( html );
doc.close();
}
}
else
frames[0].document.location = "chrome://communicator/locale/search/default.htm";
}
function doResultClick(node)
{
var theID = node.id;
if (!theID) return(false);
try
{
var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
if (rdf) rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
if (rdf)
{
var internetSearchStore = rdf.GetDataSource("rdf:internetsearch");
if (internetSearchStore)
{
var src = rdf.GetResource(theID, true);
var urlProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true);
var bannerProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#Banner", true);
var htmlProperty = rdf.GetResource("http://home.netscape.com/NC-rdf#HTML", true);
var url = internetSearchStore.GetTarget(src, urlProperty, true);
if (url) url = url.QueryInterface(Components.interfaces.nsIRDFLiteral);
if (url) url = url.Value;
if (url)
{
var statusNode = document.getElementById("status-button");
if (statusNode)
{
statusNode.label = url;
}
}
var banner = internetSearchStore.GetTarget(src, bannerProperty, true);
if (banner) banner = banner.QueryInterface(Components.interfaces.nsIRDFLiteral);
if (banner) banner = banner.Value;
var target = internetSearchStore.GetTarget(src, htmlProperty, true);
if (target) target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
if (target) target = target.Value;
if (target)
{
var text = "<HTML><HEAD><TITLE>Search</TITLE><BASE TARGET='_top'></HEAD><BODY><FONT POINT-SIZE='9'>";
if (banner)
text += banner + "</A><BR>"; // add a </A> and a <BR> just in case
text += target;
text += "</FONT></BODY></HTML>"
var doc = frames[0].document;
doc.open("text/html", "replace");
doc.writeln(text);
doc.close();
}
}
}
}
catch(ex)
{
}
return(true);
}
function listSelect(event)
{
var tree = document.getElementById("resultsList");
if (tree.view.selection.count != 1)
return false;
var selection = tree.contentView.getItemAtIndex(tree.currentIndex);
doResultClick(selection);
}
function listClick(event)
{
if (event.detail == 2 && event.button == 0)
searchResultsOpenURL(event);
}