3 <title>mikers experimental opensearch portal</title>
13 border-collapse: collapse;
14 border: solid gray 1px;
18 border-collapse: collapse;
22 border-bottom: 1px dashed darkgrey;
30 function create_requestor () {
33 req = new ActiveXObject("Msxml2.XMLHTTP");
37 req = new ActiveXObject("Microsoft.XMLHTTP");
44 if (!req && typeof XMLHttpRequest!='undefined') {
45 req = new XMLHttpRequest();
49 alert("NEEDS NEWER JAVASCRIPT for XMLHTTPRequest()");
56 var proxy = 'http://gapines.org/opensearch/?fetch=';
59 var search_templates = [];
63 var display_mode = 'int';
64 var current_startPage = 1;
65 var current_startIndex = 1;
66 var current_count = 5;
68 function opensearch ( term, reset ) {
70 var tot = document.getElementById('total');
72 tot.removeChild(tot.lastChild);
74 var src = document.getElementById('result_sources');
76 src.removeChild(src.lastChild);
78 var tab = document.getElementById('results');
80 tab.removeChild(tab.lastChild);
83 var sources = new Array();
84 var selector = document.getElementById('sources');
85 for (var i = 0; i < selector.options.length; i++) {
86 if (selector.options[i].selected) {
87 sources.push(selector.options[i].value);
91 search_templates = [];
92 for (var i in sources) {
93 create_search( sources[i] );
97 current_startPage = 1;
99 current_startIndex = (current_count * (current_startPage - 1)) + 1;
102 for (var i in search_templates) {
103 if (!search_templates[i])
109 var url = search_templates[i].replace(/\{searchTerms\}/,encodeURIComponent(term));
110 url = url.replace(/\{startPage\}/,current_startPage);
111 url = url.replace(/\{startIndex\}/,current_startIndex);
112 url = url.replace(/\{count\}/,current_count);
113 url = url.replace(/\{relevanceScale}/,rel_scales[i]);
114 search_urls[i] = proxy + encodeURIComponent(url);
116 src.innerHTML += '<a href="' + url + '">' + url + '</a><br>';
119 for (var i in search_urls) {
120 if (!search_templates[i])
127 function perform_search ( source ) {
128 var req = create_requestor();
130 req.onreadystatechange = function () {
131 if (req.readyState != 4)
134 var xml = req.responseXML;
136 var total = getElementFloatNS('openSearch','totalResults',xml,0);
137 rel_scales[source] = getElementFloatNS('openIll','relevanceScale',xml,0);
138 var current_tot = getElementFloatNS('','span',document.getElementById('total').parentNode,0);
139 var tot = document.getElementById('total');
144 tot.innerHTML = total + current_tot;
146 var list = xml.getElementsByTagName('item');
147 for (var i = 0; i < list.length; i++) {
149 if ( typeof list[i] != 'object')
152 var tab = document.getElementById('results');
153 if (display_mode == 'col') {
154 var col = document.getElementById(source);
156 var row = tab.rows[0];
158 row = tab.insertRow(0);
160 col = document.createElement('td');
161 col.setAttribute('id',source);
162 row.appendChild(col);
164 tab = document.createElement('table');
165 tab.setAttribute('valign','top');
166 tab.setAttribute('class','col_tab');
167 col.appendChild(tab);
169 var per = parseInt(100 / search_urls.length);
170 col.setAttribute('valign','top');
171 col.setAttribute('width', + per + '%');
174 tab = col.firstChild;
178 if (!tab.rows.length) {
179 add_result_row(tab, 0, list[i], source);
181 for (var j = 0; j < tab.rows.length; j++) {
182 if ( typeof tab.rows[j] != 'object')
187 rank = getElementFloatNS('openIll','relevance',list[i],0);
189 alert("error getting float relevance: " + e);
193 if ( rank < parseFloat(tab.rows[j].firstChild.firstChild.textContent) ) {
194 if ( (j + 1) == tab.rows.length) {
195 add_result_row(tab, tab.rows.length, list[i], source);
200 add_result_row(tab, j, list[i], source);
207 req.open('GET', proxy + encodeURIComponent(search_urls[source]), true);
212 // retrieve text of an XML document element, including
213 // elements using namespaces
214 function getElementFloatNS(prefix, local, parentElem, index) {
216 if (prefix && isIE) {
217 // IE/Windows way of handling namespaces
218 result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
220 // the namespace versions of this method
221 // (getElementsByTagNameNS()) operate
222 // differently in Safari and Mozilla, but both
223 // return value with just local name, provided
224 // there aren't conflicts with non-namespace element
226 result = parentElem.getElementsByTagName(local)[index];
229 // get text, accounting for possible
230 // whitespace (carriage return) text nodes
231 if (result.childNodes.length > 1) {
232 return parseFloat(result.childNodes[1].nodeValue);
234 return parseFloat(result.textContent);
241 function add_result_row (tab, index, xml, source) {
242 var img = images[source];
243 var rank,title,tlink,desc;
246 rank = getElementFloatNS('openIll','relevance',xml,0);
248 alert("error getting relevance: " + e);
253 title = xml.getElementsByTagName('title')[0].textContent;
259 tlink = xml.getElementsByTagName('link')[0].textContent;
265 description = xml.getElementsByTagName('description')[0].textContent;
270 var row = tab.insertRow(index);
271 row.className = 'res_tr';
272 row.innerHTML = '<td style="padding: 4px"><div style="display: none; visibility: hidden;">' + rank +
273 '</div><a href="' + tlink + '">' + title + '</a><br/>' + description +
274 '</td><td><img title="' + parseInt(rank) + '% Relevant" width="32" height="32" src="' + img + '"></td>';
277 function create_search ( s ) {
278 var req = create_requestor();
280 req.open('GET',proxy + encodeURIComponent(s),false);
284 var xml = req.responseXML;
285 search_templates[s] = xml.getElementsByTagName('Url')[0].textContent;
286 var i = xml.getElementsByTagName('Image');
288 images[s] = i[0].textContent;
290 alert('BAD XML!\n\n' + e + '\n\n' + req.responseText);
291 search_templates[s] = null;
301 <form onsubmit="opensearch(document.getElementById('term').value, true); return false;">
304 <td>Keyword Search: </td>
305 <td><input type="text" id="term" value="javascript"/></td>
310 <select id="sources" multiple="multiple" size=5>
311 <option value="http://gapines.org/opensearch.xml" selected>GPLS Pines</option>
312 <option value="http://search.athenscounty.lib.oh.us/cgi-bin/koha/opensearchdescription" selected>NPL/Koha</option>
313 <option value="http://www.webdevref.com/blog/opensearchdescription.xml" selected>WebDefRef</option>
317 <td>Hits per Source: </td>
319 <select onchange="current_count=this.options[this.selectedIndex].value;">
320 <option value="5" selected>5</option>
321 <option value="10">10</option>
322 <option value="25">25</option>
326 <td>Display mode: </td>
328 <select onchange="display_mode=this.options[this.selectedIndex].value;">
329 <option value="int" selected>Integrated</option>
330 <option value="col">Columns</option>
331 </select> (Use "Columns" when searching unranked sources)
334 <td colspan="2"><input type="submit" value="Go!"/></td>
339 <div id="result_sources"></div>
341 <div>Total results: <span id="total"/></div>
342 <h1>Search Results</h1>
344 <button onclick="current_startPage -= 1; opensearch(document.getElementById('term').value);">Previous Page</button>
346 <button onclick="current_startPage += 1; opensearch(document.getElementById('term').value);">Next Page</button>
349 <table class="res_table" id="results"/>