3 <title>mikers experimental opensearch portal</title>
13 border: solid lightblue 1px;
21 border-collapse: collapse;
22 border: solid gray 1px;
26 border-collapse: collapse;
30 border-bottom: 1px dashed darkgrey;
38 function create_requestor () {
41 req = new ActiveXObject("Msxml2.XMLHTTP");
45 req = new ActiveXObject("Microsoft.XMLHTTP");
52 if (!req && typeof XMLHttpRequest!='undefined') {
53 req = new XMLHttpRequest();
57 alert("NEEDS NEWER JAVASCRIPT for XMLHTTPRequest()");
64 var proxy = 'http://gapines.org/opensearch/?fetch=';
67 var search_templates = [];
71 var display_mode = 'int';
72 var current_startPage = 1;
73 var current_startIndex = 1;
74 var current_count = 5;
76 function opensearch ( term, reset ) {
78 document.getElementById('next_button').className = 'hide';
79 document.getElementById('next_button').className = 'hide';
81 if (current_startPage == 1)
82 document.getElementById('prev_button').className = 'hide';
84 document.getElementById('prev_button').className = '';
86 var tot = document.getElementById('total');
88 tot.removeChild(tot.lastChild);
90 var src = document.getElementById('result_sources');
92 src.removeChild(src.lastChild);
94 var tab = document.getElementById('results');
96 tab.removeChild(tab.lastChild);
100 var sources = new Array();
101 var selector = document.getElementById('sources');
102 for (var i = 0; i < selector.options.length; i++) {
103 if (selector.options[i].selected) {
104 sources.push(selector.options[i].value);
108 search_templates = [];
109 for (var i in sources) {
110 create_search( sources[i] );
114 current_startPage = 1;
116 current_startIndex = (current_count * (current_startPage - 1)) + 1;
119 for (var i in search_templates) {
120 if (!search_templates[i])
126 var url = search_templates[i].replace(/\{searchTerms\}/,encodeURIComponent(term));
127 url = url.replace(/\{startPage\}/,current_startPage);
128 url = url.replace(/\{startIndex\}/,current_startIndex);
129 url = url.replace(/\{count\}/,current_count);
130 url = url.replace(/\{relevanceScale}/,rel_scales[i]);
131 search_urls[i] = proxy + encodeURIComponent(url);
133 src.innerHTML += '<a href="' + url + '">' + url + '</a><br>';
136 for (var i in search_urls) {
137 if (!search_templates[i])
143 document.getElementById('page_label').innerHTML = current_startPage;
146 function perform_search ( source ) {
147 var req = create_requestor();
149 req.onreadystatechange = function () {
150 if (req.readyState != 4)
153 var xml = req.responseXML;
155 var desc = getElementTextNS('','description',xml,0);
157 var total = getElementFloatNS('openSearch','totalResults',xml,0);
158 rel_scales[source] = getElementFloatNS('openIll','relevanceScale',xml,0);
159 var current_tot = getElementFloatNS('','span',document.getElementById('total').parentNode,0);
160 var tot = document.getElementById('total');
165 if (total > (current_startPage * current_count))
166 document.getElementById('next_button').className = '';
169 tot.innerHTML = current_tot;
171 var list = xml.getElementsByTagName('item');
172 for (var i = 0; i < list.length; i++) {
174 if ( typeof list[i] != 'object')
177 var tab = document.getElementById('results');
178 if (display_mode == 'col') {
179 var col = document.getElementById(source);
181 var row = tab.rows[0];
183 row = tab.insertRow(0);
185 col = document.createElement('td');
186 col.setAttribute('id',source);
187 row.appendChild(col);
189 tab = document.createElement('table');
190 tab.setAttribute('valign','top');
191 tab.setAttribute('class','col_tab');
193 var cap = document.createElement('caption');
194 tab.appendChild(cap);
195 cap.innerHTML = desc;
197 col.appendChild(tab);
199 var per = parseInt(100 / search_urls.length);
200 col.setAttribute('valign','top');
201 col.setAttribute('width', + per + '%');
204 tab = col.firstChild;
208 if (!tab.rows.length) {
209 add_result_row(tab, 0, list[i], source);
211 for (var j = 0; j < tab.rows.length; j++) {
212 if ( typeof tab.rows[j] != 'object')
217 rank = getElementFloatNS('openIll','relevance',list[i],0);
219 alert("error getting float relevance: " + e);
223 if ( rank < parseFloat(tab.rows[j].firstChild.firstChild.textContent) ) {
224 if ( (j + 1) == tab.rows.length) {
225 add_result_row(tab, tab.rows.length, list[i], source);
230 add_result_row(tab, j, list[i], source);
237 req.open('GET', proxy + encodeURIComponent(search_urls[source]), true);
242 // retrieve float of an XML document element, including
243 // elements using namespaces
244 function getElementFloatNS(prefix, local, parentElem, index) {
246 if (prefix && isIE) {
247 // IE/Windows way of handling namespaces
248 result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
250 // the namespace versions of this method
251 // (getElementsByTagNameNS()) operate
252 // differently in Safari and Mozilla, but both
253 // return value with just local name, provided
254 // there aren't conflicts with non-namespace element
256 result = parentElem.getElementsByTagName(local)[index];
259 // get text, accounting for possible
260 // whitespace (carriage return) text nodes
261 if (result.childNodes.length > 1) {
262 return parseFloat(result.childNodes[1].nodeValue);
264 return parseFloat(result.textContent);
271 // retrieve text of an XML document element, including
272 // elements using namespaces
273 function getElementTextNS(prefix, local, parentElem, index) {
275 if (prefix && isIE) {
276 // IE/Windows way of handling namespaces
277 result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
279 // the namespace versions of this method
280 // (getElementsByTagNameNS()) operate
281 // differently in Safari and Mozilla, but both
282 // return value with just local name, provided
283 // there aren't conflicts with non-namespace element
285 result = parentElem.getElementsByTagName(local)[index];
288 // get text, accounting for possible
289 // whitespace (carriage return) text nodes
290 if (result.childNodes.length > 1) {
291 return result.childNodes[1].nodeValue;
293 return result.textContent;
300 function add_result_row (tab, index, xml, source) {
301 var img = images[source];
302 var rank,title,tlink,desc;
305 rank = getElementFloatNS('openIll','relevance',xml,0);
307 alert("error getting relevance: " + e);
312 title = xml.getElementsByTagName('title')[0].textContent;
318 tlink = xml.getElementsByTagName('link')[0].textContent;
324 description = xml.getElementsByTagName('description')[0].textContent;
329 var row = tab.insertRow(index);
330 row.className = 'res_tr';
331 row.innerHTML = '<td style="padding: 4px"><div style="display: none; visibility: hidden;">' + rank +
332 '</div><a href="' + tlink + '">' + title + '</a><br/>' + description +
333 '</td><td><img title="' + parseInt(rank) + '% Relevant" width="32" height="32" src="' + img + '"></td>';
336 function create_search ( s ) {
337 var req = create_requestor();
339 req.open('GET',proxy + encodeURIComponent(s),false);
343 var xml = req.responseXML;
344 search_templates[s] = xml.getElementsByTagName('Url')[0].textContent;
345 var i = xml.getElementsByTagName('Image');
347 images[s] = i[0].textContent;
349 alert('BAD XML!\n\n' + e + '\n\n' + req.responseText);
350 search_templates[s] = null;
360 <form onsubmit="opensearch(document.getElementById('term').value, true); return false;">
363 <td>Keyword Search: </td>
364 <td><input type="text" id="term" value="javascript"/></td>
369 <select id="sources" multiple="multiple" size=5>
370 <option value="http://gapines.org/opensearch.xml" selected>GPLS Pines</option>
371 <option value="http://search.athenscounty.lib.oh.us/cgi-bin/koha/opensearchdescription" selected>NPL/Koha</option>
372 <option value="http://www.webdevref.com/blog/opensearchdescription.xml" selected>WebDefRef</option>
376 <td>Hits per Source: </td>
378 <select onchange="current_count=this.options[this.selectedIndex].value;">
379 <option value="5" selected>5</option>
380 <option value="10">10</option>
381 <option value="25">25</option>
385 <td>Display mode: </td>
387 <select onchange="display_mode=this.options[this.selectedIndex].value;">
388 <option value="int" selected>Integrated</option>
389 <option value="col">Columns</option>
390 </select> (Use "Columns" when searching unranked sources)
393 <td colspan="2"><input type="submit" value="Go!"/></td>
398 <div id="result_sources"></div>
400 <div>Current page: <span id="page_label"></span> --
401 <button class='hide' id='prev_button' onclick="if (this.className != 'hide') {current_startPage -= 1; opensearch(document.getElementById('term').value);}">Previous Page</button>
403 <button class='hide' id='next_button' onclick="if (this.className != 'hide') {current_startPage += 1; opensearch(document.getElementById('term').value);}">Next Page</button>
405 <div>Total results: <span id="total"/></div>
406 <h1>Search Results</h1>
410 <table class="res_table" id="results"></table>