]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/ac_google_books.js
LP#1685840: Dojoless Google Books Preview as external script
[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       GBPBadgelink.appendChild(GBPBadge);
53       document.getElementById('rdetail_title_div').appendChild(GBPBadgelink);
54       document.getElementById('gbp_extra').style.display = 'block';
55     }
56   }
57
58   function GBPViewerLoadCallback () {
59     var GBPViewer = new google.books.DefaultViewer(document.getElementById('rdetail_preview_div'));
60     GBPViewer.load(GBPreviewLink);
61     GBPViewer.resize();
62     GBPBadgelink = document.getElementById('gbpbadge_link');
63     GBPBadgelink.removeEventListener('click', GBDisplayPreview);
64     GBPBadgelink.addEventListener('click', GBShowHidePreview);
65   }
66
67 /**
68  *  This is called when the user clicks on the 'Preview' link.  We assume
69  *  a preview is available from Google if this link was made visible.
70  */
71   function GBDisplayPreview () {
72     var GBPreviewPane = document.getElementById('rdetail_preview_div');
73     if (GBPreviewPane === null || typeof GBPreviewPane.loaded === 'undefined' || GBPreviewPane.loaded === 'false') {
74       GBPreviewPane = document.createElement('div');
75       GBPreviewPane.id = 'rdetail_preview_div';
76       GBPreviewPane.style.height = document.documentElement.clientHeight + 'px';
77       GBPreviewPane.style.width = document.documentElement.clientWidth + 'px';
78       GBPreviewPane.style.display = 'block';
79       var GBClear = document.createElement('div');
80       GBClear.style.padding = '1em';
81       document.getElementById('gbp_extra_container').appendChild(GBPreviewPane);
82       document.getElementById('gbp_extra_container').appendChild(GBClear);
83       google.books.load({'language': lang});
84       window.setTimeout(GBPViewerLoadCallback, 750);
85       var extras = document.getElementById('gbp_extra_links').getElementsByTagName('a');
86       for (var i = 0; i < extras.length; i++) {
87         extras[i].addEventListener('click', GBShowHidePreview);
88       }
89       GBPreviewPane.loaded = 'true';
90     }
91     GBShowHidePreview();
92     document.location.hash = '#gbp_extra';
93   }
94
95   function GBShowHidePreview () {
96     if (!GBPreviewShowing) {
97       document.getElementById('gbp_extra_container').style.display = 'inherit';
98       document.getElementById('gbp_arrow_link').style.display = 'none';
99       document.getElementById('gbp_arrow_down_link').style.display = 'inline';
100       GBPreviewShowing = true;
101       document.location.hash = '#gbp_extra';
102     } else { // button can open, but shouldn't close
103       document.getElementById('gbp_extra_container').style.display = 'none';
104       document.getElementById('gbp_arrow_link').style.display = 'inline';
105       document.getElementById('gbp_arrow_down_link').style.display = 'none';
106       GBPreviewShowing = false;
107       document.location.hash = 'rdetail_title';
108     }
109   }
110
111   function GBLoader () {
112     var spans = document.body.querySelectorAll('li.rdetail_isbns span.rdetail_value');
113     for (var i = 0; i < spans.length; i++) {
114       var prop = spans[i].getAttribute('property');
115       if (!prop) {
116         continue;
117       }
118       var isbn = spans[i].textContent || spans[i].innerText
119       if (!isbn) {
120         continue;
121       }
122       isbn = isbn.toString().replace(/^\s+/, '');
123       var idx = isbn.indexOf(' ');
124       if (idx > -1) {
125         isbn = isbn.substring(0, idx);
126       }
127       isbn = isbn.toString().replace(/-/g, '');
128       if (!isbn) {
129         continue;
130       }
131       GBisbns.push(isbn);
132     }
133
134     if (GBisbns.length) {
135       var req = new window.XMLHttpRequest();
136       var qisbn = encodeURIComponent('isbn:' + GBisbns[0]);
137       req.open('GET', 'https://www.googleapis.com/books/v1/volumes?q=' + qisbn + '&prettyPrint=false');
138       if (req.responseType && (req.responseType = 'json')) {
139         req.onload = function (evt) {
140           var result = req.response;
141           if (result) {
142             GBPreviewCallback(result);
143           }
144         }
145       } else {
146       // IE 10/11
147         req.onload = function (evt) {
148           var result = JSON.parse(req.responseText);
149           if (result) {
150             GBPreviewCallback(result);
151           }
152         }
153       }
154       req.send();
155     }
156   };
157
158   // Skips IE9
159   if (window.addEventListener && !window.XDomainRequest) {
160     window.addEventListener('load', GBLoader, false);
161   }
162 })()