// ==UserScript==
// @name        LibraryLookup for Keene
// @namespace   http://weblog.infoworld.com/udell/2006/01/30.html
// @description Checks availability in Keene libraries
// @include     http://*.amazon.*
// ==/UserScript==
 
(
function()
{

var libraryBaseURL = 'http://ksclib.keene.edu';
var libraryName = 'Keene';
var libraryQuery = libraryBaseURL + '/search/i=';
var libraryAvailability = /AVAILABLE/;
var libraryDueBack = /DUE (\d{2}-\d{2}-\d{2})/;
//var xisbnQuery = 'http://labs.oclc.org/xisbn/'
var xisbnQuery = 'http://old-xisbn.oclc.org/webservices/xisbn/'
var isbnREplain = /(\d{7,9}[\d|X])/ig;
var isbnREdelimited = /\/(\d{7,9}[\d|X])\//;
var done = false;
 
var libraryLookup = 
  {

  findOrigTitle: function()
    {
    var boldItems = document.getElementsByTagName('b');
    for ( var i = 0; i < boldItems.length; i++ )
      {
      try 
        {
        if ( boldItems[i].className == 'sans' && boldItems[i].parentNode.className == 'buying')
          return boldItems[i];
        }
      catch (e) {}
        {
       }
      }
    return null;
    },

  insertLink: function(isbn, hrefTitle, aLabel)
    {
    var div = origTitle.parentNode;
    var title = origTitle.firstChild.nodeValue;
    var newTitle = document.createElement('b');
    newTitle.setAttribute('class','sans');
    var titleText = document.createTextNode(title);
    newTitle.appendChild(titleText);
    var sp = document.createTextNode(' ');
    var link = document.createElement('a');
    link.setAttribute ( 'title', hrefTitle );
    link.setAttribute('href', libraryQuery + isbn);
    var label = document.createTextNode( aLabel );
    link.appendChild(label);
    div.insertBefore(newTitle, origTitle);
    div.insertBefore(sp, origTitle);
    div.insertBefore(link, origTitle);
    div.removeChild(origTitle);
    },
             
  xisbn: function(isbn)
    {
    GM_xmlhttpRequest
      (
       {
        method:  'GET',
        url:     xisbnQuery + isbn,
        onload:  function(results)
          {
          var page = results.responseText;
          var isbns = page.match(isbnREplain);
          for ( i = 0; i < isbns.length; i++ )
            {
            libraryLookup.doLookup(isbns[i]);
            }
          }
        }  
      )
    },

  doLookup: function(isbn)
    {
    GM_xmlhttpRequest
      (
        {
        method:  'GET',
        url:     libraryQuery + isbn,
        onload:  function(results)
          {
          if ( done == true )
            { return }
          page = results.responseText;
          if ( libraryAvailability.test(page) )
            {
            done = true;
            libraryLookup.insertLink
              (
              isbn,
              "On the shelf now!",
              "Hey! It's available in the " + libraryName + " Library!"
              );
            return;
            }
          if ( libraryDueBack.test(page) )
            {
            done = true;
            var due = page.match(libraryDueBack)[1]
            libraryLookup.insertLink
              (
              isbn,
              "Due back " + due,
              "Due back at the " + libraryName + " Library on " + due
              );
            }
          }
        }
      )
    }
  }

try 
  {
  var isbn = location.href.match(isbnREdelimited)[1];
  }
catch (e)
  { 
  return; 
  }

var origTitle = libraryLookup.findOrigTitle();

if ( ! origTitle )
  { return; }

libraryLookup.doLookup(isbn);
 
if ( done == false )
  {
  libraryLookup.xisbn(isbn);
  }
 
}
)();
