// it should start (doesn't jump after init)
this.initNavbar();
this.bindNavigationHandlers();
+
+ // Set strings in the UI
+ this.initUIStrings();
// Start AJAX request for OL data
if (this.getOpenLibraryRecord) {
$('#pagediv'+index).remove();
}
} else {
- /*
- var mRow = this.displayedRows[i];
- var mLeafs = '[' + [leaf.num for each (leaf in leafMap[mRow].leafs)] + ']';
- console.log('NOT Removing row ' + mRow + ' ' + mLeafs);
- */
+ // var mRow = this.displayedRows[i];
+ // var mLeafs = '[' + [leaf.num for each (leaf in leafMap[mRow].leafs)] + ']';
+ // console.log('NOT Removing row ' + mRow + ' ' + mLeafs);
}
}
return spreadSize.reduce;
}
+// twoPageIsZoomedIn
+//______________________________________________________________________________
+// Returns true if the pages extend past the edge of the view
+BookReader.prototype.twoPageIsZoomedIn = function() {
+ var autofitReduce = this.twoPageGetAutofitReduce();
+ var isZoomedIn = false;
+ if (this.twoPage.autofit != 'auto') {
+ if (this.reduce < this.twoPageGetAutofitReduce()) {
+ isZoomedIn = true;
+ }
+ }
+ return isZoomedIn;
+}
+
BookReader.prototype.onePageGetAutofitWidth = function() {
var widthPadding = 20;
return (this.getMedianPageSize().width + 0.0) / ($('#BRcontainer').attr('clientWidth') - widthPadding * 2);
function(e) {
if (e.button == 2) {
// right click
- return;
+ return true;
}
-
- var autofitReduce = e.data.self.twoPageGetAutofitReduce();
- // Don't trigger if zoomed in
- if (e.data.self.reduce >= e.data.self.twoPageGetAutofitReduce()) {
+
+ if (! e.data.self.twoPageIsZoomedIn()) {
e.data.self.ttsStop();
e.data.self.left();
}
function(e) {
if (e.button == 2) {
// right click
- return;
+ return true;
}
-
- var autofitReduce = e.data.self.twoPageGetAutofitReduce();
- // Don't trigger if zoomed in
- if (e.data.self.reduce >= e.data.self.twoPageGetAutofitReduce()) {
+
+ if (! e.data.self.twoPageIsZoomedIn()) {
e.data.self.ttsStop();
- e.data.self.right();
+ e.data.self.right();
}
e.preventDefault();
}
BookReader.prototype.initNavbar = function() {
// Setup nav / chapter / search results bar
- // $$$ should make this work inside the BookReader div (self-contained), rather than after
- $('#BookReader').after(
+ $('#BookReader').append(
'<div id="BRnav">'
+ '<div id="BRpage">' // Page turn buttons
+ '<button class="BRicon onepg"></button>'
readIcon = "<button class='BRicon read modal'></button>";
}
- $("body").append(
+ $("#BookReader").append(
"<div id='BRtoolbar'>"
+ "<span id='BRtoolbarbuttons'>"
+ "<form action='javascript:br.search($(\"#textSrch\").val());' id='booksearch'><input type='search' id='textSrch' name='textSrch' val='' placeholder='Search inside'/><button type='submit' id='btnSrch' name='btnSrch'>GO</button></form>"
+ "</span>"
+ "<span><a class='logo' href='" + this.logoURL + "'></a></span>"
+ "<span id='BRreturn'><span>Back to</span><a href='" + this.bookUrl + "'>" + this.bookTitle + "</a></span>"
- + "<div id='BRnavCntlTop' class='BRnavCntl BRup'></div>"
+ + "<div id='BRnavCntlTop' class='BRnabrbuvCntl'></div>"
+ "</div>"
/*
+ "<div id='BRzoomer'>"
*/
);
+ $('#BRtoolbar .BRnavCntl').addClass('BRup');
$('#BRtoolbar .pause').hide();
this.updateToolbarZoom(this.reduce); // Pretty format
// We build in mode 2
jToolbar.append();
-
- // Navigation handlers will be bound after all UI is in place -- makes moving icons between
- // the toolbar and nav bar easier
-
- // Setup tooltips -- later we could load these from a file for i18n
- var titles = { '.logo': 'Go to Archive.org',
- '.zoom_in': 'Zoom in',
- '.zoom_out': 'Zoom out',
- '.onepg': 'One-page view',
- '.twopg': 'Two-page view',
- '.thumb': 'Thumbnail view',
- '.print': 'Print this page',
- '.embed': 'Embed BookReader',
- '.link': 'Link to this book (and page)',
- '.bookmark': 'Bookmark this page',
- '.read': 'Read this book aloud',
- '.full': 'Show fullscreen',
- '.book_left': 'Flip left',
- '.book_right': 'Flip right',
- '.book_up': 'Page up',
- '.book_down': 'Page down',
- '.play': 'Play',
- '.pause': 'Pause',
- '.book_top': 'First page',
- '.book_bottom': 'Last page'
- };
- if ('rl' == this.pageProgression) {
- titles['.book_leftmost'] = 'Last page';
- titles['.book_rightmost'] = 'First page';
- } else { // LTR
- titles['.book_leftmost'] = 'First page';
- titles['.book_rightmost'] = 'Last page';
- }
-
- for (var icon in titles) {
- jToolbar.find(icon).attr('title', titles[icon]);
- }
-
+
// Hide mode buttons and autoplay if 2up is not available
// $$$ if we end up with more than two modes we should show the applicable buttons
if ( !this.canSwitchToMode(this.constMode2up) ) {
jToolbar.find('.one_page_mode').hide();
}
- // $$$ Don't hardcode ids
- jToolbar.find('.share').colorbox({inline: true, opacity: "0.5", href: "#BRshare"});
- jToolbar.find('.info').colorbox({inline: true, opacity: "0.5", href: "#BRinfo"});
+ // $$$ Don't hardcode ids
+ var self = this;
+ jToolbar.find('.share').colorbox({inline: true, opacity: "0.5", href: "#BRshare", onLoad: function() { self.ttsStop(); } });
+ jToolbar.find('.info').colorbox({inline: true, opacity: "0.5", href: "#BRinfo", onLoad: function() { self.ttsStop(); } });
- $("body").append(['<div style="display: none;">',
- '<div class="BRfloat" id="BRshare">',
- '<div class="BRfloatHead">',
- 'Share',
- '<a class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></a>',
- '</div>',
- '</div>',
+ $('<div style="display: none;"></div>').append(this.blankShareDiv()).append(this.blankInfoDiv()).appendTo($('body'));
+
+ $('#BRinfo .BRfloatTitle a').attr( {'href': this.bookUrl} ).text(this.bookTitle).addClass('title');
+
+ // These functions can be overridden
+ this.buildInfoDiv($('#BRinfo'));
+ this.buildShareDiv($('#BRshare'));
+
+ // Switch to requested mode -- binds other click handlers
+ //this.switchToolbarMode(mode);
+
+}
+
+BookReader.prototype.blankInfoDiv = function() {
+ return $([
'<div class="BRfloat" id="BRinfo">',
'<div class="BRfloatHead">About this book',
'<a class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></a>',
'<div class="BRfloatTitle">',
'<h2><a/></h2>',
'</div>',
-
- '</div>',
'</div>',
'</div>',
'<div class="BRfloatFoot">',
'<a href="http://openlibrary.org/dev/docs/bookreader">About the BookReader</a>',
'</div>',
- '</div>'].join('\n'));
+ '</div>'].join('\n')
+ );
+}
- $('#BRinfo .BRfloatTitle a').attr( {'href': this.bookUrl} ).text(this.bookTitle).addClass('title').appendTo
-
- // These functions can be overridden
- this.buildInfoDiv($('#BRinfo'));
- this.buildShareDiv($('#BRshare'));
-
- // Switch to requested mode -- binds other click handlers
- //this.switchToolbarMode(mode);
-
+BookReader.prototype.blankShareDiv = function() {
+ return $([
+ '<div class="BRfloat" id="BRshare">',
+ '<div class="BRfloatHead">',
+ 'Share',
+ '<a class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></a>',
+ '</div>',
+ '</div>'].join('\n')
+ );
}
BookReader.prototype.gotOpenLibraryRecord = function(self, olObject) {
// $$$ could refactor this so that 'this' is available
if (olObject) {
- // console.log(olObject);
+ //console.log(olObject);
if (olObject['table_of_contents']) {
// XXX check here that TOC is valid
self.updateTOC(olObject['table_of_contents']);
}
// $$$mang cleanup
- this.bookUrl = 'http://openlibrary.org' + olObject.key;
+ self.bookUrl = 'http://openlibrary.org' + olObject.key;
+ self.bookTitle = olObject['title'];
$('#BRreturn a').attr('href', this.bookUrl);
+ $('#BookReader .logo').attr('title', 'Go to Open Library'); // i18n
+
+ $('#BRinfo').remove();
+ $('#BRshare').after(self.blankInfoDiv());
+ self.buildInfoDiv($('#BRinfo'));
}
}
// showProgressPopup
//______________________________________________________________________________
BookReader.prototype.showProgressPopup = function(msg) {
- if (soundManager.debugMode) console.log('showProgressPopup index='+this.ttsIndex+' pos='+this.ttsPosition);
+ //if (soundManager.debugMode) console.log('showProgressPopup index='+this.ttsIndex+' pos='+this.ttsPosition);
if (this.popup) return;
this.popup = document.createElement("div");
params.page = self.getPageNum(self.currentIndex());
}
- console.log(params);
+ // console.log(params);
var embedLink = self.getEmbedURL( params );
form.find('.BRframeEmbed').val('<iframe src="' + embedLink + '" width="480" height="480"></iframe>');
})
}
// Should be overridden
-BookReader.prototype._buildInfoDiv = function(jInfoDiv)
+BookReader.prototype.buildInfoDiv = function(jInfoDiv)
{
+ jInfoDiv.find('.BRfloatTitle a').attr({'href': this.bookUrl, 'alt': this.bookTitle}).text(this.bookTitle);
+}
+
+// Can be overriden
+BookReader.prototype.initUIStrings = function()
+{
+ // Navigation handlers will be bound after all UI is in place -- makes moving icons between
+ // the toolbar and nav bar easier
+
+ // Setup tooltips -- later we could load these from a file for i18n
+ var titles = { '.logo': 'Go to Archive.org', // $$$ update after getting OL record
+ '.zoom_in': 'Zoom in',
+ '.zoom_out': 'Zoom out',
+ '.onepg': 'One-page view',
+ '.twopg': 'Two-page view',
+ '.thumb': 'Thumbnail view',
+ '.print': 'Print this page',
+ '.embed': 'Embed BookReader',
+ '.link': 'Link to this book (and page)',
+ '.bookmark': 'Bookmark this page',
+ '.read': 'Read this book aloud',
+ '.share': 'Share this book',
+ '.info': 'About this book',
+ '.full': 'Show fullscreen',
+ '.book_left': 'Flip left',
+ '.book_right': 'Flip right',
+ '.book_up': 'Page up',
+ '.book_down': 'Page down',
+ '.play': 'Play',
+ '.pause': 'Pause',
+ '.BRdn': 'Show/hide nav bar', // Would have to keep updating on state change to have just "Hide nav bar"
+ '.BRup': 'Show/hide nav bar',
+ '.book_top': 'First page',
+ '.book_bottom': 'Last page'
+ };
+ if ('rl' == this.pageProgression) {
+ titles['.book_leftmost'] = 'Last page';
+ titles['.book_rightmost'] = 'First page';
+ } else { // LTR
+ titles['.book_leftmost'] = 'First page';
+ titles['.book_rightmost'] = 'Last page';
+ }
+
+ for (var icon in titles) {
+ if (titles.hasOwnProperty(icon)) {
+ $('#BookReader').find(icon).attr('title', titles[icon]);
+ }
+ }
}