// console.log('current ' + currentIndex);
// console.log('least visible ' + leastVisible + ' most visible ' + mostVisible);
if (currentIndex < leastVisible) {
+ this.willChangeToIndex(leastVisible);
this.setCurrentIndex(leastVisible);
} else if (currentIndex > mostVisible) {
+ this.willChangeToIndex(mostVisible);
this.setCurrentIndex(mostVisible);
}
// current index in drawLeafsOnePage after we create the new view container
// Make sure this will count as current page after resize
- var fudgeFactor = (this.getPageHeight(this.currentIndex()) / this.reduce) * 0.5;
+ // console.log('fudging for index ' + this.currentIndex() + ' (page ' + this.getPageNum(this.currentIndex()) + ')');
+ var fudgeFactor = (this.getPageHeight(this.currentIndex()) / this.reduce) * 0.6;
var oldLeafTop = this.onePageGetPageTop(this.currentIndex()) + fudgeFactor;
var oldViewDimensions = this.onePageCalculateViewDimensions(this.reduce, this.padding);
scrollRatio = oldLeafTop / oldViewDimensions.height;
$('#BookReaderSearchResults').html('Searching...');
}
+// searchNew()
+//______________________________________________________________________________
+BookReader.prototype.searchNew = function(term) {
+ //console.log('searchNew called with term=' + term);
+ var url = 'http://'+this.server.replace(/:.+/, ''); //remove the port and userdir
+ url += '/~edward/inside_jsonp.php?item_id='+this.bookId;
+ url += '&doc='+this.subPrefix; //TODO: test with subitem
+ url += '&path='+this.bookPath.replace(new RegExp('/'+this.subPrefix+'$'), ''); //remove subPrefix from end of path
+ url += '&q='+escape(term);
+ //console.log('search url='+url);
+ this.ttsAjax = $.ajax({url:url, dataType:'jsonp', jsonpCallback:'BRSearchCallbackNew'});
+}
+
+// Unfortunately, we can't pass 'br.searchCallback' to our search service,
+// because it can't handle the '.'
+function BRSearchCallbackNew(results) {
+ //console.log('got ' + results.matches.length + ' results');
+ var i;
+ for (i=0; i<results.matches.length; i++) {
+ br.addSearchResult(results.matches[i].text, br.leafNumToIndex(results.matches[i].par[0].page));
+ }
+}
+
// BRSearchCallback()
//______________________________________________________________________________
BookReader.prototype.BRSearchCallback = function(txt) {
$('#BRpager').data('swallowchange', true).slider('value', index);
}
-BookReader.prototype.addSearchResult = function(queryString, pageNumber, pageIndex) {
+BookReader.prototype.addSearchResult = function(queryString, pageIndex) {
+ var pageNumber = this.getPageNum(pageIndex);
var uiStringSearch = "Search result"; // i18n
var uiStringPage = "Page"; // i18n
pageDisplayString = uiStringPage + ' ' + pageNumber;
}
+ var re = new RegExp('{{{(.+?)}}}', 'g');
+ queryString = queryString.replace(re, '<a href="#" onclick="br.jumpToIndex('+pageIndex+'); return false;">$1</a>')
+
$('<div class="search" style="left:' + percentThrough + ';" title="' + uiStringSearch + '"><div class="query">'
+ queryString + '<span>' + uiStringPage + ' ' + pageNumber + '</span></div>')
.data({'self': this, 'pageIndex': pageIndex })
BookReader.prototype.initToolbar = function(mode, ui) {
// $$$mang should be contained within the BookReader div instead of body
+ var readIcon = ''
+ if (!navigator.userAgent.match(/mobile/i)) {
+ readIcon = "<button class='BRicon read modal'></button>";
+ }
+
$("body").append(
"<div id='BRtoolbar'>"
+ "<span id='BRtoolbarbuttons'>"
/* XXXmang integrate search */
- + "<form method='get' id='booksearch'><input type='search' id='textSrch' name='textSrch' val='' placeholder='Search inside'/><button type='submit' id='btnSrch' name='btnSrch'>GO</button></form>"
+ + "<form action='javascript:' id='booksearch'><input type='search' id='textSrch' name='textSrch' val='' placeholder='Search inside'/><button type='submit' id='btnSrch' name='btnSrch'>GO</button></form>"
// XXXmang icons incorrect or handlers wrong
+ "<button class='BRicon info'></button>"
+ "<button class='BRicon share'></button>"
- + "<button class='BRicon read modal'></button>"
+ + readIcon
+ "<button class='BRicon full'></button>"
+ "</span>"
+ "<span><a class='logo' href='" + this.logoURL + "'></a></span>"
self.zoom(-1);
return false;
});
+
+ $('#booksearch').bind('submit', function() {
+ self.searchNew($('#textSrch').val());
+ });
+
}
// updateToolbarZoom(reduce)
// ttsToggle()
//______________________________________________________________________________
BookReader.prototype.ttsToggle = function () {
- if (false == this.ttsPlaying) {
+ if (false == this.ttsPlaying) {
+ this.ttsPlaying = true;
+ this.showProgressPopup();
if(soundManager.supported()) {
this.ttsStart();
} else {
if (oStatus.success) {
this.ttsStart();
} else {
- alert('Could not load soundManger2, possibly due to FlashBlock. Audio playback is disabled');
+ alert('Could not load soundManager2, possibly due to FlashBlock. Audio playback is disabled');
}
}, this);
}
if (soundManager.debugMode) console.log('starting readAloud');
if (this.constModeThumb == this.mode) this.switchMode(this.constMode1up);
- this.ttsPlaying = true;
+ //this.ttsPlaying = true; //set this in ttsToggle()
this.ttsIndex = this.currentIndex();
this.ttsFormat = 'mp3';
if ($.browser.mozilla) {
soundManager.stopAll();
soundManager.destroySound('chunk'+this.ttsIndex+'-'+this.ttsPosition);
this.ttsRemoveHilites();
- this.ttsRemovePopup();
+ this.removeProgressPopup();
this.ttsPlaying = false;
this.ttsIndex = null; //leaf index
return;
}
- this.ttsShowPopup();
+ this.showProgressPopup();
///// whileloading: broken on safari
///// onload fires on safari, but *after* the sound starts playing..
id: 'chunk'+this.ttsIndex+'-0',
//url: 'http://home.us.archive.org/~rkumar/arctic.ogg',
url: 'http://'+this.server+'/BookReader/BookReaderGetTTS.php?string=' + escape(data[0][0]) + '&format=.'+this.ttsFormat, //the .ogg is to trick SoundManager2 to use the HTML5 audio player
- whileloading: function(){if (this.bytesLoaded == this.bytesTotal) this.br.ttsRemovePopup();}, //onload never fires in FF...
- onload: function(){this.br.ttsRemovePopup();} //whileloading never fires in safari...
+ whileloading: function(){if (this.bytesLoaded == this.bytesTotal) this.br.removeProgressPopup();}, //onload never fires in FF...
+ onload: function(){this.br.removeProgressPopup();} //whileloading never fires in safari...
});
snd.br = this;
snd.load();
this.ttsNextChunk();
}
-// ttsShowPopup
+// showProgressPopup
//______________________________________________________________________________
-BookReader.prototype.ttsShowPopup = function() {
- if (soundManager.debugMode) console.log('ttsShowPopup index='+this.ttsIndex+' pos='+this.ttsPosition);
+BookReader.prototype.showProgressPopup = function() {
+ if (soundManager.debugMode) console.log('showProgressPopup index='+this.ttsIndex+' pos='+this.ttsPosition);
+ if (this.popup) return;
this.popup = document.createElement("div");
$(this.popup).css({
left: $('#BookReader').width()-220 + 'px',
width: '220px',
height: '20px',
- }).attr('className', 'BRttsPopUp').appendTo('#BookReader');
+ }).attr('className', 'BRprogresspopup').appendTo('#BookReader');
htmlStr = ' ';
this.popup.innerHTML = htmlStr;
}
-// ttsRemovePopup
+// removeProgressPopup
//______________________________________________________________________________
-BookReader.prototype.ttsRemovePopup = function() {
+BookReader.prototype.removeProgressPopup = function() {
$(this.popup).remove();
this.popup=null;
}