1 if (typeof KOHA == "undefined" || !KOHA) {
6 * A namespace for OpenLibrary related functions.
8 KOHA.OpenLibrary = new function() {
12 * <div title="biblionumber" id="isbn" class="openlibrary-thumbnail"></div>
14 * <div title="biblionumber" id="isbn" class="openlibrary-thumbnail-preview"></div>
15 * and run a search with all collected isbns to Open Library Book Search.
16 * The result is asynchronously returned by OpenLibrary and catched by
19 this.GetCoverFromIsbn = function() {
21 $("[id^=openlibrary-thumbnail]").each(function(i) {
22 bibkeys.push("ISBN:" + $(this).attr("class")); // id=isbn
24 bibkeys = bibkeys.join(',');
25 var scriptElement = document.createElement("script");
26 scriptElement.setAttribute("id", "jsonScript");
27 scriptElement.setAttribute("src",
28 "https://openlibrary.org/api/books?bibkeys=" + escape(bibkeys) +
29 "&callback=KOHA.OpenLibrary.olCallBack&jscmd=data");
30 scriptElement.setAttribute("type", "text/javascript");
31 document.documentElement.firstChild.appendChild(scriptElement);
35 * Add cover pages <div
36 * and link to preview if div id is gbs-thumbnail-preview
38 this.olCallBack = function(booksInfo) {
39 for (id in booksInfo) {
40 var book = booksInfo[id];
41 var isbn = id.substring(5);
42 $("[id^=openlibrary-thumbnail]."+isbn).each(function() {
43 var is_opacdetail = /openlibrary-thumbnail-preview/.exec($(this).attr("id"));
44 var a = document.createElement("a");
45 a.href = booksInfo.url;
47 var img = document.createElement("img");
49 img.src = book.cover.medium;
50 $(this).empty().append(img);
52 img.src = book.cover.medium;
57 var message = document.createElement("span");
58 $(message).attr("class","no-image");
59 $(message).html(NO_OL_JACKET);
60 $(this).append(message);
66 var search_url = 'https://openlibrary.org/search?';
67 this.searchUrl = function( q ) {
69 return search_url + $.param(params);
72 var search_url_json = 'https://openlibrary.org/search.json';
73 this.search = function( q, page_no, callback ) {
76 params.page = page_no;
83 error: function( xhr, error ) {
85 callback( JSON.parse( xhr.responseText ));
87 callback( {error: xhr.responseText || true} );
94 /* readapi_automator.js */
97 This script helps to put readable links to Open Library books into
99 When loaded, it searches the DOM for <div> elements with class
100 "ol_readapi_book", extracts book identifiers from them (e.g. isbn,
101 lccn, etc.) and puts those into an asynchronous call to the Read API.
102 When the call returns, the results are used to add clickable links
103 to the "ol_readapi_book" elements found earlier.
104 A demonstration use of this script is available here:
105 http://internetarchive.github.com/read_api_extras/readapi_demo.html
108 var ol_readapi_automator =
109 (function () { // open anonymous scope for tidiness
112 var readapi_bibids = ['isbn', 'lccn', 'oclc', 'olid', 'iaid', 'bibkeys'];
113 var magic_classname = 'ol_readapi_book';
114 var ol_readapi_books = $("." + magic_classname );
117 // added to book divs to correlate with API results
118 var magic_bookid = 'ol_bookid';
119 var ol_button_classname = 'ol_readapi_button';
121 // Find all book divs and concatenate ids from them to create a read
123 function create_query() {
124 var q = 'https://openlibrary.org/api/volumes/brief/json/';
126 function add_el(i, el) {
127 // tag with number found so it's easy to discover later
128 // (necessary? just go by index?)
129 // (choose better name?)
130 $(el).attr(magic_bookid, i);
137 for (bi in readapi_bibids) {
138 bibid = readapi_bibids[bi];
139 if ($(el).attr(bibid)) {
140 q += ';' + bibid + ':' + $(el).attr(bibid);
145 $('.' + magic_classname).each(add_el);
149 function make_read_button(bookdata) {
152 "https://openlibrary.org/images/button-read-open-library.png",
154 "https://openlibrary.org/images/button-borrow-open-library.png",
156 "https://openlibrary.org/images/button-checked-out-open-library.png"
158 if (bookdata.items.length == 0) {
161 first = bookdata.items[0];
162 if (!(first.status in buttons)) {
165 result = '<a target="_blank" href="' + first.itemURL + '">' +
166 '<img class="' + ol_button_classname +
167 '" src="' + buttons[first.status] + '"/></a>';
168 console.log( result );
172 // Default function for decorating document elements with read API data
173 function default_decorate_el_fn(el, bookdata) {
174 // Note that 'bookdata' may be undefined, if the Read API call
175 // didn't return results for this book
178 decoration = make_read_button(bookdata);
181 el.innerHTML += decoration;
182 el.style.display = 'block'
184 el.style.display = 'none';
188 function do_query(q, decorate_el_fn) {
189 if (!decorate_el_fn) {
190 decorate_el_fn = default_decorate_el_fn;
192 var starttime = (new Date()).getTime();
194 // Call a function on each <div class="ol_readapi_book"> element
195 // with the target element and the data found for that element.
196 // Use decorate_el_fn if supplied, falling back to
197 // default_decorate_el_fn, above.
198 function query_callback(data, textStatus, jqXHR) {
199 var endtime = (new Date()).getTime();
200 var duration = (endtime - starttime) / 1000;
201 // console.log('took ' + duration + ' seconds');
203 $('.' + magic_classname).each(function(i, el) {
204 var bookid = $(el).attr(magic_bookid);
205 if (bookid && bookid in data) {
206 decorate_el_fn(el, data[bookid]);
213 // console.log('calling ' + q);
215 data: { 'show_all_items': 'true' },
217 success: query_callback
221 if( ol_readapi_books.length > 0 ){
223 var q = create_query();
228 create_query: create_query,
229 make_read_button: make_read_button
234 })(); // close anonymous scope
238 * Support alternate query targets, e.g. Hathi
241 * ezproxy prefix (implies show_inlibrary?)
242 * console debug output? (check all console.log)