3 <title>mikers experimental opensearch portal</title>
7 font-family: verdana,arial,helvetica,sans-serif;
13 text-decoration: none;
21 border: dotted blue 1px;
25 border: solid lightblue 1px;
30 text-decoration: none;
35 text-decoration: underline;
40 text-decoration: underline;
45 text-decoration: none;
62 border-collapse: collapse;
63 border: solid gray 1px;
67 border-collapse: collapse;
74 border-bottom: 1px dashed darkgrey;
87 function create_requestor () {
90 req = new ActiveXObject("Msxml2.XMLHTTP");
94 req = new ActiveXObject("Microsoft.XMLHTTP");
101 if (!req && typeof XMLHttpRequest!='undefined') {
102 req = new XMLHttpRequest();
106 alert("NEEDS NEWER JAVASCRIPT for XMLHTTPRequest()");
113 var proxy = 'http://gapines.org/opensearch/?fetch=';
116 var search_templates = [];
117 var search_urls = {};
120 var current_startPage = 1;
121 var current_startIndex = 1;
122 var current_count = 5;
124 function opensearch ( term, reset ) {
127 current_startPage = 1;
131 document.getElementById('next_button').className = 'hide';
133 if (current_startPage == 1)
134 document.getElementById('prev_button').className = 'hide';
136 document.getElementById('prev_button').className = '';
138 var tot = document.getElementById('total');
139 while (tot.lastChild)
140 tot.removeChild(tot.lastChild);
142 var src = document.getElementById('result_sources');
143 while (src.lastChild)
144 src.removeChild(src.lastChild);
146 document.getElementById('int_res_hide').className = 'noshow';
147 document.getElementById('col_res_hide').className = 'noshow';
149 var tab = document.getElementById('int_res');
150 while (tab.lastChild)
151 tab.removeChild(tab.lastChild);
153 tab = document.getElementById('col_res');
154 while (tab.lastChild)
155 tab.removeChild(tab.lastChild);
159 var sources = new Array();
160 var selector = document.getElementsByName('source');
161 for (var i = 0; i < selector.length; i++) {
162 if (selector[i].checked) {
163 sources.push(selector[i].value);
167 search_templates = [];
168 for (var i in sources) {
169 create_search( sources[i] );
172 current_startIndex = (current_count * (current_startPage - 1)) + 1;
175 for (var i in search_templates) {
176 if (!search_templates[i])
182 var url = search_templates[i].replace(/\{searchTerms\}/,encodeURIComponent(term));
183 url = url.replace(/\{startPage\}/,current_startPage);
184 url = url.replace(/\{startIndex\}/,current_startIndex);
185 url = url.replace(/\{count\}/,current_count);
186 url = url.replace(/\{relevanceScale}/,rel_scales[i]);
187 search_urls[i] = proxy + encodeURIComponent(url);
189 src.innerHTML += '<a href="' + url + '">' + url + '</a><br>';
192 for (var i in search_urls) {
193 if (!search_templates[i])
199 document.getElementById('page_label').innerHTML = current_startPage;
202 function perform_search ( source ) {
203 var req = create_requestor();
205 req.onreadystatechange = function () {
206 if (req.readyState != 4)
209 var xml = req.responseXML;
211 var desc = getElementTextNS('','description',xml,0);
212 var xml_link = getElementTextNS('','link',xml,0);
214 var total = getElementFloatNS('openSearch','totalResults',xml,0);
215 var integratible = (getElementNS('openIll','relevance',xml,0) != null);
216 var scale = getElementFloatNS('openIll','relevanceScale',xml,0);
218 rel_scales[source] = scale;
220 var current_tot = getElementFloatNS('','span',document.getElementById('total').parentNode,0);
221 var tot = document.getElementById('total');
226 if (total > (current_startPage * current_count))
227 document.getElementById('next_button').className = '';
230 tot.innerHTML = current_tot;
232 var list = xml.getElementsByTagName('item');
233 for (var i = 0; i < list.length; i++) {
235 if ( typeof list[i] != 'object')
240 tab = document.getElementById('col_res');
241 document.getElementById('col_res_hide').className = '';
242 var col = document.getElementById(source);
244 var row = tab.rows[0];
246 row = tab.insertRow(0);
248 col = document.createElement('td');
249 col.setAttribute('id',source);
250 row.appendChild(col);
252 tab = document.createElement('table');
253 tab.setAttribute('valign','top');
254 tab.setAttribute('class','col_tab');
256 var cap = document.createElement('caption');
257 tab.appendChild(cap);
258 cap.innerHTML = desc + ' -- <a href="' + xml_link + '">XML</a>';
260 col.appendChild(tab);
262 var per = parseInt(100 / search_urls.length);
263 col.setAttribute('valign','top');
264 col.setAttribute('width', + per + '%');
267 tab = col.firstChild;
270 tab = document.getElementById('int_res');
271 document.getElementById('int_res_hide').className = '';
274 if (!tab.rows.length) {
275 add_result_row(tab, 0, list[i], source);
277 for (var j = 0; j < tab.rows.length; j++) {
278 if ( typeof tab.rows[j] != 'object')
283 rank = getElementFloatNS('openIll','relevance',list[i],0);
285 alert("error getting float relevance: " + e);
289 if ( rank < parseFloat(tab.rows[j].firstChild.firstChild.textContent) ) {
290 if ( (j + 1) == tab.rows.length) {
291 add_result_row(tab, tab.rows.length, list[i], source);
296 add_result_row(tab, j, list[i], source);
303 req.open('GET', proxy + encodeURIComponent(search_urls[source]), true);
308 // retrieve float of an XML document element, including
309 // elements using namespaces
310 function getElementFloatNS(prefix, local, parentElem, index) {
311 var result = getElementNS(prefix, local, parentElem, index);
313 // get text, accounting for possible
314 // whitespace (carriage return) text nodes
315 if (result.childNodes.length > 1) {
316 return parseFloat(result.childNodes[1].nodeValue);
318 return parseFloat(result.textContent);
325 function getElementNS(prefix, local, parentElem, index) {
327 if (prefix && isIE) {
328 // IE/Windows way of handling namespaces
329 return parentElem.getElementsByTagName(prefix + ":" + local)[index];
331 // the namespace versions of this method
332 // (getElementsByTagNameNS()) operate
333 // differently in Safari and Mozilla, but both
334 // return value with just local name, provided
335 // there aren't conflicts with non-namespace element
337 return parentElem.getElementsByTagName(local)[index];
341 // retrieve text of an XML document element, including
342 // elements using namespaces
343 function getElementTextNS(prefix, local, parentElem, index) {
344 var result = getElementNS(prefix, local, parentElem, index);
346 // get text, accounting for possible
347 // whitespace (carriage return) text nodes
348 if (result.childNodes.length > 1) {
349 return result.childNodes[1].nodeValue;
351 return result.firstChild.nodeValue;
358 function add_result_row (tab, index, xml, source) {
359 var img = images[source];
360 var rank,title,tlink,desc;
363 rank = getElementFloatNS('openIll','relevance',xml,0);
365 alert("error getting relevance: " + e);
370 title = getElementTextNS('','title',xml,0);
376 tlink = getElementTextNS('','link',xml,0);
382 description = getElementTextNS('','description',xml,0);
387 var row = tab.insertRow(index);
388 row.className = 'res_tr';
389 row.innerHTML = '<td style="padding: 4px"><div style="display: none; visibility: hidden;">' + rank +
390 '</div><span class="title_link"><a href="' + tlink + '">' + title +
391 '</a></span><br/><span class="desc_text">' + description + '</span></td>' +
392 '<td><img title="' + parseInt(rank) + '% Relevant" width="32" height="32" src="' + img + '"></td>';
395 function create_search ( s ) {
396 var req = create_requestor();
398 req.open('GET',proxy + encodeURIComponent(s),false);
402 var xml = req.responseXML;
403 search_templates[s] = xml.getElementsByTagName('Url')[0].textContent;
404 var i = xml.getElementsByTagName('Image');
406 images[s] = i[0].textContent;
408 alert('BAD XML!\n\n' + e + '\n\n' + req.responseText);
409 search_templates[s] = null;
419 <form onsubmit="opensearch(document.getElementById('term').value, true); return false;">
422 <td align="left">Keyword Search:
423 <input type="text" id="term" value="javascript"/>
424 <input type="submit" value="Go!"/>
426 <td align="right">Hits per Source:
427 <select onchange="current_count=this.options[this.selectedIndex].value;">
428 <option value="5" selected>5</option>
429 <option value="10">10</option>
430 <option value="25">25</option>
435 <td colspan=2>Sources:
436 <label class="source_input"><input name="source" type="checkbox" value="http://gapines.org/opensearch.xml" checked>GPLS Pines</label>
437 <label class="source_input"><input name="source" type="checkbox" value="http://rsinger.library.gatech.edu/opensearch/osdd-gil.xml" checked>GIL Universal Catalog</label>
438 <label class="source_input"><input name="source" type="checkbox" value="http://search.athenscounty.lib.oh.us/cgi-bin/koha/opensearchdescription">NPL/Koha</label>
439 <label class="source_input"><input name="source" type="checkbox" value="http://www.koders.com/search/KodersSourceCodeSearchDescription.xml">Koders Source Code</label>
440 <label class="source_input"><input name="source" type="checkbox" value="http://cnx.rice.edu/content/opensearchdescription">rice.edu Connexions</label>
441 <label class="source_input"><input name="source" type="checkbox" value="http://redlightgreen.com/ucwprod/web/opensearchDescription.xml">RedLightGreen</label>
442 <label class="source_input"><input name="source" type="checkbox" value="http://www.itpapers.com/itpaperssearchdescription.xml">ITPapers</label>
443 <!-- <input name="source" type="checkbox" value="http://www.webdevref.com/blog/opensearchdescription.xml">WebDefRef -->
449 <div>Total results: <span id="total"/></div>
450 <div>Current page: <span id="page_label"></span> --
451 <button class='hide' id='prev_button' onclick="if (this.className != 'hide') {current_startPage -= 1; opensearch(document.getElementById('term').value);}">Previous Page</button>
453 <button class='hide' id='next_button' onclick="if (this.className != 'hide') {current_startPage += 1; opensearch(document.getElementById('term').value);}">Next Page</button>
459 <td id="int_res_hide" class="noshow">
461 <caption>Merged search results</caption>
464 <table id='int_res' class="res_table"></table>
469 <td id='col_res_hide' class="noshow">
471 <caption>Unranked search results</caption>
474 <table id='col_res' class="res_table"></table>
481 <div id="result_sources"></div>