From b7f285db6660490e0f403edcfc9274e32ff5037c Mon Sep 17 00:00:00 2001 From: Srdjan Date: Mon, 14 Dec 2015 20:07:08 +1300 Subject: [PATCH] bug_6624: Added Open Library Search and Read API to openlibrary.js Signed-off-by: Nicole Engard Signed-off-by: Jonathan Druart --- koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js | 180 +++++++++++++++++++++++- 1 file changed, 175 insertions(+), 5 deletions(-) diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js index 995cb6b..318576a 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js +++ b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js @@ -5,8 +5,7 @@ if (typeof KOHA == "undefined" || !KOHA) { /** * A namespace for OpenLibrary related functions. */ -KOHA.OpenLibrary = { - +KOHA.OpenLibrary = new function() { /** * Search all: @@ -17,7 +16,7 @@ KOHA.OpenLibrary = { * The result is asynchronously returned by OpenLibrary and catched by * olCallBack(). */ - GetCoverFromIsbn: function() { + this.GetCoverFromIsbn = function() { var bibkeys = []; $("[id^=openlibrary-thumbnail]").each(function(i) { bibkeys.push("ISBN:" + $(this).attr("class")); // id=isbn @@ -30,13 +29,13 @@ KOHA.OpenLibrary = { "&callback=KOHA.OpenLibrary.olCallBack&jscmd=data"); scriptElement.setAttribute("type", "text/javascript"); document.documentElement.firstChild.appendChild(scriptElement); - }, + } /** * Add cover pages
elements with class +"ol_readapi_book", extracts book identifiers from them (e.g. isbn, +lccn, etc.) and puts those into an asynchronous call to the Read API. +When the call returns, the results are used to add clickable links +to the "ol_readapi_book" elements found earlier. +A demonstration use of this script is available here: +http://internetarchive.github.com/read_api_extras/readapi_demo.html +*/ + +var ol_readapi_automator = +(function () { // open anonymous scope for tidiness + +// 'constants' +var readapi_bibids = ['isbn', 'lccn', 'oclc', 'olid', 'iaid', 'bibkeys']; +var magic_classname = 'ol_readapi_book'; + +// added to book divs to correlate with API results +var magic_bookid = 'ol_bookid'; +var ol_button_classname = 'ol_readapi_button'; + +// Find all book divs and concatenate ids from them to create a read +// API query url +function create_query() { + var q = 'http://openlibrary.org/api/volumes/brief/json/'; + + function add_el(i, el) { + // tag with number found so it's easy to discover later + // (necessary? just go by index?) + // (choose better name?) + $(el).attr(magic_bookid, i); + + if (i > 0) { + q += '|'; + } + q += 'id:' + i; + + for (bi in readapi_bibids) { + bibid = readapi_bibids[bi]; + if ($(el).attr(bibid)) { + q += ';' + bibid + ':' + $(el).attr(bibid); + } + } + } + + $('.' + magic_classname).each(add_el); + return q; +} + +function make_read_button(bookdata) { + buttons = { + 'full access': + "http://openlibrary.org/images/button-read-open-library.png", + 'lendable': + "http://openlibrary.org/images/button-borrow-open-library.png", + 'checked out': + "http://openlibrary.org/images/button-checked-out-open-library.png" + }; + if (bookdata.items.length == 0) { + return false; + } + first = bookdata.items[0]; + if (!(first.status in buttons)) { + return false; + } + result = '' + + ''; + return result; +} + +// Default function for decorating document elements with read API data +function default_decorate_el_fn(el, bookdata) { + // Note that 'bookdata' may be undefined, if the Read API call + // didn't return results for this book + if (!bookdata) { + decoration = 'Not found'; + } else { + decoration = make_read_button(bookdata); + } + if (decoration) { + el.innerHTML += decoration; + } +} + +function do_query(q, decorate_el_fn) { + if (!decorate_el_fn) { + decorate_el_fn = default_decorate_el_fn; + } + var starttime = (new Date()).getTime(); + + // Call a function on each
element + // with the target element and the data found for that element. + // Use decorate_el_fn if supplied, falling back to + // default_decorate_el_fn, above. + function query_callback(data, textStatus, jqXHR) { + var endtime = (new Date()).getTime(); + var duration = (endtime - starttime) / 1000; + // console.log('took ' + duration + ' seconds'); + + $('.' + magic_classname).each(function(i, el) { + var bookid = $(el).attr(magic_bookid); + if (bookid && bookid in data) { + decorate_el_fn(el, data[bookid]); + } else { + decorate_el_fn(el); + } + }); + } + + // console.log('calling ' + q); + $.ajax({ url: q, + data: { 'show_all_items': 'true' }, + dataType: 'jsonp', + success: query_callback + }); +} + +// Do stuff +var q = create_query(); +do_query(q); + +result = { + do_query: do_query, + create_query: create_query, + make_read_button: make_read_button }; + +return result; +})(); // close anonymous scope + +/* +Possible futures: +* Support alternate query targets, e.g. Hathi +* show_all_items +* show_inlibrary +* ezproxy prefix (implies show_inlibrary?) +* console debug output? (check all console.log) +*/ -- 2.7.0