]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/ac_google_books.js
LP#1638299: adjust staff-side authority browse
[working/Evergreen.git] / Open-ILS / web / js / ui / default / opac / ac_google_books.js
1 ;(function () {
2   var GBisbns = [];
3   var GBPBadgelink;
4   var GBPreviewLink = '';
5   var GBPreviewShowing = false;
6   var lang = 'en';
7   if (document.documentElement.lang) {
8     lang = document.documentElement.lang.substr(0,2) || 'en';
9   }
10   var head = document.getElementsByTagName('head')[0];
11
12 /**
13  * This function is the call-back function for the JSON scripts which
14  * executes a Google book search response.
15  *
16  * @param {JSON} GBPBookInfo is the JSON object pulled from the Google books service.
17  */
18   function GBPreviewCallback (GBPBookInfo) {
19     if (GBPBookInfo.totalItems < 1) {
20       return;
21     }
22
23     var accessInfo = GBPBookInfo.items[0].accessInfo;
24     if (!accessInfo) {
25       return;
26     }
27
28     if (accessInfo.embeddable) {
29       GBPreviewLink = GBPBookInfo.items[0].volumeInfo.previewLink;
30       if (!GBPreviewLink) {
31         return;
32       }
33       if (document.location.protocol === 'https:') {
34         GBPreviewLink = GBPreviewLink.replace(/^http:/, 'https:');
35       }
36       var gbsrc = '//www.google.com/books/jsapi.js';
37       if (!head.querySelector('script[src="' + gbsrc + '"]')) {
38         var GBjsapi = document.createElement('script');
39         GBjsapi.src = gbsrc;
40         head.appendChild(GBjsapi);
41       }
42     /* Add a button below the book cover image to load the preview. */
43       var GBPBadge = document.createElement('img');
44       GBPBadge.id = 'gbpbadge';
45       GBPBadge.src = 'https://www.google.com/intl/' + lang + '/googlebooks/images/gbs_preview_button1.gif';
46       GBPBadge.title = document.getElementById('rdetail_title').innerHTML;
47       GBPBadge.style.border = 0;
48       GBPBadge.style.margin = '0.5em 0 0 0';
49       GBPBadgelink = document.createElement('a');
50       GBPBadgelink.id = 'gbpbadge_link';
51       GBPBadgelink.addEventListener('click', GBDisplayPreview);
52       GBExtrasActivate(true);
53       GBPBadgelink.appendChild(GBPBadge);
54       document.getElementById('rdetail_title_div').appendChild(GBPBadgelink);
55       document.getElementById('gbp_extra').style.display = 'block';
56     }
57   }
58
59   function GBPViewerLoadCallback () {
60     var GBPViewer = new google.books.DefaultViewer(document.getElementById('rdetail_preview_div'));
61     GBPViewer.load(GBPreviewLink);
62     GBPViewer.resize();
63     GBPBadgelink = document.getElementById('gbpbadge_link');
64     GBPBadgelink.removeEventListener('click', GBDisplayPreview);
65     GBPBadgelink.addEventListener('click', GBShowHidePreview);
66   }
67
68   function GBExtrasActivate (init) {
69     var extras = document.getElementById('gbp_extra_links').getElementsByTagName('a');
70     for (var i = 0; i < extras.length; i++) {
71       if (init) {
72         extras[i].addEventListener('click', GBDisplayPreview);
73       } else {
74         extras[i].removeEventListener('click', GBDisplayPreview);
75         extras[i].addEventListener('click', GBShowHidePreview);
76       }
77     }
78   }
79
80 /**
81  *  This is called when the user clicks on the 'Preview' link.  We assume
82  *  a preview is available from Google if this link was made visible.
83  */
84   function GBDisplayPreview () {
85     var GBPreviewPane = document.getElementById('rdetail_preview_div');
86     if (GBPreviewPane === null || typeof GBPreviewPane.loaded === 'undefined' || GBPreviewPane.loaded === 'false') {
87       GBPreviewPane = document.createElement('div');
88       GBPreviewPane.id = 'rdetail_preview_div';
89       GBPreviewPane.style.height = document.documentElement.clientHeight + 'px';
90       GBPreviewPane.style.width = document.documentElement.clientWidth + 'px';
91       GBPreviewPane.style.display = 'block';
92       var GBClear = document.createElement('div');
93       GBClear.style.padding = '1em';
94       document.getElementById('gbp_extra_container').appendChild(GBPreviewPane);
95       document.getElementById('gbp_extra_container').appendChild(GBClear);
96       google.books.load({'language': lang});
97       window.setTimeout(GBPViewerLoadCallback, 750);
98       GBPreviewPane.loaded = 'true';
99     }
100     GBShowHidePreview();
101     document.location.hash = '#gbp_extra';
102   }
103
104   function GBShowHidePreview () {
105     if (!GBPreviewShowing) {
106       document.getElementById('gbp_extra_container').style.display = 'inherit';
107       document.getElementById('gbp_arrow_link').style.display = 'none';
108       document.getElementById('gbp_arrow_down_link').style.display = 'inline';
109       GBPreviewShowing = true;
110       document.location.hash = '#gbp_extra';
111     } else { // button can open, but shouldn't close
112       document.getElementById('gbp_extra_container').style.display = 'none';
113       document.getElementById('gbp_arrow_link').style.display = 'inline';
114       document.getElementById('gbp_arrow_down_link').style.display = 'none';
115       GBPreviewShowing = false;
116       document.location.hash = 'rdetail_title';
117     }
118   }
119
120   function GBLoader () {
121     var spans = document.body.querySelectorAll('li.rdetail_isbns span.rdetail_value');
122     for (var i = 0; i < spans.length; i++) {
123       var prop = spans[i].getAttribute('property');
124       if (!prop) {
125         continue;
126       }
127       var isbn = spans[i].textContent || spans[i].innerText
128       if (!isbn) {
129         continue;
130       }
131       isbn = isbn.toString().replace(/^\s+/, '');
132       var idx = isbn.indexOf(' ');
133       if (idx > -1) {
134         isbn = isbn.substring(0, idx);
135       }
136       isbn = isbn.toString().replace(/-/g, '');
137       if (!isbn) {
138         continue;
139       }
140       GBisbns.push(isbn);
141     }
142
143     if (GBisbns.length) {
144       var req = new window.XMLHttpRequest();
145       var qisbn = encodeURIComponent('isbn:' + GBisbns[0]);
146       req.open('GET', 'https://www.googleapis.com/books/v1/volumes?q=' + qisbn + '&prettyPrint=false');
147       if (req.responseType && (req.responseType = 'json')) {
148         req.onload = function (evt) {
149           var result = req.response;
150           if (result) {
151             GBPreviewCallback(result);
152           }
153         }
154       } else {
155       // IE 10/11
156         req.onload = function (evt) {
157           var result = JSON.parse(req.responseText);
158           if (result) {
159             GBPreviewCallback(result);
160           }
161         }
162       }
163       req.send();
164     }
165   };
166
167   // Skips IE9
168   if (window.addEventListener && !window.XDomainRequest) {
169     window.addEventListener('load', GBLoader, false);
170   }
171 })()