blob: 5d7a35ed2175eff112fa9afd67bf561809948e3a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var currentEngines = [];
var templateMap = [];
/**
* Helper function to extract create map of new engines, keyed by template url
* @param searchURLs template search urls.
* @param description
* opensearch description being added or removed.
* @param added
* true if new description, false if removed.
*/
extractURLs = function(searchUrls, description, added) {
var newEngines = [];
for (var i in searchUrls) {
var template = searchUrls[i]['@template'];
if (template != null) {
var descType = searchUrls[i]['@type'];
if (descType == 'application/atom+xml') {
if (added) {
if (currentEngines[template] == null) {
newEngines[template] = description.OpenSearchDescription.ShortName;
templateMap[template] = 1;
} else {
templateMap[template]++;
}
} else {
if (currentEngines[template] != null) {
if (templateMap[template] == 1) {
var oldEngine = document.getElementById(template);
oldEngine.parentNode.removeChild(oldEngine);
delete currentEngines[template];
} else {
templateMap[template]--;
}
}
}
}
}
}
return newEngines;
};
/**
* Callback passed to the opensearch feature to react to addition/removal of
* gadgets containing OpenSearch descriptions.
*
* @param description
* opensearch description being added or removed.
* @param added
* true if new description, false if removed.
*/
updateEngines = function(description, added) {
var searchUrls = [];
if (!(description.OpenSearchDescription.Url instanceof Array)) {
searchUrls.push(description.OpenSearchDescription.Url);
} else {
searchUrls = description.OpenSearchDescription.Url;
}
var newEngines = extractURLs(searchUrls, description, added);
var span = document.getElementById('engineList');
for (templateUrl in newEngines) {
var current = newEngines[templateUrl];
span.innerHTML = span.innerHTML
+ '<input type=\"checkbox\" checked=\"true\" id=\"' + templateUrl
+ '\" />' + current;
span.innerHTML = span.innerHTML + '<br/>';
currentEngines[templateUrl] = current;
}
};
CommonContainer.opensearch.addOpenSearchCallback(updateEngines);
/**
* Clears old search results, and fetches new ones.
*
*/
function updateSearchURLs() {
// clear the old results
$(function() {
$('#results').dialog({
autoOpen: false
});
});
$('#results').dialog('option', 'minWidth', 1000);
$('#results').dialog('open');
//var div = document.getElementById("results");
/*while (div.hasChildNodes()) {
div.removeChild(div.firstChild);
}*/
$('#results').empty();
//div.innerHTML = document.getElementById("query").value;
$('#results').innerHTML = document.getElementById('query').value;
// fetch new results.
getSearchResults(currentEngines, document.getElementById('query').value);
}
/**
* Iterates over template urls and fetches search results.
*
* @param urls
* all the opensearch template urls in the container.
* @param query
* query string.
*/
function getSearchResults(urls, query) {
// callback function to be called by the fetching code.
/**
* @param obj
* the result data object, should be XML.
* @param engineTitle
* title of the engine being searched.
*/
function urlResponse(obj, engineTitle) {
// create placeholder for results
var su = document.getElementById('results');
var resultDiv = document.createElement('div');
su.appendChild(resultDiv);
// if there are no errors, parse the results
if (obj.errors.length == 0) {
resultDiv.className = 'searchEngine';
var domdata = obj.data;
if (domdata != null) {
var entries = domdata.getElementsByTagName('entry');
resultDiv.innerHTML = resultDiv.innerHTML + engineTitle + ':<br/>';
if (entries.legnth == 0) {
resultDiv.innerHTML = resultDiv.innerHTML + ('No results found');
} else {
var resultCount = entries.length;
if (resultCount > 15) {
resultCount = 15;
}
for (i = 0; i < resultCount; i++) {
if (entries[i].getElementsByTagName('title').length > 0) {
titles = entries[i].getElementsByTagName('title');
title = titles[0].childNodes[0].nodeValue;
} else {
title = 'Untitled';
}
var link = null;
//for standard atom results, we can extract the link
if (entries[i].getElementsByTagName('link').length > 0) {
links = entries[i].getElementsByTagName('link');
link = links[0].attributes.href.nodeValue;
}
var summaryNode = entries[i].getElementsByTagName('summary')[0];
if (summaryNode == null) {
summaryNode = entries[i].getElementsByTagName('description')[0];
}
if (link == null) {
resultDiv.innerHTML = resultDiv.innerHTML
+ '<p style=\"color:blue\"/>'
+ gadgets.util.escapeString(title);
} else {
resultDiv.innerHTML = resultDiv.innerHTML
+ '<p style=\"color:blue\"/>'
+ '<a href=\"'+ link + '\" target=\"_blank\">'
+ gadgets.util.escapeString(title)
+ '</a>';
}
if (summaryNode != null) {
var summary = summaryNode.textContent;
if (summary != null) {
resultDiv.innerHTML = resultDiv.innerHTML
+ gadgets.util.escapeString(summary);
}
}
}
}
}
} else { // errors occured, notify the user.
resultDiv.innerHTML = resultDiv.innerHTML + engineTitle
+ '<br/> An error has occured:' + obj.errors[0];
}
}
var params = {};
for (url in currentEngines) {
// check if the current engine is selected.
if (document.getElementById(url).checked) {
title = currentEngines[url];
// replace placeholder with actual search term.
url = url.replace('{searchTerms}', query);
// for now, start on page 1
url = url.replace('{startPage?}', 1);
// makes sure that the title corresponds to the engine being search.
// Resolves a prior timing issue.
var callback = function() {
var myTitle = '' + title;
return function(response) {
urlResponse(response, myTitle);
};
}();
// go fetch the results.
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
gadgets.io.makeRequest(url, callback, params);
}
}
}