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