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