TPAC: Make Google Books Preview depend on Dojo
authorDan Scott <dscott@laurentian.ca>
Wed, 20 Feb 2013 16:37:08 +0000 (11:37 -0500)
committerBen Shum <bshum@biblio.org>
Thu, 21 Feb 2013 22:46:40 +0000 (17:46 -0500)
It would be possible, but painful, to do all of this in raw JavaScript,
so make the preview functionality depend on Dojo. Also, split out the
relevant JavaScript into its own file. Also, don't search for a preview
if no ISBNs have been gathered; I'm sure Google is never going to return
a result for ISBN:undefined.

You can test this functionality in the sample record set using ISBN
4431287752.

Thanks to Ben Shum for the review comments!

Signed-off-by: Dan Scott <dscott@laurentian.ca>
Signed-off-by: Ben Shum <bshum@biblio.org>
Open-ILS/src/templates/opac/parts/ac_google_books.tt2 [new file with mode: 0644]
Open-ILS/src/templates/opac/parts/acjs.tt2
Open-ILS/src/templates/opac/parts/header.tt2
Open-ILS/src/templates/opac/parts/js.tt2

diff --git a/Open-ILS/src/templates/opac/parts/ac_google_books.tt2 b/Open-ILS/src/templates/opac/parts/ac_google_books.tt2
new file mode 100644 (file)
index 0000000..8243fe0
--- /dev/null
@@ -0,0 +1,97 @@
+<script type="text/javascript">
+var GBisbns = Array();
+
+/**
+ *
+ * @param {DOM object} isbn The form element containing the input parameters "isbns"
+ */
+function searchForGBPreview( isbn ) {
+  dojo.require("dojo.io.script");
+  dojo.io.script.get({"url": "https://www.google.com/jsapi"});
+  dojo.io.script.get({"url": "https://www.googleapis.com/books/v1/volumes", "content": { "q": "isbn:" + isbn, "callback": "GBPreviewCallback"}});
+}
+
+/**
+ * This function is the call-back function for the JSON scripts which 
+ * executes a Google book search response.
+ *
+ * @param {JSON} GBPBookInfo is the JSON object pulled from the Google books service.
+ */
+function GBPreviewCallback(GBPBookInfo) {
+  if (GBPBookInfo.totalItems < 1) return;
+
+  var accessInfo = GBPBookInfo.items[0].accessInfo;
+  if ( !accessInfo ) {
+    return;
+  }
+
+  if ( accessInfo.embeddable ) {
+    /* Add a button below the book cover image to load the preview. */
+    var GBPBadge = document.createElement( 'img' );
+    GBPBadge.id = 'gbpbadge';
+    GBPBadge.src = 'https://www.google.com/intl/[% ctx.locale.substr(0,2) %]/googlebooks/images/gbs_preview_button1.gif';
+    GBPBadge.title = dojo.byId('rdetail_title').innerHTML;
+    GBPBadge.style.border = 0;
+    GBPBadge.style.margin = '0.5em 0 0 0';
+    GBPBadgelink = document.createElement('a');
+    GBPBadgelink.href = 'javascript:GBDisplayPreview();';
+    GBPBadgelink.appendChild( GBPBadge );
+    dojo.byId('rdetail_title_div').appendChild( GBPBadgelink );
+  }
+}
+
+/**
+ *  This is called when the user clicks on the 'Preview' link.  We assume
+ *  a preview is available from Google if this link was made visible.
+ */
+function GBDisplayPreview() {
+  var GBPreviewPane = document.createElement('div');
+  GBPreviewPane.id = 'rdetail_preview_div';
+  GBPreviewPane.style.height = '800px';
+  GBPreviewPane.style.width = '600px';
+  GBPreviewPane.style.display = 'block';
+  var GBClear = document.createElement('div');
+  GBClear.style.padding = '1em';
+  dojo.byId('canvas_main').insertBefore(GBPreviewPane, dojo.byId('rdetail_record_details'));
+  dojo.byId('canvas_main').insertBefore(GBClear, dojo.byId('rdetail_record_details'));
+  if (GBPreviewPane.getAttribute('loaded') == null || GBPreviewPane.getAttribute('loaded') == "false" ) {
+     google.load("books", "0", {"callback" : GBPViewerLoadCallback, "language": "[% ctx.locale.substr(0,2) %]"} );
+     GBPreviewPane.setAttribute('loaded', 'true');
+  }
+}
+
+function GBPViewerLoadCallback() {
+  var GBPViewer = new google.books.DefaultViewer(dojo.byId('rdetail_preview_div'));
+  GBPViewer.load('ISBN:' + GBisbns[0]);
+  GBPViewer.resize();
+  dojo.byId('gbpbadge').style.display = 'none';
+}
+
+dojo.addOnLoad(function() {
+  var spans = dojo.query('li.rdetail_isbns span.rdetail_value');
+  for (var i = 0; i < spans.length; i++) {
+    var prop = spans[i].getAttribute('itemprop');
+    if (!prop) {
+      continue;
+    }
+    var isbn = spans[i].textContent || spans[i].innerText;
+    if (!isbn) {
+      continue;
+    }
+    isbn = isbn.toString().replace(/^\s+/,"");
+    var idx = isbn.indexOf(" ");
+    if (idx > -1) {
+      isbn = isbn.substring(0, idx);
+    }
+    isbn = isbn.toString().replace(/-/g,"");
+    if (!isbn) {
+      continue;
+    }
+    GBisbns.push(isbn);
+  }
+
+  if (GBisbns.length) {
+      searchForGBPreview(GBisbns[0]);
+  }
+});
+</script>
index 33ab4b7..438daf5 100644 (file)
         END; # IF ident
     %]
 </script>
