iblist search4data

By gollum Last update Jun 23, 2008 — Installed 81 times.
// ==UserScript==
// @name           iblist search4data
// @namespace      http://www.ibdof.com/
// @description    adds input boxes to nav links Author(Name), Book(Title||Author), Series(Name). Enter search term & press RETURN or CLICK nav link to go to "starting with" search results.
// @include        http://www.iblist.com/*
// ==/UserScript==

/**
CHANGELOG
  2008-01-30
    New:
      Now cross-browser - Tested in FF & IE7
      Added input size change when under focus
  2008-02-12
    Some code optimisation's
    Added Opera to browsers tested
  2008-06-23
    Increased font-size. FF3 too small
*/

(function() {

  /* x-browser event register */
  function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; }
	else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; }
	else { elm['on' + evType] = fn; }
  }

  /* x-browser detection of event target */
  function eventTarget(e) {
    var targ;
    if (!e) var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug (from ppk) 
    return targ;
  }

  /* gets next Element node - ignores whitespace text nodes */
  function nextElement(node) {
    if(!node) { return null; }
    do { node = node.nextSibling; } while(node && node.nodeType != 1);
    return node;
  }

  /* gets previous Element node - ignores whitespace text nodes */
  function prevElement(node) {
    if(!node) { return null; }
    do { node = node.previousSibling; } while(node && node.nodeType != 1);
    return node;
 	}
  
  var a = document.getElementById('navigation').getElementsByTagName('a');
  for (var i = 0; i < a.length; i++) {
    if (a[i].href.match("list.php\\?type=(author|book|series)$")) {
      a[i].parentNode.style.lineHeight = '140%';
      var inp = a[i].parentNode.appendChild(document.createElement('input'));
      inp.size = '6';
      if (inp.addEventListener && !window.opera) {
        inp.style.fontSize = '11px';
        inp.style.height = '13px';
      } else {
        inp.style.fontSize = '9px';
        inp.style.height = '11px';
      }
      inp.style.position = 'absolute';
      inp.style.left = '85px';
      inp.style.verticalAlign = 'top';

      addEvent(inp, "focus", 
        function(e)	{
          eventTarget(e).size = '18';
      }, false);
      addEvent(inp, "blur", 
        function(e)	{
          eventTarget(e).size = '6';
      }, false);
      addEvent(inp, "keydown", 
        function(e)	{
          if ( (e && e.keyCode == 13) || (window.event && window.event.keyCode == 13) ) {
            var targ = eventTarget(e);
            var lnk = prevElement(targ);
            document.location = lnk.href + "&by=&genre=-1&key=" + targ.value;
          }
      }, false);
      addEvent(a[i], "click", 
        function(e) {
          var targ = eventTarget(e);
          var inp = nextElement(targ);
          if (inp.value > "")	{
            targ.href += "&by=&genre=-1&key=" + inp.value;
          }
      }, false);
    }
  }
})();