Amazon Gainesville Libraries Linky
By Christina Schulman
—
Last update May 4, 2008
—
Installed
117 times.
// ==UserScript==
// @name Amazon Gainesville Libraries Linky
// @namespace http://www.epiphyte.net
// @description Search the Alachua County (Gainesville, FL) Library Catalog from Amazon book listings.
// @include http://*.amazon.*
// @creator Christina Schulman | userscripts<at>epiphyte<dot>net | http://www.epiphyte.net
// @source http://userscripts.org/scripts/show/9042
// @identifier http://userscripts.org/scripts/source/9042.user.js
// @version 1.2
// @date 2008-05-04
// ==/UserScript==
// Version History:
// v1.0 - 5/4/2007 - Initial release
// v1.1 - 4/06/2008 - Updated script to deal with new title node style.
// v1.2 - 5/04/2008 - Updated script to deal with even newer title node style.
// Adapted by Christina Schulman (http://www.epiphyte.net) from
// Ed Vielmetti's Ann Arbor library script (http://www.superpatron.com)
// Originally based on LibraryLookup by Jon Udell.
// Amazon Prime fix by Pat Markland (pmarkland@yahoo.com)
// Title node fixes based on the UW Madison linky script by "Rebs"
// and Hennepin County linky script by Glenn Peterson.
//
// Go Gators.
(
function()
{
var librarySearchBase = 'http://cs-lewis.acld.lib.fl.us/uhtbin/cgisirsi/';
var libraryFirstPage = librarySearchBase + '0//0/38/0/POWER_SEARCH';
var searchFormPattern = /<form name="searchform" method="post" action="\/uhtbin\/cgisirsi\/([^"]*)">/;
var searchpart1 = 'srchfield1=GENERAL^SUBJECT^GENERAL^^words or phrase&searchdata1=';
var searchpart2 = '&searchoper1=AND';
var searchpart3 = '&library=ALL&language=ANY&item_type=ANY&location=ANY&item_1cat=ANY&item_2cat=ANY&match_on=KEYWORD&pubyear=&sort_by=NONE';
var libraryName = 'Alachua County libraries';
var libraryAvailability = /Checked In Items/;
var libraryShelving = /Returning to shelving location/;
var libraryOnline = /On-line material/;
var libraryOnReserve = /On hold for someone/;
var libraryOnOrder = /Being acquired by the library/;
var libraryCheckedOut = /Material checked\/charged out/;
var libraryRotating = /Rotating items between libraries/;
var libraryTransferring = /Transferring between libraries/;
var libraryMissing = /Missing/;
var libraryLost = /Lost/;
var libraryDelinquent = /Delinquent/;
var notFound = /found no matches in any library/
var titleNodeClass = 'sans';
var titleNodeId = 'btAsinTitle';
// Find the node containing the book title
function getTitleNode()
{
var nodes = document.evaluate("//span[@id='" + titleNodeId + "']", document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
if(!nodes){
return null;
}
var thisNode = nodes.iterateNext();
var titleNode;
// Get the last node
while(thisNode){
//GM_log( thisNode.textContent );
titleNode = thisNode;
thisNode = nodes.iterateNext();
}
//was (titleValue == null)
if (titleNode == null) {
GM_log("can't find title node");
return null;
}
else {
GM_log("Found title node: " + titleNode.textContent);
}
return titleNode;
}
// check notfound first; then on reserve; then missing; then available
var libraryLookup =
{
insertLink: function(isbnUrl, hrefTitle, aLabel, color )
{
var bookdiv = titleNode.parentNode;
var title = titleNode.firstChild.nodeValue;
var newTitle = document.createElement('b');
newTitle.setAttribute('class',titleNodeClass);
var titleText = document.createTextNode(title);
newTitle.appendChild(titleText);
var br = document.createElement('br');
var link = document.createElement('a');
link.setAttribute ( 'title', hrefTitle );
link.setAttribute('href', isbnUrl);
link.setAttribute('style','font-size:12px;font-weight:normal;color: ' + color);
var label = document.createTextNode( aLabel );
link.appendChild(label);
// cms: If bookdiv is null, re-evaluate the titleNode node
// to pick up its parent node again. Another linky
// script running on the same page may have caused
// the node to change.
if (bookdiv == null) {
titleNode = getTitleNode();
if (titleNode != null) {
bookdiv = titleNode.parentNode;
}
}
if (bookdiv != null) {
bookdiv.insertBefore(link, titleNode.nextSibling);
bookdiv.insertBefore(br, titleNode.nextSibling);
}
},
// Lookup session PID and SEQ numbers so that we can run a valid search
getSearchUrl: function (isbn)
{
GM_xmlhttpRequest
({
method:'GET',
url:libraryFirstPage,
onload:function(results)
{
page = results.responseText;
if (searchFormPattern.test(page)) {
var actionMatch = page.match(searchFormPattern)[1];
var actionUrl = librarySearchBase + actionMatch;
actionUrl = actionUrl + '?' + searchpart1 + isbn + searchpart2 + searchpart3;
libraryLookup.doLookup(actionUrl);
}
else {
var actionUrl = librarySearchBase + '?' + searchpart1 + isbn + searchpart2 + searchpart3;
libraryLookup.insertLink (
actionUrl,
"Error",
"I got confused checking " + libraryName,
"orange"
);
}
}
});
},
doLookup: function ( searchurl )
{
GM_xmlhttpRequest
({
method:'POST',
url: searchurl,
onload:function(results)
{
page = results.responseText;
if ( notFound.test(page) )
{
libraryLookup.insertLink (
searchurl,
"Not carried",
"Not (yet) in " + libraryName,
"red"
);
}
else if ( libraryAvailability.test(page) )
{
libraryLookup.insertLink (
searchurl,
"On the shelf now!",
"Available now at " + libraryName + "!",
"green"
);
}
else if ( libraryOnline.test(page) )
{
libraryLookup.insertLink (
searchurl,
"Available online",
"Available as online material at " + libraryName + "!",
"green"
);
}
else if ( libraryShelving.test(page) )
{
libraryLookup.insertLink (
searchurl,
"Being shelved",
"Being shelved at " + libraryName + "!",
"#AA7700"
);
}
else if ( libraryOnReserve.test(page) )
{
libraryLookup.insertLink (
searchurl,
"On Reserve",
"On Reserve at " + libraryName,
"#AA7700"
);
}
else if ( libraryOnOrder.test(page) )
{
libraryLookup.insertLink (
searchurl,
"On Order",
"On Order at " + libraryName,
"#AA7700"
);
}
else if ( libraryCheckedOut.test(page) || libraryTransferring.test(page) )
{
libraryLookup.insertLink (
searchurl,
"Currently checked out",
"Checked out at " + libraryName,
"#AA7700" // dark yellow
);
}
else if ( libraryRotating.test(page))
{
libraryLookup.insertLink (
searchurl,
"Rotating",
"Rotating between libraries at " + libraryName,
"#AA7700" // dark yellow
);
}
else if ( libraryMissing.test(page) || libraryLost.test(page) || libraryDelinquent.test(page))
{
libraryLookup.insertLink (
searchurl,
"Missing",
"Missing at " + libraryName,
"red"
);
}
else
{
libraryLookup.insertLink (
searchurl,
"Error",
"Error checking " + libraryName,
"orange"
);
}
}
});
}
}
try {
var isbn = window.content.location.href.match(/\/(\d{7,9}[\d|X])\//)[1];
GM_log('isbn == ' + isbn);
}
catch (e) {
GM_log('amazongnvlib_user.js: Caught exception: ' + e.toString());
return;
}
var titleNode = getTitleNode();
if(titleNode == null){
return;
}
libraryLookup.getSearchUrl(isbn);
}
)();