1 if ( typeof KOHA == "undefined" || !KOHA ) {
5 KOHA.OverDrive = ( function() {
6 var proxy_base_url = '/cgi-bin/koha/svc/overdrive_proxy';
7 var library_base_url = 'http://api.overdrive.com/v1/libraries/';
9 Get: function( url, params, callback ) {
12 url: url.replace( /https?:\/\/api.overdrive.com\/v1/, proxy_base_url ),
15 error: function( xhr, error ) {
17 callback( JSON.parse( xhr.responseText ));
19 callback( {error: xhr.responseText || true} );
25 GetCollectionURL: function( library_id, callback ) {
26 if ( KOHA.OverDrive.collection_url ) {
27 callback( KOHA.OverDrive.collection_url );
32 library_base_url + library_id,
40 KOHA.OverDrive.collection_url = data.links.products.href;
42 callback( data.links.products.href );
46 Search: function( library_id, q, limit, offset, callback ) {
47 KOHA.OverDrive.GetCollectionURL( library_id, function( data ) {
55 {q: q, limit: limit, offset: offset},
63 KOHA.OverDriveCirculation = new function() {
64 var svc_url = '/cgi-bin/koha/svc/overdrive';
66 var error_div = $('<div class="overdrive-error">');
67 function display_error ( error ) {
68 error_div.text(error);
71 var login_link = $('<a href="#">')
74 var passwd = OD_password_required ? prompt("Please enter your password") : "";
77 .text(_("Login to OverDrive account"));
78 var login_div = $('<div class="overdrive-login">').append(login_link);
82 function is_logged_in() {
83 return details ? details.is_logged_in : false;
86 var checkout_popup = null;
87 $( document ).ready(function() {
88 var p = window.opener;
90 try { cb = p.refresh_overdrive_account_details;}
91 catch(err){ return; } //Catch error if opener is not accessible
99 checkout_popup = $("#overdrive-checkout");
102 function display_account (container, data) {
103 if (!data.is_logged_in) {
104 $(container).append(login_div);
108 var overdrive_link = $('<a href="https://www.overdrive.com/account/" target="overdrive-account" class="overdrive-link" style="float:right">')
109 .text("OverDrive Account Page");
110 $(container).append(overdrive_link);
112 var logout_link = $('<a href="#logout" class="overdrive-logout" style="float:left">')
115 $(container).empty().append(error_div);
116 logout(function(data) {
117 display_account(container, data);
119 }).text(_("Logout from OverDrive account"));
120 $(container).append(logout_link);
121 $(container).append('<br style="clear:both;"/>');
123 if (data.checkouts) {
124 var checkouts_div = $('<div class="overdrive-div">').html('<h3>' + _("Checkouts") + '</h3>');
125 var checkouts_list = $('<ul class="overdrive-list">');
126 data.checkouts.items.forEach(function(item) {
127 item_line(checkouts_list, item);
129 checkouts_div.append(checkouts_list);
130 $(container).append(checkouts_div);
134 var holds_div = $('<div class="overdrive-div">').html('<h3>' + _("Holds") + '</h3>');
135 var holds_list = $('<ul class="overdrive-list">');
136 data.holds.items.forEach(function(item) {
137 item_line(holds_list, item);
139 holds_div.append(holds_list);
140 $(container).append(holds_div);
144 function item_line(ul_el, item) {
145 var line = $('<li class="overdrive-item">');
147 var thumb_url = item.images.thumbnail;
149 $('<img class="overdrive-item-thumbnail">')
150 .attr("src", thumb_url)
154 $('<div class="overdrive-item-title">')
157 $('<div class="overdrive-item-subtitle">')
160 $('<div class="overdrive-item-author">')
163 var actions = $('<span class="actions">');
164 display_actions(actions, item.id);
165 $('<div id="action_'+item.id+'" class="actions-menu">')
169 $(ul_el).append(line);
172 function svc_ajax ( method, params, success_callback ) {
178 success: function (data) {
180 display_error(data.error);
182 success_callback(data);
184 error: function(jqXHR, textStatus, errorThrown) {
185 display_error(errorThrown);
190 function load_account_details ( callback ) {
191 svc_ajax('get', { action: "account" }, function(data) {
198 svc_ajax('get', { action: "login", password: p }, function(data) {
200 if( data.login_success ){
201 $(login_div).detach();
202 if( $("#overdrive-results-page").length > 0 ){
205 KOHA.OverDriveCirculation.display_account_details( $("#opac-user-overdrive") );
211 function logout (callback) {
212 svc_ajax('post', { action: "logout" }, function(data) {
218 function item_action (params, el, copies_available) {
220 svc_ajax('post', params, function(data) {
221 if (data.checkouts) {
222 details.checkouts = data.checkouts;
225 details.holds = data.holds;
227 display_actions(el, id, copies_available);
231 function item_is_checked_out (id) {
232 if ( !(details && details.checkouts) ) {
235 var id_uc = id.toUpperCase();
236 var items = details.checkouts.items;
237 for (var i = 0; i < items.length; i++) {
238 if ( items[i].id.toUpperCase() == id_uc ) {
245 function item_is_on_hold (id) {
246 if ( !(details && details.holds) ) {
249 var id_uc = id.toUpperCase();
250 var items = details.holds.items;
251 for (var i = 0; i < items.length; i++) {
252 if ( items[i].id.toUpperCase() == id_uc ) {
259 function display_actions(el, id, copies_available) {
261 if (is_logged_in()) {
263 var item = item_is_checked_out(id);
265 var expires = new Date(item.expires);
266 $('<span class="overdrive-item-status">')
267 .text(_("Checked out until") + " " + expires.toLocaleString())
272 var download = $('<a href="#">').appendTo(el);
273 decorate_button(download, _("Download") + " " + item.format);
274 svc_ajax('get', {action: "download-url", id: id, format: item.format}, function(data) {
275 download.attr("href", data.action);
281 var lockable_formats = [];
282 for (var f in item.formats) {
283 if (f == item.format) continue;
285 if (item.formats[f]) {
286 var access = $('<a target="_blank">').appendTo(el);
287 decorate_button(access, _("Access online") + " " + f);
288 svc_ajax('get', {action: "download-url", id: id, format: f}, function(data) {
289 access.attr("href", data.action);
294 lockable_formats.push(f);
297 if (lockable_formats.length > 0 && checkout_popup) {
298 $(el).append( ajax_button(_("Download as"), function() {
299 checkout_format(el, id, lockable_formats, copies_available);
304 if (item.format) return item;
306 $(el).append( ajax_button(_("Check in"), function() {
307 if( confirm(_("Are you sure you want to return this item?")) ) {
308 item_action({action: "return", id: id}, el, copies_available + 1);
315 item = item_is_on_hold(id);
317 $('<span class="overdrive-status">')
323 if(copies_available && checkout_popup) {
324 $(el).append( ajax_button(_("Check out"), function() {
325 if( confirm(_("Are you sure you want to checkout this item?")) ) {
326 svc_ajax('post', {action: "checkout", id: id}, function(data) {
327 if (data.checkouts) {
328 details.checkouts = data.checkouts;
331 details.holds = data.holds;
333 item = display_actions(el, id, copies_available - 1);
334 if (item && item.formats && !item.format) {
335 var has_available_formats = false;
336 var lockable_formats = [];
337 for (var f in item.formats) {
338 if (item.formats[f]) {
339 has_available_formats = true;
342 lockable_formats.push(f);
345 if (!has_available_formats) {
346 checkout_format(el, id, lockable_formats, copies_available - 1);
354 $(el).append( ajax_button(_("Place hold"), function() {
355 item_action({action: "place-hold", id: id}, el, copies_available);
360 $(el).append( ajax_button(_("Cancel"), function() {
361 if( confirm(_("Are you sure you want to cancel this hold?")) ) {
362 item_action({action: "remove-hold", id: id}, el, copies_available);
370 function ajax_button(label, on_click) {
371 var button = $('<a href="#">')
376 decorate_button(button, label);
380 function decorate_button(button, label) {
382 .addClass("btn btn-primary btn-mini")
383 .css("color","white")
387 function checkout_format(el, id, formats, copies_available) {
388 if (formats.length == 0) {
389 alert(_("Item cannot be checked out - no available formats"));
393 var checkout_format_list = checkout_popup.find("ul.overdrive-format-list").empty();
394 formats.forEach(function (item) {
395 var li = $('<li>').appendTo(checkout_format_list);
396 $('<input name="checkout-format" type="radio">')
401 checkout_popup.modal("show");
402 checkout_popup.find(".overdrive-checkout-submit").click(function(e) {
404 var format = checkout_format_list.find("input[type='radio'][name='checkout-format']:checked").val();
405 item_action({action: "checkout-format", id: id, format: format}, el, copies_available);
407 checkout_popup.modal("hide");
411 this.with_account_details = function( el, callback ) {
412 $(el).append(error_div);
413 load_account_details(function(data) {
414 if (!data.is_logged_in) {
415 $(el).append(login_div);
421 this.display_account_details = function( el ) {
422 window.refresh_overdrive_account_details = function () {
423 KOHA.OverDriveCirculation.display_account_details( el );
425 $(el).empty().append(error_div);
426 load_account_details(function(data) {
427 display_account(el, data);
431 this.display_error = function( el, error ) {
432 $(el).empty().append(error_div);
433 display_error(error);
436 this.is_logged_in = is_logged_in;
438 this.add_actions = function(el, id, copies_available) {
439 var actions = $('<span class="actions">');
440 display_actions(actions, id, copies_available);
441 $('<div id="action_'+id+'" class="actions-menu">')