-[%- IF ctx.google_books_preview -%]
-<script type="text/javascript">
-var GBisbns = Array();
-
-/**
- *
- * @param {DOM object} isbn The form element containing the input parameters "isbns"
- */
-function searchForGBPreview( isbn ) {
-  dojo.require("dojo.io.script");
-  dojo.io.script.get({"url": "https://www.google.com/jsapi"});
-  dojo.io.script.get({"url": "https://www.googleapis.com/books/v1/volumes", "content": { "q": "isbn:" + isbn, "callback": "GBPreviewCallback"}});
-}
-
-/**
- * This function is the call-back function for the JSON scripts which 
- * executes a Google book search response.
- *
- * @param {JSON} GBPBookInfo is the JSON object pulled from the Google books service.
- */
-function GBPreviewCallback(GBPBookInfo) {
-  if (GBPBookInfo.totalItems < 1) return;
-
-  var accessInfo = GBPBookInfo.items[0].accessInfo;
-  if ( !accessInfo ) {
-    return;
-  }
-
-  if ( accessInfo.embeddable ) {
-    /* Add a button below the book cover image to load the preview. */
-    var GBPBadge = document.createElement( 'img' );
-    GBPBadge.id = 'gbpbadge';
-    GBPBadge.src = 'https://www.google.com/intl/[% ctx.locale.substr(0,2) %]/googlebooks/images/gbs_preview_button1.gif';
-    GBPBadge.title = dojo.byId('rdetail_title').innerHTML;
-    GBPBadge.style.border = 0;
-    GBPBadge.style.margin = '0.5em 0 0 0';
-    GBPBadgelink = document.createElement('a');
-    GBPBadgelink.href = 'javascript:GBDisplayPreview();';
-    GBPBadgelink.appendChild( GBPBadge );
-    dojo.byId('rdetail_title_div').appendChild( GBPBadgelink );
-  }
-}
-
-/**
- *  This is called when the user clicks on the 'Preview' link.  We assume
- *  a preview is available from Google if this link was made visible.
- */
-function GBDisplayPreview() {
-  var GBPreviewPane = document.createElement('div');
-  GBPreviewPane.id = 'rdetail_preview_div';
-  GBPreviewPane.style.height = '800px';
-  GBPreviewPane.style.width = '600px';
-  GBPreviewPane.style.display = 'block';
-  var GBClear = document.createElement('div');
-  GBClear.style.padding = '1em';
-  dojo.byId('canvas_main').insertBefore(GBPreviewPane, dojo.byId('rdetail_record_details'));
-  dojo.byId('canvas_main').insertBefore(GBClear, dojo.byId('rdetail_record_details'));
-  if (GBPreviewPane.getAttribute('loaded') == null || GBPreviewPane.getAttribute('loaded') == "false" ) {
-     google.load("books", "0", {"callback" : GBPViewerLoadCallback, "language": "[% ctx.locale.substr(0,2) %]"} );
-     GBPreviewPane.setAttribute('loaded', 'true');
-  }
-}
-
-function GBPViewerLoadCallback() {
-  var GBPViewer = new google.books.DefaultViewer(dojo.byId('rdetail_preview_div'));
-  GBPViewer.load('ISBN:' + GBisbns[0]);
-  GBPViewer.resize();
-  dojo.byId('gbpbadge').style.display = 'none';
-}
-
-dojo.addOnLoad(function() {
-  var spans = dojo.query('li.rdetail_isbns span.rdetail_value');
-  for (var i = 0; i < spans.length; i++) {
-    var prop = spans[i].getAttribute('itemprop');
-    if (!prop) {
-      continue;
-    }
-    var isbn = spans[i].textContent || spans[i].innerText;
-    if (!isbn) {
-      continue;
-    }
-    isbn = isbn.toString().replace(/^\s+/,"");
-    var idx = isbn.indexOf(" ");
-    if (idx > -1) {
-      isbn = isbn.substring(0, idx);
-    }
-    isbn = isbn.toString().replace(/-/g,"");
-    if (!isbn) {
-      continue;
-    }
-    GBisbns.push(isbn);
-  }
-
-  searchForGBPreview(GBisbns[0]);
-});
-</script>
-[%- END %]
index e069b6e..4397e81 100644 (file)
@@ -96,4 +96,8 @@
     IF use_autosuggest.enabled == "t";
         want_dojo = 1;
     END;
+
+    IF ctx.google_books_preview;
+        want_dojo = 1;
+    END;
 %]
index d6cacbe..07dfa9a 100644 (file)
@@ -81,5 +81,6 @@
 [% END; # use_autosuggest %]
 
 [% INCLUDE "opac/parts/acjs.tt2" IF ctx.page == 'record' %]
+[% INCLUDE "opac/parts/ac_google_books.tt2" IF ctx.page == 'record' %]
 
 [%- END; # want_dojo -%]