3 <title>mikers experimental opensearch portal</title>
7 font-family: verdana,arial,helvetica,sans-serif;
14 text-decoration: none;
22 border: solid black 1px;
26 border: solid lightblue 1px;
27 background-color: lightblue;
32 text-decoration: none;
37 text-decoration: underline;
42 text-decoration: underline;
47 text-decoration: none;
64 border-collapse: collapse;
65 border: solid gray 1px;
69 border-collapse: collapse;
73 max-width: 300px !important;
74 min-width: 200px !important;
78 max-width: 100% !important;
82 max-width: 100% !important;
83 min-width: 400px !important;
87 border-bottom: 1px dashed darkgrey;
100 function create_requestor () {
103 req = new ActiveXObject("Msxml2.XMLHTTP");
107 req = new ActiveXObject("Microsoft.XMLHTTP");
114 if (!req && typeof XMLHttpRequest!='undefined') {
115 req = new XMLHttpRequest();
119 alert("NEEDS NEWER JAVASCRIPT for XMLHTTPRequest()");
126 var proxy = 'http://gapines.org/opensearch/?fetch=';
131 var search_templates = [];
132 var search_urls = {};
135 var current_startPage = 1;
136 var current_startIndex = 1;
137 var current_count = 5;
139 function opensearch ( term, reset, single_source ) {
143 current_startPage = 1;
149 create_search(single_source);
150 var turi = search_templates[single_source].replace(/\{searchTerms\}/,encodeURIComponent(term));
151 turi = turi.replace(/\{startPage\}/,current_startPage);
152 turi = turi.replace(/\{startIndex\}/,current_startIndex);
153 turi = turi.replace(/\{count\}/,current_count);
154 turi = turi.replace(/\{relevanceScale}/,'0');
155 search_urls[single_source] = proxy + encodeURIComponent(turi);
158 var cur_src = document.getElementById('result_sources');
159 for (var i = 1; i < cur_src.childNodes.length; i++) {
160 if (cur_src.childNodes[i].nodeValue == turi)
163 cur_src.innerHTML += '<a name="' + single_source + '" href="' + turi + '">' + turi + '</a><br>';
164 perform_search(single_source);
168 document.getElementById('next_button').className = 'hide';
170 if (current_startPage == 1)
171 document.getElementById('prev_button').className = 'hide';
173 document.getElementById('prev_button').className = '';
175 var tot = document.getElementById('total');
176 while (tot.lastChild)
177 tot.removeChild(tot.lastChild);
179 var src = document.getElementById('result_sources');
180 while (src.lastChild)
181 src.removeChild(src.lastChild);
183 document.getElementById('int_res_hide').className = 'noshow';
184 document.getElementById('col_res_hide').className = 'noshow';
186 var tab = document.getElementById('int_res');
187 while (tab.lastChild)
188 tab.removeChild(tab.lastChild);
190 tab = document.getElementById('col_res');
191 while (tab.lastChild)
192 tab.removeChild(tab.lastChild);
196 var sources = new Array();
197 var selector = document.getElementsByName('source');
198 for (var i = 0; i < selector.length; i++) {
199 if (selector[i].checked) {
200 sources.push(selector[i].value);
204 search_templates = [];
205 for (var i in sources) {
206 create_search( sources[i] );
209 current_startIndex = (current_count * (current_startPage - 1)) + 1;
212 for (var i in search_templates) {
213 if (!search_templates[i])
219 var url = search_templates[i].replace(/\{searchTerms\}/,encodeURIComponent(term));
220 url = url.replace(/\{startPage\}/,current_startPage);
221 url = url.replace(/\{startIndex\}/,current_startIndex);
222 url = url.replace(/\{count\}/,current_count);
223 url = url.replace(/\{relevanceScale}/,rel_scales[i]);
224 search_urls[i] = proxy + encodeURIComponent(url);
226 src.innerHTML += '<a name="' + i + '" href="' + url + '">' + url + '</a><br>';
229 for (var i in search_urls) {
230 if (!search_templates[i])
236 document.getElementById('page_label').innerHTML = current_startPage;
239 function perform_search ( source ) {
240 var req = create_requestor();
242 var func = function () {
243 if (req.readyState != 4)
246 var xml = req.responseXML;
248 var desc = getElementTextNS('','description',xml,0);
249 var xml_link = getElementTextNS('','link',xml,0);
251 var total = getElementFloatNS('openSearch','totalResults',xml,0);
252 var integratible = (getElementNS('openIll','relevance',xml,0) != null);
253 var scale = getElementFloatNS('openIll','relevanceScale',xml,0);
255 rel_scales[source] = scale;
257 var tot = document.getElementById('total');
259 if (tot.childNodes.length)
260 current_tot = parseFloat(tot.childNodes[0].nodeValue);
262 var res_type = document.getElementById('res_type');
264 if (res_type.options[res_type.selectedIndex].value == 'col')
270 if (total > (current_startPage * current_count))
271 document.getElementById('next_button').className = '';
274 tot.innerHTML = current_tot;
276 var list = xml.getElementsByTagName('item');
277 for (var i = 0; i < list.length; i++) {
279 if ( typeof list[i] != 'object')
285 tab = document.getElementById('col_res');
286 document.getElementById('col_res_hide').className = '';
288 var col = document.getElementById(encodeURI(source));
290 if (col.nodeName != 'TABLE')
295 var row = tab.rows[0];
297 row = tab.insertRow(0);
299 col = document.createElement('td');
300 row.appendChild(col);
302 tab = document.createElement('table');
303 tab.id = encodeURI(source);
304 tab.name = encodeURI(source);
305 tab.setAttribute('id',encodeURI(source));
306 tab.setAttribute('name',encodeURI(source));
308 tab.setAttribute('valign','top');
309 tab.className ='col_tab';
312 var cap = document.createElement('caption');
313 tab.appendChild(cap);
314 cap.innerHTML = desc + ' -- <a href="' + xml_link + '">XML</a>';
317 col.appendChild(tab);
319 var per = parseInt(100 / (search_urls.length * 2)) - 1;
320 col.setAttribute('valign','top');
321 col.setAttribute('width', + per + '%');
327 tab = document.getElementById('int_res');
328 document.getElementById('int_res_hide').className = '';
331 if (tab.nodeName != 'TABLE')
334 if (!tab.rows || !tab.rows.length) {
335 add_result_row(tab, 0, list[i], source);
337 for (var j = 0; j < tab.rows.length; j++) {
338 if ( typeof tab.rows[j] != 'object')
343 rank = getElementFloatNS('openIll','relevance',list[i],0);
345 alert("error getting float relevance: " + e);
350 if (tab.rows[j] && tab.rows[j].firstChild && tab.rows[j].firstChild.firstChild) {
351 if (tab.rows[j].firstChild.firstChild.childNodes.length)
352 curr_rank = parseFloat(tab.rows[j].firstChild.firstChild.childNodes[0].nodeValue);
357 if ( rank < curr_rank ) {
358 if ( (j + 1) == tab.rows.length) {
359 add_result_row(tab, tab.rows.length, list[i], source);
364 add_result_row(tab, j, list[i], source);
371 req.onreadystatechange = func;
372 req.open('GET', proxy + encodeURIComponent(search_urls[source]), true);
377 // retrieve float of an XML document element, including
378 // elements using namespaces
379 function getElementFloatNS(prefix, local, parentElem, index) {
380 var result = getElementNS(prefix, local, parentElem, index);
382 // get text, accounting for possible
383 // whitespace (carriage return) text nodes
384 if (result.childNodes.length > 1) {
385 return parseFloat(result.childNodes[1].nodeValue);
387 return parseFloat(result.childNodes[0].nodeValue);
394 function getElementNS(prefix, local, parentElem, index) {
396 if (prefix && isIE) {
397 // IE/Windows way of handling namespaces
398 return parentElem.getElementsByTagName(prefix + ":" + local)[index];
400 // the namespace versions of this method
401 // (getElementsByTagNameNS()) operate
402 // differently in Safari and Mozilla, but both
403 // return value with just local name, provided
404 // there aren't conflicts with non-namespace element
406 return parentElem.getElementsByTagName(local)[index];
410 // retrieve text of an XML document element, including
411 // elements using namespaces
412 function getElementTextNS(prefix, local, parentElem, index) {
413 var result = getElementNS(prefix, local, parentElem, index);
415 // get text, accounting for possible
416 // whitespace (carriage return) text nodes
417 if (result.childNodes.length > 1) {
418 return result.childNodes[1].nodeValue;
420 return result.firstChild.nodeValue;
427 function add_result_row (tab, index, xml, source) {
428 var img = images[source];
429 var rank,title,tlink,desc;
432 rank = getElementFloatNS('openIll','relevance',xml,0);
434 alert("error getting relevance: " + e);
439 title = getElementTextNS('','title',xml,0);
445 tlink = getElementTextNS('','link',xml,0);
451 description = getElementTextNS('','description',xml,0);
456 var row = tab.insertRow(index);
458 row.name = encodeURI(source);
459 row.setAttribute('name',encodeURI(source));
460 row.className = 'res_tr';
462 var c1 = row.insertCell(0);
463 c1.style.padding = "4px";
465 var d1 = document.createElement('div');
466 d1.style.display = "none";
467 d1.style.visibility = "hidden";
468 d1.appendChild(document.createTextNode(rank));
472 var s1 = document.createElement('span');
473 s1.className='title_link';
475 var a1 = document.createElement('a');
477 a1.appendChild(document.createTextNode(title));
481 c1.appendChild(document.createElement('br'));
483 var s2 = document.createElement('span');
484 s2.className='desc_text';
485 s2.innerHTML = description;
489 var c2 = row.insertCell(1);
491 var i1 = document.createElement('img');
492 i1.title= parseInt(rank) + '% Relevant';
494 i1.setAttribute('width','32');
495 i1.setAttribute('height','32');
502 function create_search ( s ) {
503 var req = create_requestor();
506 req.open('GET',proxy + encodeURIComponent(s),false);
510 var xml = req.responseXML;
511 var u = xml.getElementsByTagName('Url');
513 search_templates[s] = u[0].childNodes[0].nodeValue;
515 var i = xml.getElementsByTagName('Image');
517 images[s] = i[0].childNodes[0].nodeValue;
519 return search_templates[s];
521 alert('BAD XML!\n\n' + e + '\n\n' + req.responseText);
522 search_templates[s] = null;
528 function remove_by_name( src ) {
529 var list = document.getElementsByName(encodeURI(src));
531 var len = list.length;
534 list[0].parentNode.removeChild(list[0]);
537 function do_submit(evt) {
538 evt = (evt) ? evt : ((window.event) ? event : null);
539 var obj = (evt && evt.srcElement)? evt.srcElement : evt.target;
540 var code = grabCharCode(evt);
541 if(code==13||code==3) {
543 opensearch(obj.form['term'].value, true);
549 function attach_listeners () {
550 for (var i in listening_elements) {
551 if (document.firstChild.addEventListener)
552 document.getElementById(listening_elements[i]).addEventListener('keydown',do_submit,true);
554 document.getElementById(listening_elements[i]).attachEvent('onkeydown',do_submit,true);
558 function grabCharCode(evt) {
559 evt = (evt) ? evt : ((window.event) ? event : null); /* for mozilla and IE */
561 return (evt.charCode ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode ));
567 var listening_elements = ['term','gobutton','res_count_per','res_type'];
571 <body onload="attach_listeners();">
574 <table style="border-collapse: collapse; margin: 5px;" width="100%">
575 <tr style="border-bottom: dotted black 1px;" valign="top">
576 <td align="right">Keyword Search: </td>
578 <input type="text" name="term" id="term" value="javascript"/>
579 <input type="button" id="gobutton" value="Go!" onclick="insearch=true; opensearch(document.getElementById('term').value, true); return false;"/>
581 <td align="left">Hits per Source for each page:
582 <select onchange="current_count=this.options[this.selectedIndex].value;" id="res_count_per">
583 <option value="5" selected>5</option>
584 <option value="10">10</option>
585 <option value="25">25</option>
588 <td align="left">Display style:
589 <select id="res_type">
590 <option value="int" selected>Merged Results</option>
591 <option value="col">Separate Columns</option>
595 <tr style="border-bottom: dotted black 1px;" valign="top">
596 <td align="right">Sources: </td>
598 <table width="100%" style="border-collapse: collapse;">
601 <label class="source_input">
606 opensearch(document.getElementById('term').value, false, this.value);
608 remove_by_name(this.value);
613 value="http://gapines.org/opensearch.xml"
618 <label class="source_input">
623 opensearch(document.getElementById('term').value, false, this.value);
625 remove_by_name(this.value);
630 value="http://search.athenscounty.lib.oh.us/cgi-bin/koha/opensearchdescription">NPL/Koha
634 <label class="source_input">
639 opensearch(document.getElementById('term').value, false, this.value);
641 remove_by_name(this.value);
646 value="http://www.koders.com/search/KodersSourceCodeSearchDescription.xml">Koders Source Code
653 <label class="source_input">
658 opensearch(document.getElementById('term').value, false, this.value);
660 remove_by_name(this.value);
665 value="http://search.library.gatech.edu/opensearch/osdd-gil.xml"
666 checked>GIL Universal Catalog
670 <label class="source_input">
675 opensearch(document.getElementById('term').value, false, this.value);
677 remove_by_name(this.value);
682 value="http://redlightgreen.com/ucwprod/web/opensearchDescription.xml">RedLightGreen
686 <label class="source_input">
691 opensearch(document.getElementById('term').value, false, this.value);
693 remove_by_name(this.value);
698 value="http://www.itpapers.com/itpaperssearchdescription.xml">ITPapers
701 <!-- <input name="source" type="checkbox" value="http://www.webdevref.com/blog/opensearchdescription.xml">WebDefRef -->
705 <label class="source_input">
710 opensearch(document.getElementById('term').value, false, this.value);
712 remove_by_name(this.value);
718 value="http://search.library.gatech.edu/opensearch/osdd.xml">Georgia Tech Catalog
722 <label class="source_input">
727 opensearch(document.getElementById('term').value, false, this.value);
729 remove_by_name(this.value);
734 value="http://cnx.rice.edu/content/opensearchdescription">rice.edu Connexions
738 <label class="source_input">
743 opensearch(document.getElementById('term').value, false, this.value);
745 remove_by_name(this.value);
750 value="http://lib-cufts.lib.sfu.ca/CUFTS/opensearchjournal.xml">SFU CUFTS
758 <td>Total results: </td>
759 <td colspan=2 id="total"></td>
762 <td>Current page: </td>
763 <td id="page_label"></td>
769 if (this.className != 'hide') {
770 current_startPage -= 1;
771 opensearch(document.getElementById('term').value);
773 return false;">Previous Page
779 if (this.className != 'hide') {
780 current_startPage += 1;
781 opensearch(document.getElementById('term').value);
783 return false;">Next Page
792 <table id="results" width="100%">
794 <td id="int_res_hide" class="noshow" width="100%">
796 <caption class="header">Merged search results</caption>
799 <table id='int_res' class="res_table" width="100%"></table>
804 <td id='col_res_hide' class="noshow">
806 <caption class="header">Unranked search results</caption>
809 <table id='col_res' class="res_table"></table>
816 <div id="result_sources"></div>