From 416f7ab6a029c0198d6d4d1e13fa186f108b6ea5 Mon Sep 17 00:00:00 2001 From: Fred Chasen Date: Mon, 15 Jul 2013 22:14:52 -0700 Subject: [PATCH] Added several usage examples, fixed bugs, turned off restore by default --- Gruntfile.js | 1 + build/epub.js | 46 +- build/epub.min.js | 2 + build/reader.js | 2 +- demo/js/epub.min.js | 4 +- demo/js/reader.min.js | 2 +- examples/annotator.html | 155 +- examples/basic.css | 64 + examples/basic.html | 89 + examples/contained.html | 38 + examples/fixed.html | 76 + examples/hypothesis.html | 126 +- examples/promises.html | 74 + examples/single.html | 77 + hooks/extensions/annotate.js | 56 +- libs/annotator/annotator-full-o.js | 2759 ----- libs/annotator/annotator-full.js | 1047 +- libs/annotator/annotator-full.min.js | 11 - libs/annotator/css/annotator.css | 892 ++ libs/annotator/img/annotator-glyph-sprite.png | Bin 0 -> 5085 bytes libs/annotator/img/annotator-icon-sprite.png | Bin 0 -> 7184 bytes libs/annotator/lib/annotator.js | 595 + libs/annotator/lib/annotator.map | 10 + libs/annotator/lib/class.js | 132 + libs/annotator/lib/class.map | 10 + libs/annotator/lib/console.js | 44 + libs/annotator/lib/console.map | 10 + libs/annotator/lib/editor.js | 226 + libs/annotator/lib/editor.map | 10 + libs/annotator/lib/helpers/spec_helper.js | 149 + libs/annotator/lib/helpers/spec_helper.map | 10 + libs/annotator/lib/notification.js | 65 + libs/annotator/lib/notification.map | 10 + .../lib/plugin/annotateitpermissions.js | 116 + .../lib/plugin/annotateitpermissions.map | 10 + libs/annotator/lib/plugin/auth.js | 215 + libs/annotator/lib/plugin/auth.map | 10 + libs/annotator/lib/plugin/document.js | 259 + libs/annotator/lib/plugin/document.map | 10 + libs/annotator/lib/plugin/filter.js | 282 + libs/annotator/lib/plugin/filter.map | 10 + libs/annotator/lib/plugin/kitchensink.js | 67 + libs/annotator/lib/plugin/kitchensink.map | 10 + libs/annotator/lib/plugin/markdown.js | 39 + libs/annotator/lib/plugin/markdown.map | 10 + libs/annotator/lib/plugin/permissions.js | 205 + libs/annotator/lib/plugin/permissions.map | 10 + libs/annotator/lib/plugin/store.js | 271 + libs/annotator/lib/plugin/store.map | 10 + libs/annotator/lib/plugin/tags.js | 123 + libs/annotator/lib/plugin/tags.map | 10 + libs/annotator/lib/plugin/unsupported.js | 36 + libs/annotator/lib/plugin/unsupported.map | 10 + libs/annotator/lib/preamble.js | 17 + libs/annotator/lib/preamble.map | 10 + libs/annotator/lib/range.js | 326 + libs/annotator/lib/range.map | 10 + libs/annotator/lib/spec/annotator_spec.js | 1149 ++ libs/annotator/lib/spec/annotator_spec.map | 10 + libs/annotator/lib/spec/class_spec.js | 166 + libs/annotator/lib/spec/class_spec.map | 10 + libs/annotator/lib/spec/console_spec.js | 6 + libs/annotator/lib/spec/console_spec.map | 10 + libs/annotator/lib/spec/editor_spec.js | 246 + libs/annotator/lib/spec/editor_spec.map | 10 + libs/annotator/lib/spec/notification_spec.js | 39 + libs/annotator/lib/spec/notification_spec.map | 10 + .../spec/plugin/annotateitpermissions_spec.js | 178 + .../plugin/annotateitpermissions_spec.map | 10 + libs/annotator/lib/spec/plugin/auth_spec.js | 131 + libs/annotator/lib/spec/plugin/auth_spec.map | 10 + .../lib/spec/plugin/document_spec.js | 110 + .../lib/spec/plugin/document_spec.map | 10 + libs/annotator/lib/spec/plugin/filter_spec.js | 468 + .../annotator/lib/spec/plugin/filter_spec.map | 10 + .../lib/spec/plugin/kitchensink_spec.js | 150 + .../lib/spec/plugin/kitchensink_spec.map | 10 + .../lib/spec/plugin/markdown_spec.js | 72 + .../lib/spec/plugin/markdown_spec.map | 10 + .../lib/spec/plugin/permissions_spec.js | 456 + .../lib/spec/plugin/permissions_spec.map | 10 + libs/annotator/lib/spec/plugin/store_spec.js | 640 ++ libs/annotator/lib/spec/plugin/store_spec.map | 10 + libs/annotator/lib/spec/plugin/tags_spec.js | 108 + libs/annotator/lib/spec/plugin/tags_spec.map | 10 + .../lib/spec/plugin/unsupported_spec.js | 6 + .../lib/spec/plugin/unsupported_spec.map | 10 + libs/annotator/lib/spec/range_spec.js | 206 + libs/annotator/lib/spec/range_spec.map | 10 + libs/annotator/lib/spec/util_spec.js | 127 + libs/annotator/lib/spec/util_spec.map | 10 + libs/annotator/lib/spec/viewer_spec.js | 196 + libs/annotator/lib/spec/viewer_spec.map | 10 + libs/annotator/lib/spec/widget_spec.js | 213 + libs/annotator/lib/spec/widget_spec.map | 10 + libs/annotator/lib/util.js | 160 + libs/annotator/lib/util.map | 10 + libs/annotator/lib/vendor/gettext.js | 1265 +++ libs/annotator/lib/vendor/jquery.js | 9597 +++++++++++++++++ libs/annotator/lib/vendor/json2.js | 483 + libs/annotator/lib/vendor/showdown.js | 419 + libs/annotator/lib/vendor/xpath.js | 986 ++ libs/annotator/lib/viewer.js | 187 + libs/annotator/lib/viewer.map | 10 + libs/annotator/lib/widget.js | 78 + libs/annotator/lib/widget.map | 10 + libs/annotator/lib/xpath.js | 103 + libs/annotator/lib/xpath.map | 10 + libs/annotator/util.js | 160 + reader/app.js | 2 +- src/book.js | 9 +- src/renderer.js | 37 +- 112 files changed, 23903 insertions(+), 3348 deletions(-) create mode 100644 build/epub.min.js create mode 100644 examples/basic.css create mode 100644 examples/basic.html create mode 100644 examples/contained.html create mode 100644 examples/fixed.html create mode 100644 examples/promises.html create mode 100644 examples/single.html delete mode 100644 libs/annotator/annotator-full-o.js mode change 100644 => 100755 libs/annotator/annotator-full.js delete mode 100644 libs/annotator/annotator-full.min.js create mode 100644 libs/annotator/css/annotator.css create mode 100755 libs/annotator/img/annotator-glyph-sprite.png create mode 100755 libs/annotator/img/annotator-icon-sprite.png create mode 100644 libs/annotator/lib/annotator.js create mode 100644 libs/annotator/lib/annotator.map create mode 100644 libs/annotator/lib/class.js create mode 100644 libs/annotator/lib/class.map create mode 100644 libs/annotator/lib/console.js create mode 100644 libs/annotator/lib/console.map create mode 100644 libs/annotator/lib/editor.js create mode 100644 libs/annotator/lib/editor.map create mode 100644 libs/annotator/lib/helpers/spec_helper.js create mode 100644 libs/annotator/lib/helpers/spec_helper.map create mode 100644 libs/annotator/lib/notification.js create mode 100644 libs/annotator/lib/notification.map create mode 100644 libs/annotator/lib/plugin/annotateitpermissions.js create mode 100644 libs/annotator/lib/plugin/annotateitpermissions.map create mode 100644 libs/annotator/lib/plugin/auth.js create mode 100644 libs/annotator/lib/plugin/auth.map create mode 100644 libs/annotator/lib/plugin/document.js create mode 100644 libs/annotator/lib/plugin/document.map create mode 100644 libs/annotator/lib/plugin/filter.js create mode 100644 libs/annotator/lib/plugin/filter.map create mode 100644 libs/annotator/lib/plugin/kitchensink.js create mode 100644 libs/annotator/lib/plugin/kitchensink.map create mode 100644 libs/annotator/lib/plugin/markdown.js create mode 100644 libs/annotator/lib/plugin/markdown.map create mode 100644 libs/annotator/lib/plugin/permissions.js create mode 100644 libs/annotator/lib/plugin/permissions.map create mode 100644 libs/annotator/lib/plugin/store.js create mode 100644 libs/annotator/lib/plugin/store.map create mode 100644 libs/annotator/lib/plugin/tags.js create mode 100644 libs/annotator/lib/plugin/tags.map create mode 100644 libs/annotator/lib/plugin/unsupported.js create mode 100644 libs/annotator/lib/plugin/unsupported.map create mode 100644 libs/annotator/lib/preamble.js create mode 100644 libs/annotator/lib/preamble.map create mode 100644 libs/annotator/lib/range.js create mode 100644 libs/annotator/lib/range.map create mode 100644 libs/annotator/lib/spec/annotator_spec.js create mode 100644 libs/annotator/lib/spec/annotator_spec.map create mode 100644 libs/annotator/lib/spec/class_spec.js create mode 100644 libs/annotator/lib/spec/class_spec.map create mode 100644 libs/annotator/lib/spec/console_spec.js create mode 100644 libs/annotator/lib/spec/console_spec.map create mode 100644 libs/annotator/lib/spec/editor_spec.js create mode 100644 libs/annotator/lib/spec/editor_spec.map create mode 100644 libs/annotator/lib/spec/notification_spec.js create mode 100644 libs/annotator/lib/spec/notification_spec.map create mode 100644 libs/annotator/lib/spec/plugin/annotateitpermissions_spec.js create mode 100644 libs/annotator/lib/spec/plugin/annotateitpermissions_spec.map create mode 100644 libs/annotator/lib/spec/plugin/auth_spec.js create mode 100644 libs/annotator/lib/spec/plugin/auth_spec.map create mode 100644 libs/annotator/lib/spec/plugin/document_spec.js create mode 100644 libs/annotator/lib/spec/plugin/document_spec.map create mode 100644 libs/annotator/lib/spec/plugin/filter_spec.js create mode 100644 libs/annotator/lib/spec/plugin/filter_spec.map create mode 100644 libs/annotator/lib/spec/plugin/kitchensink_spec.js create mode 100644 libs/annotator/lib/spec/plugin/kitchensink_spec.map create mode 100644 libs/annotator/lib/spec/plugin/markdown_spec.js create mode 100644 libs/annotator/lib/spec/plugin/markdown_spec.map create mode 100644 libs/annotator/lib/spec/plugin/permissions_spec.js create mode 100644 libs/annotator/lib/spec/plugin/permissions_spec.map create mode 100644 libs/annotator/lib/spec/plugin/store_spec.js create mode 100644 libs/annotator/lib/spec/plugin/store_spec.map create mode 100644 libs/annotator/lib/spec/plugin/tags_spec.js create mode 100644 libs/annotator/lib/spec/plugin/tags_spec.map create mode 100644 libs/annotator/lib/spec/plugin/unsupported_spec.js create mode 100644 libs/annotator/lib/spec/plugin/unsupported_spec.map create mode 100644 libs/annotator/lib/spec/range_spec.js create mode 100644 libs/annotator/lib/spec/range_spec.map create mode 100644 libs/annotator/lib/spec/util_spec.js create mode 100644 libs/annotator/lib/spec/util_spec.map create mode 100644 libs/annotator/lib/spec/viewer_spec.js create mode 100644 libs/annotator/lib/spec/viewer_spec.map create mode 100644 libs/annotator/lib/spec/widget_spec.js create mode 100644 libs/annotator/lib/spec/widget_spec.map create mode 100644 libs/annotator/lib/util.js create mode 100644 libs/annotator/lib/util.map create mode 100644 libs/annotator/lib/vendor/gettext.js create mode 100644 libs/annotator/lib/vendor/jquery.js create mode 100644 libs/annotator/lib/vendor/json2.js create mode 100644 libs/annotator/lib/vendor/showdown.js create mode 100644 libs/annotator/lib/vendor/xpath.js create mode 100644 libs/annotator/lib/viewer.js create mode 100644 libs/annotator/lib/viewer.map create mode 100644 libs/annotator/lib/widget.js create mode 100644 libs/annotator/lib/widget.map create mode 100644 libs/annotator/lib/xpath.js create mode 100644 libs/annotator/lib/xpath.map create mode 100644 libs/annotator/util.js diff --git a/Gruntfile.js b/Gruntfile.js index 9bdcffe..fa5ee19 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -23,6 +23,7 @@ module.exports = function(grunt) { my_target: { files: { 'demo/js/epub.min.js': ['libs/underscore/underscore-min.js', 'build/epub.js'], + 'build/epub.min.js': ['libs/underscore/underscore-min.js', 'build/epub.js'], 'demo/js/reader.min.js': 'build/reader.js', 'demo/js/hooks.min.js': 'build/hooks.js', 'demo/js/libs/zip.min.js': ['libs/zip/zip.js', 'libs/zip/zip-fs.js', 'libs/zip/zip-ext.js', 'libs/zip/mime-types.js'], diff --git a/build/epub.js b/build/epub.js index 05887d4..01e5d70 100644 --- a/build/epub.js +++ b/build/epub.js @@ -20,9 +20,11 @@ EPUBJS.Book = function(bookPath, options){ width : false, height: false, spreads: true, + fixedLayout : false, responsive: true, version: 1, - restore: true + restore: false, + styles : {} }); this.settings.EPUBJSVERSION = EPUBJS.VERSION; @@ -590,13 +592,12 @@ EPUBJS.Book.prototype.fromStorage = function(stored) { */ EPUBJS.Book.prototype.setStyle = function(style, val, prefixed) { - this.renderer.setStyle(style, val, prefixed); - + this.render.setStyle(style, val, prefixed); this.settings.styles[style] = val; } EPUBJS.Book.prototype.removeStyle = function(style, val, prefixed) { - this.renderer.removeStyle(style); + this.render.removeStyle(style); delete this.settings.styles[style]; } @@ -1534,9 +1535,15 @@ EPUBJS.Renderer = function(book) { EPUBJS.Renderer.prototype.initialize = function(){ this.iframe = document.createElement('iframe'); //this.iframe.id = "epubjs-iframe"; - this.resizeIframe(false, this.el.clientWidth, this.el.clientHeight); - this.on("book:resized", this.resizeIframe, this); + if(this.settings.width || this.settings.height){ + this.resizeIframe(false, this.settings.width || this.el.clientWidth, this.settings.height || this.el.clientHeight); + } else { + this.resizeIframe(false, this.el.clientWidth, this.el.clientHeight); + + this.on("book:resized", this.resizeIframe, this); + } + this.el.appendChild(this.iframe); @@ -1615,7 +1622,11 @@ EPUBJS.Renderer.prototype.reformat = function(){ var renderer = this; //-- reformat - this.formatSpread(); + if(renderer.book.settings.fixedLayout) { + renderer.fixedLayout(); + } else { + renderer.formatSpread(); + } setTimeout(function(){ @@ -1690,7 +1701,12 @@ EPUBJS.Renderer.prototype.setIframeSrc = function(url){ renderer.applyStyles(); - renderer.formatSpread(); + if(renderer.book.settings.fixedLayout) { + renderer.fixedLayout(); + } else { + renderer.formatSpread(); + } + //-- Trigger registered hooks before displaying renderer.beforeDisplay(function(){ @@ -1767,7 +1783,7 @@ EPUBJS.Renderer.prototype.formatSpread = function(){ this.docEl.style.width = this.elWidth; //-- Adjust height - this.docEl.style.height = this.el.clientHeight + "px"; + this.docEl.style.height = this.iframe.height + "px"; //-- Add columns this.docEl.style[EPUBJS.Renderer.columnAxis] = "horizontal"; @@ -1781,7 +1797,9 @@ EPUBJS.Renderer.prototype.formatSpread = function(){ EPUBJS.Renderer.prototype.fixedLayout = function(){ this.paginated = false; - this.setLeft(0); + this.elWidth = this.iframe.width; + this.docEl.style.width = this.elWidth; + // this.setLeft(0); this.docEl.style.width = this.elWidth; @@ -1789,12 +1807,12 @@ EPUBJS.Renderer.prototype.fixedLayout = function(){ this.docEl.style.height = "auto"; //-- Remove columns - this.docEl.style[EPUBJS.core.columnWidth] = "auto"; + // this.docEl.style[EPUBJS.core.columnWidth] = "auto"; //-- Scroll this.docEl.style.overflow = "auto"; - this.displayedPages = 1; + // this.displayedPages = 1; } EPUBJS.Renderer.prototype.setStyle = function(style, val, prefixed){ @@ -1813,6 +1831,7 @@ EPUBJS.Renderer.prototype.removeStyle = function(style){ EPUBJS.Renderer.prototype.applyStyles = function() { var styles = this.book.settings.styles; + for (style in styles) { this.setStyle(style, styles[style]); } @@ -2280,7 +2299,8 @@ EPUBJS.Renderer.prototype.findFirstVisible = function(startEl){ EPUBJS.Renderer.prototype.isElementVisible = function(el){ var left; - if(el){ + if(el && typeof el.getBoundingClientRect === 'function'){ + left = el.getBoundingClientRect().left; if( left >= 0 && diff --git a/build/epub.min.js b/build/epub.min.js new file mode 100644 index 0000000..0b46804 --- /dev/null +++ b/build/epub.min.js @@ -0,0 +1,2 @@ +!function(){var a=this,b=a._,c={},d=Array.prototype,e=Object.prototype,f=Function.prototype,g=d.push,h=d.slice,i=d.concat,j=e.toString,k=e.hasOwnProperty,l=d.forEach,m=d.map,n=d.reduce,o=d.reduceRight,p=d.filter,q=d.every,r=d.some,s=d.indexOf,t=d.lastIndexOf,u=Array.isArray,v=Object.keys,w=f.bind,x=function(a){return a instanceof x?a:this instanceof x?(this._wrapped=a,void 0):new x(a)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=x),exports._=x):a._=x,x.VERSION="1.4.4";var y=x.each=x.forEach=function(a,b,d){if(null!=a)if(l&&a.forEach===l)a.forEach(b,d);else if(a.length===+a.length){for(var e=0,f=a.length;f>e;e++)if(b.call(d,a[e],e,a)===c)return}else for(var g in a)if(x.has(a,g)&&b.call(d,a[g],g,a)===c)return};x.map=x.collect=function(a,b,c){var d=[];return null==a?d:m&&a.map===m?a.map(b,c):(y(a,function(a,e,f){d[d.length]=b.call(c,a,e,f)}),d)};var z="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),n&&a.reduce===n)return d&&(b=x.bind(b,d)),e?a.reduce(b,c):a.reduce(b);if(y(a,function(a,f,g){e?c=b.call(d,c,a,f,g):(c=a,e=!0)}),!e)throw new TypeError(z);return c},x.reduceRight=x.foldr=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),o&&a.reduceRight===o)return d&&(b=x.bind(b,d)),e?a.reduceRight(b,c):a.reduceRight(b);var f=a.length;if(f!==+f){var g=x.keys(a);f=g.length}if(y(a,function(h,i,j){i=g?g[--f]:--f,e?c=b.call(d,c,a[i],i,j):(c=a[i],e=!0)}),!e)throw new TypeError(z);return c},x.find=x.detect=function(a,b,c){var d;return A(a,function(a,e,f){return b.call(c,a,e,f)?(d=a,!0):void 0}),d},x.filter=x.select=function(a,b,c){var d=[];return null==a?d:p&&a.filter===p?a.filter(b,c):(y(a,function(a,e,f){b.call(c,a,e,f)&&(d[d.length]=a)}),d)},x.reject=function(a,b,c){return x.filter(a,function(a,d,e){return!b.call(c,a,d,e)},c)},x.every=x.all=function(a,b,d){b||(b=x.identity);var e=!0;return null==a?e:q&&a.every===q?a.every(b,d):(y(a,function(a,f,g){return(e=e&&b.call(d,a,f,g))?void 0:c}),!!e)};var A=x.some=x.any=function(a,b,d){b||(b=x.identity);var e=!1;return null==a?e:r&&a.some===r?a.some(b,d):(y(a,function(a,f,g){return e||(e=b.call(d,a,f,g))?c:void 0}),!!e)};x.contains=x.include=function(a,b){return null==a?!1:s&&a.indexOf===s?-1!=a.indexOf(b):A(a,function(a){return a===b})},x.invoke=function(a,b){var c=h.call(arguments,2),d=x.isFunction(b);return x.map(a,function(a){return(d?b:a[b]).apply(a,c)})},x.pluck=function(a,b){return x.map(a,function(a){return a[b]})},x.where=function(a,b,c){return x.isEmpty(b)?c?null:[]:x[c?"find":"filter"](a,function(a){for(var c in b)if(b[c]!==a[c])return!1;return!0})},x.findWhere=function(a,b){return x.where(a,b,!0)},x.max=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&65535>a.length)return Math.max.apply(Math,a);if(!b&&x.isEmpty(a))return-1/0;var d={computed:-1/0,value:-1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g>=d.computed&&(d={value:a,computed:g})}),d.value},x.min=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&65535>a.length)return Math.min.apply(Math,a);if(!b&&x.isEmpty(a))return 1/0;var d={computed:1/0,value:1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;d.computed>g&&(d={value:a,computed:g})}),d.value},x.shuffle=function(a){var b,c=0,d=[];return y(a,function(a){b=x.random(c++),d[c-1]=d[b],d[b]=a}),d};var B=function(a){return x.isFunction(a)?a:function(b){return b[a]}};x.sortBy=function(a,b,c){var d=B(b);return x.pluck(x.map(a,function(a,b,e){return{value:a,index:b,criteria:d.call(c,a,b,e)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;if(c!==d){if(c>d||void 0===c)return 1;if(d>c||void 0===d)return-1}return a.indexf;){var h=f+g>>>1;e>c.call(d,a[h])?f=h+1:g=h}return f},x.toArray=function(a){return a?x.isArray(a)?h.call(a):a.length===+a.length?x.map(a,x.identity):x.values(a):[]},x.size=function(a){return null==a?0:a.length===+a.length?a.length:x.keys(a).length},x.first=x.head=x.take=function(a,b,c){return null==a?void 0:null==b||c?a[0]:h.call(a,0,b)},x.initial=function(a,b,c){return h.call(a,0,a.length-(null==b||c?1:b))},x.last=function(a,b,c){return null==a?void 0:null==b||c?a[a.length-1]:h.call(a,Math.max(a.length-b,0))},x.rest=x.tail=x.drop=function(a,b,c){return h.call(a,null==b||c?1:b)},x.compact=function(a){return x.filter(a,x.identity)};var D=function(a,b,c){return y(a,function(a){x.isArray(a)?b?g.apply(c,a):D(a,b,c):c.push(a)}),c};x.flatten=function(a,b){return D(a,b,[])},x.without=function(a){return x.difference(a,h.call(arguments,1))},x.uniq=x.unique=function(a,b,c,d){x.isFunction(b)&&(d=c,c=b,b=!1);var e=c?x.map(a,c,d):a,f=[],g=[];return y(e,function(c,d){(b?d&&g[g.length-1]===c:x.contains(g,c))||(g.push(c),f.push(a[d]))}),f},x.union=function(){return x.uniq(i.apply(d,arguments))},x.intersection=function(a){var b=h.call(arguments,1);return x.filter(x.uniq(a),function(a){return x.every(b,function(b){return x.indexOf(b,a)>=0})})},x.difference=function(a){var b=i.apply(d,h.call(arguments,1));return x.filter(a,function(a){return!x.contains(b,a)})},x.zip=function(){for(var a=h.call(arguments),b=x.max(x.pluck(a,"length")),c=Array(b),d=0;b>d;d++)c[d]=x.pluck(a,""+d);return c},x.object=function(a,b){if(null==a)return{};for(var c={},d=0,e=a.length;e>d;d++)b?c[a[d]]=b[d]:c[a[d][0]]=a[d][1];return c},x.indexOf=function(a,b,c){if(null==a)return-1;var d=0,e=a.length;if(c){if("number"!=typeof c)return d=x.sortedIndex(a,b),a[d]===b?d:-1;d=0>c?Math.max(0,e+c):c}if(s&&a.indexOf===s)return a.indexOf(b,c);for(;e>d;d++)if(a[d]===b)return d;return-1},x.lastIndexOf=function(a,b,c){if(null==a)return-1;var d=null!=c;if(t&&a.lastIndexOf===t)return d?a.lastIndexOf(b,c):a.lastIndexOf(b);for(var e=d?c:a.length;e--;)if(a[e]===b)return e;return-1},x.range=function(a,b,c){1>=arguments.length&&(b=a||0,a=0),c=arguments[2]||1;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=Array(d);d>e;)f[e++]=a,a+=c;return f},x.bind=function(a,b){if(a.bind===w&&w)return w.apply(a,h.call(arguments,1));var c=h.call(arguments,2);return function(){return a.apply(b,c.concat(h.call(arguments)))}},x.partial=function(a){var b=h.call(arguments,1);return function(){return a.apply(this,b.concat(h.call(arguments)))}},x.bindAll=function(a){var b=h.call(arguments,1);return 0===b.length&&(b=x.functions(a)),y(b,function(b){a[b]=x.bind(a[b],a)}),a},x.memoize=function(a,b){var c={};return b||(b=x.identity),function(){var d=b.apply(this,arguments);return x.has(c,d)?c[d]:c[d]=a.apply(this,arguments)}},x.delay=function(a,b){var c=h.call(arguments,2);return setTimeout(function(){return a.apply(null,c)},b)},x.defer=function(a){return x.delay.apply(x,[a,1].concat(h.call(arguments,1)))},x.throttle=function(a,b){var c,d,e,f,g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)};return function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},x.debounce=function(a,b,c){var d,e;return function(){var f=this,g=arguments,h=function(){d=null,c||(e=a.apply(f,g))},i=c&&!d;return clearTimeout(d),d=setTimeout(h,b),i&&(e=a.apply(f,g)),e}},x.once=function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}},x.wrap=function(a,b){return function(){var c=[a];return g.apply(c,arguments),b.apply(this,c)}},x.compose=function(){var a=arguments;return function(){for(var b=arguments,c=a.length-1;c>=0;c--)b=[a[c].apply(this,b)];return b[0]}},x.after=function(a,b){return 0>=a?b():function(){return 1>--a?b.apply(this,arguments):void 0}},x.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[];for(var c in a)x.has(a,c)&&(b[b.length]=c);return b},x.values=function(a){var b=[];for(var c in a)x.has(a,c)&&b.push(a[c]);return b},x.pairs=function(a){var b=[];for(var c in a)x.has(a,c)&&b.push([c,a[c]]);return b},x.invert=function(a){var b={};for(var c in a)x.has(a,c)&&(b[a[c]]=c);return b},x.functions=x.methods=function(a){var b=[];for(var c in a)x.isFunction(a[c])&&b.push(c);return b.sort()},x.extend=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)a[c]=b[c]}),a},x.pick=function(a){var b={},c=i.apply(d,h.call(arguments,1));return y(c,function(c){c in a&&(b[c]=a[c])}),b},x.omit=function(a){var b={},c=i.apply(d,h.call(arguments,1));for(var e in a)x.contains(c,e)||(b[e]=a[e]);return b},x.defaults=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)null==a[c]&&(a[c]=b[c])}),a},x.clone=function(a){return x.isObject(a)?x.isArray(a)?a.slice():x.extend({},a):a},x.tap=function(a,b){return b(a),a};var E=function(a,b,c,d){if(a===b)return 0!==a||1/a==1/b;if(null==a||null==b)return a===b;a instanceof x&&(a=a._wrapped),b instanceof x&&(b=b._wrapped);var e=j.call(a);if(e!=j.call(b))return!1;switch(e){case"[object String]":return a==b+"";case"[object Number]":return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return!1;for(var f=c.length;f--;)if(c[f]==a)return d[f]==b;c.push(a),d.push(b);var g=0,h=!0;if("[object Array]"==e){if(g=a.length,h=g==b.length)for(;g--&&(h=E(a[g],b[g],c,d)););}else{var i=a.constructor,k=b.constructor;if(i!==k&&!(x.isFunction(i)&&i instanceof i&&x.isFunction(k)&&k instanceof k))return!1;for(var l in a)if(x.has(a,l)&&(g++,!(h=x.has(b,l)&&E(a[l],b[l],c,d))))break;if(h){for(l in b)if(x.has(b,l)&&!g--)break;h=!g}}return c.pop(),d.pop(),h};x.isEqual=function(a,b){return E(a,b,[],[])},x.isEmpty=function(a){if(null==a)return!0;if(x.isArray(a)||x.isString(a))return 0===a.length;for(var b in a)if(x.has(a,b))return!1;return!0},x.isElement=function(a){return!(!a||1!==a.nodeType)},x.isArray=u||function(a){return"[object Array]"==j.call(a)},x.isObject=function(a){return a===Object(a)},y(["Arguments","Function","String","Number","Date","RegExp"],function(a){x["is"+a]=function(b){return j.call(b)=="[object "+a+"]"}}),x.isArguments(arguments)||(x.isArguments=function(a){return!(!a||!x.has(a,"callee"))}),"function"!=typeof/./&&(x.isFunction=function(a){return"function"==typeof a}),x.isFinite=function(a){return isFinite(a)&&!isNaN(parseFloat(a))},x.isNaN=function(a){return x.isNumber(a)&&a!=+a},x.isBoolean=function(a){return a===!0||a===!1||"[object Boolean]"==j.call(a)},x.isNull=function(a){return null===a},x.isUndefined=function(a){return void 0===a},x.has=function(a,b){return k.call(a,b)},x.noConflict=function(){return a._=b,this},x.identity=function(a){return a},x.times=function(a,b,c){for(var d=Array(a),e=0;a>e;e++)d[e]=b.call(c,e);return d},x.random=function(a,b){return null==b&&(b=a,a=0),a+Math.floor(Math.random()*(b-a+1))};var F={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};F.unescape=x.invert(F.escape);var G={escape:RegExp("["+x.keys(F.escape).join("")+"]","g"),unescape:RegExp("("+x.keys(F.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(a){x[a]=function(b){return null==b?"":(""+b).replace(G[a],function(b){return F[a][b]})}}),x.result=function(a,b){if(null==a)return null;var c=a[b];return x.isFunction(c)?c.call(a):c},x.mixin=function(a){y(x.functions(a),function(b){var c=x[b]=a[b];x.prototype[b]=function(){var a=[this._wrapped];return g.apply(a,arguments),L.call(this,c.apply(x,a))}})};var H=0;x.uniqueId=function(a){var b=++H+"";return a?a+b:b},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var I=/(.)^/,J={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},K=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(a,b,c){var d;c=x.defaults({},c,x.templateSettings);var e=RegExp([(c.escape||I).source,(c.interpolate||I).source,(c.evaluate||I).source].join("|")+"|$","g"),f=0,g="__p+='";a.replace(e,function(b,c,d,e,h){return g+=a.slice(f,h).replace(K,function(a){return"\\"+J[a]}),c&&(g+="'+\n((__t=("+c+"))==null?'':_.escape(__t))+\n'"),d&&(g+="'+\n((__t=("+d+"))==null?'':__t)+\n'"),e&&(g+="';\n"+e+"\n__p+='"),f=h+b.length,b}),g+="';\n",c.variable||(g="with(obj||{}){\n"+g+"}\n"),g="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+g+"return __p;\n";try{d=Function(c.variable||"obj","_",g)}catch(h){throw h.source=g,h}if(b)return d(b,x);var i=function(a){return d.call(this,a,x)};return i.source="function("+(c.variable||"obj")+"){\n"+g+"}",i},x.chain=function(a){return x(a).chain()};var L=function(a){return this._chain?x(a).chain():a};x.mixin(x),y(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=d[a];x.prototype[a]=function(){var c=this._wrapped;return b.apply(c,arguments),"shift"!=a&&"splice"!=a||0!==c.length||delete c[0],L.call(this,c)}}),y(["concat","join","slice"],function(a){var b=d[a];x.prototype[a]=function(){return L.call(this,b.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}.call(this),function(a){"use strict";function b(a,b){f.async(function(){a.trigger("promise:resolved",{detail:b}),a.isResolved=!0,a.resolvedValue=b})}function c(a,b){f.async(function(){a.trigger("promise:failed",{detail:b}),a.isRejected=!0,a.rejectedValue=b})}function d(a){var b,c=[],d=new p,e=a.length;0===e&&d.resolve([]);var f=function(a){return function(b){g(a,b)}},g=function(a,b){c[a]=b,0===--e&&d.resolve(c)},h=function(a){d.reject(a)};for(b=0;e>b;b++)a[b].then(f(b),h);return d}function e(a,b){f[a]=b}var f={},g="undefined"!=typeof window?window:{},h=g.MutationObserver||g.WebKitMutationObserver;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))f.async=function(a,b){process.nextTick(function(){a.call(b)})};else if(h){var i=[],j=new h(function(){var a=i.slice();i=[],a.forEach(function(a){var b=a[0],c=a[1];b.call(c)})}),k=document.createElement("div");j.observe(k,{attributes:!0}),window.addEventListener("unload",function(){j.disconnect(),j=null}),f.async=function(a,b){i.push([a,b]),k.setAttribute("drainQueue","drainQueue")}}else f.async=function(a,b){setTimeout(function(){a.call(b)},1)};var l=function(a,b){this.type=a;for(var c in b)b.hasOwnProperty(c)&&(this[c]=b[c])},m=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c][0]===b)return c;return-1},n=function(a){var b=a._promiseCallbacks;return b||(b=a._promiseCallbacks={}),b},o={mixin:function(a){return a.on=this.on,a.off=this.off,a.trigger=this.trigger,a},on:function(a,b,c){var d,e,f=n(this);for(a=a.split(/\s+/),c=c||this;e=a.shift();)d=f[e],d||(d=f[e]=[]),-1===m(d,b)&&d.push([b,c])},off:function(a,b){var c,d,e,f=n(this);for(a=a.split(/\s+/);d=a.shift();)b?(c=f[d],e=m(c,b),-1!==e&&c.splice(e,1)):f[d]=[]},trigger:function(a,b){var c,d,e,f,g,h=n(this);if(c=h[a])for(var i=0,j=c.length;j>i;i++)d=c[i],e=d[0],f=d[1],"object"!=typeof b&&(b={detail:b}),g=new l(a,b),e.call(f,g)}},p=function(){this.on("promise:resolved",function(a){this.trigger("success",{detail:a.detail})},this),this.on("promise:failed",function(a){this.trigger("error",{detail:a.detail})},this)},q=function(){},r=function(a,b,c,d){var e,f,g,h,i="function"==typeof c;if(i)try{e=c(d.detail),g=!0}catch(j){h=!0,f=j}else e=d.detail,g=!0;e&&"function"==typeof e.then?e.then(function(a){b.resolve(a)},function(a){b.reject(a)}):i&&g?b.resolve(e):h?b.reject(f):b[a](e)};p.prototype={then:function(a,b){var c=new p;return this.isResolved&&f.async(function(){r("resolve",c,a,{detail:this.resolvedValue})},this),this.isRejected&&f.async(function(){r("reject",c,b,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(b){r("resolve",c,a,b)}),this.on("promise:failed",function(a){r("reject",c,b,a)}),c},resolve:function(a){b(this,a),this.resolve=q,this.reject=q},reject:function(a){c(this,a),this.resolve=q,this.reject=q}},o.mixin(p.prototype),a.Promise=p,a.Event=l,a.EventTarget=o,a.all=d,a.configure=e}(window.RSVP={});var EPUBJS=EPUBJS||{};EPUBJS.VERSION="0.1.5",EPUBJS.plugins=EPUBJS.plugins||{},EPUBJS.filePath=EPUBJS.filePath||"/epubjs/",EPUBJS.Book=function(a,b){this.settings=_.defaults(b||{},{element:!1,storage:!1,fromStorage:!1,saved:!1,online:!0,contained:!1,width:!1,height:!1,spreads:!0,fixedLayout:!1,responsive:!0,version:1,restore:!1,styles:{}}),this.settings.EPUBJSVERSION=EPUBJS.VERSION,this.spinePos=0,this.stored=!1,this.hooks={beforeChapterDisplay:[]},this.getHooks(),this.online=this.settings.online||navigator.onLine,this.networkListeners(),0!=this.settings.storage&&(this.storage=new fileStorage.storage(this.settings.storage)),this.ready={manifest:new RSVP.Promise,spine:new RSVP.Promise,metadata:new RSVP.Promise,cover:new RSVP.Promise,toc:new RSVP.Promise},this.ready.all=RSVP.all(_.values(this.ready)),a&&(this.opened=this.open(a)),a&&this.settings.element&&this.opened.then(function(){this.rendered=this.renderTo(el)})},EPUBJS.Book.prototype.open=function(a,b){var c,d=this,e=this.isSaved(a);return this.settings.bookPath=a,this.bookUrl=this.urlFrom(a),e&&!b&&this.applySavedSettings(),this.settings.contained||this.isContained(a)?(this.settings.contained=this.contained=!0,this.bookUrl="",c=this.unarchive(a).then(function(){return e&&d.settings.restore&&!b?d.restore():d.unpack()})):c=e&&this.settings.restore&&!b?this.restore():this.unpack(),this.online&&this.settings.storage&&!this.settings.contained&&(this.settings.stored||c.then(d.storeOffline())),c},EPUBJS.Book.prototype.unpack=function(a){var b=this,c=new EPUBJS.Parser,a=a||"META-INF/container.xml";return b.loadXml(b.bookUrl+a).then(function(a){return c.container(a)}).then(function(a){return b.settings.contentsPath=b.bookUrl+a.basePath,b.settings.packageUrl=b.bookUrl+a.packagePath,b.loadXml(b.settings.packageUrl)}).then(function(a){return c.package(a,b.settings.contentsPath)}).then(function(a){return b.contents=a,b.manifest=b.contents.manifest,b.spine=b.contents.spine,b.spineIndexByURL=b.contents.spineIndexByURL,b.metadata=b.contents.metadata,b.cover=b.contents.cover=b.settings.contentsPath+a.coverPath,b.spineNodeIndex=b.contents.spineNodeIndex=a.spineNodeIndex,b.ready.manifest.resolve(b.contents.manifest),b.ready.spine.resolve(b.contents.spine),b.ready.metadata.resolve(b.contents.metadata),b.ready.cover.resolve(b.contents.cover),b.settings.tocUrl=b.settings.contentsPath+a.tocPath,b.loadXml(b.settings.tocUrl)}).then(function(a){return c.toc(a)}).then(function(a){b.toc=b.contents.toc=a,b.ready.toc.resolve(b.contents.toc)}).then(null,function(a){console.error(a)})},EPUBJS.Book.prototype.getMetadata=function(){return this.ready.metadata},EPUBJS.Book.prototype.getToc=function(){return this.ready.toc},EPUBJS.Book.prototype.networkListeners=function(){var a=this;window.addEventListener("offline",function(){a.online=!1,a.trigger("book:offline")},!1),window.addEventListener("online",function(){a.online=!0,a.trigger("book:online")},!1),window.addEventListener("beforeunload",function(){a.saveSettings(),a.settings.restore&&a.saveContents(),a.trigger("book:unload")},!1)},EPUBJS.Book.prototype.loadXml=function(a){return this.settings.fromStorage?this.storage.getXml(a):this.settings.contained?this.zip.getXml(a):EPUBJS.core.request(a,"xml")},EPUBJS.Book.prototype.urlFrom=function(a){var b=-1!=a.search("://"),c="/"==a[0],d=window.location,e=d.origin||d.protocol+"//"+d.host;return b?a:!b&&c?e+a:b||c?void 0:e+EPUBJS.core.folder(d.pathname)+a},EPUBJS.Book.prototype.unarchive=function(a){return this.zip=new EPUBJS.Unarchiver,this.zip.openZip(a)},EPUBJS.Book.prototype.isContained=function(a){var b=a.lastIndexOf("."),c=a.slice(b+1);return!c||"epub"!=c&&"zip"!=c?!1:!0},EPUBJS.Book.prototype.isSaved=function(a){var b=a+":"+this.settings.version,c=localStorage.getItem(b);return localStorage&&null!==c?!0:!1},EPUBJS.Book.prototype.removeSavedSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;localStorage.removeItem(a),this.settings.stored=!1},EPUBJS.Book.prototype.applySavedSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;return stored=JSON.parse(localStorage.getItem(a)),EPUBJS.VERSION!=stored.EPUBJSVERSION?!1:(this.settings=_.defaults(this.settings,stored),void 0)},EPUBJS.Book.prototype.saveSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;this.render&&(this.settings.previousLocationCfi=this.render.currentLocationCfi),localStorage.setItem(a,JSON.stringify(this.settings))},EPUBJS.Book.prototype.saveContents=function(){var a=this.settings.bookPath+":contents:"+this.settings.version;localStorage.setItem(a,JSON.stringify(this.contents))},EPUBJS.Book.prototype.renderTo=function(a){var b=this;return this.settings.element=a,this.opened.then(function(){return b.render=new EPUBJS.Renderer(b),b.startDisplay()})},EPUBJS.Book.prototype.startDisplay=function(){var a;return a=this.settings.restore&&this.settings.previousLocationCfi?this.displayChapter(this.settings.previousLocationCfi):this.displayChapter(this.spinePos)},EPUBJS.Book.prototype.restore=function(){var a=this,b=this.settings.bookPath+":contents:"+this.settings.version,c=new RSVP.Promise,d=["manifest","spine","metadata","cover","toc","spineNodeIndex","spineIndexByURL"],e=!1,f=localStorage.getItem(b);return"undefined"!=f&&"null"!=f&&(this.contents=JSON.parse(f),d.forEach(function(b){a[b]=a.contents[b],a[b]||(e=!0)})),!e&&f&&this.contents&&this.settings.contentsPath?(this.ready.manifest.resolve(this.manifest),this.ready.spine.resolve(this.spine),this.ready.metadata.resolve(this.metadata),this.ready.cover.resolve(this.cover),this.ready.toc.resolve(this.toc),c.resolve(),c):this.open(this.settings.bookPath,!0)},EPUBJS.Book.prototype.displayChapter=function(a,b){var c,d,e,f=this;return _.isNumber(a)?e=a:(d=new EPUBJS.EpubCFI(a),e=d.spinePos),e>=this.spine.length?!1:0>e?!1:(this.spinePos=e,this.chapter=new EPUBJS.Chapter(this.spine[e]),c=f.render.chapter(this.chapter),d?c.then(function(b){b.currentLocationCfi=a,b.gotoCfiFragment(d)}):b&&c.then(function(a){a.gotoChapterEnd()}),this.settings.fromStorage||this.settings.contained||c.then(function(){f.preloadNextChapter()}),c)},EPUBJS.Book.prototype.nextPage=function(){var a=this.render.nextPage();return a?void 0:this.nextChapter()},EPUBJS.Book.prototype.prevPage=function(){var a=this.render.prevPage();return a?void 0:this.prevChapter()},EPUBJS.Book.prototype.nextChapter=function(){return this.spinePos++,this.displayChapter(this.spinePos)},EPUBJS.Book.prototype.prevChapter=function(){return this.spinePos--,this.displayChapter(this.spinePos,!0)},EPUBJS.Book.prototype.goto=function(a){var b,c=a.split("#"),d=c[0],e=c[1]||!1,f=-1==d.search("://")?this.settings.contentsPath+d:d,g=this.spineIndexByURL[f];return d||(g=this.chapter.spinePos),"number"!=typeof g?!1:g==this.chapter.spinePos&&this.chapter?(e&&this.render.section(e),(new RSVP.Promise).resolve(this.currentChapter)):this.displayChapter(g).then(function(){e&&b.render.section(e)})},EPUBJS.Book.prototype.preloadNextChapter=function(){return document.createElement("iframe"),this.spinePos>=this.spine.length?!1:(next=new EPUBJS.Chapter(this.spine[this.spinePos+1]),EPUBJS.core.request(next.href),void 0)},EPUBJS.Book.prototype.storeOffline=function(){var a=this,b=_.values(this.manifest);return EPUBJS.storage.batch(b).then(function(){a.settings.stored=!0,a.trigger("book:stored")})},EPUBJS.Book.prototype.availableOffline=function(){return this.settings.stored>0?!0:!1},EPUBJS.Book.prototype.setStyle=function(a,b,c){this.render.setStyle(a,b,c),this.settings.styles[a]=b},EPUBJS.Book.prototype.removeStyle=function(a){this.render.removeStyle(a),delete this.settings.styles[a]},EPUBJS.Book.prototype.getHooks=function(){var a,b=this;plugTypes=_.values(this.hooks);for(plugType in this.hooks)a=_.values(EPUBJS.Hooks[plugType]),a.forEach(function(a){b.registerHook(plugType,a)})},EPUBJS.Book.prototype.registerHook=function(a,b,c){var d=this;"undefined"!=typeof this.hooks[a]?"function"==typeof b?c?this.hooks[a].unshift(b):this.hooks[a].push(b):Array.isArray(b)&&b.forEach(function(b){c?d.hooks[a].unshift(b):d.hooks[a].push(b)}):this.hooks[a]=[func]},EPUBJS.Book.prototype.triggerHooks=function(a,b,c){function d(){f--,0>=f&&b&&b()}var e,f;return"undefined"==typeof this.hooks[a]?!1:(e=this.hooks[a],f=e.length,e.forEach(function(a){a(d,c)}),void 0)},RSVP.EventTarget.mixin(EPUBJS.Book.prototype),EPUBJS.Chapter=function(a){this.href=a.href,this.id=a.id,this.spinePos=a.index,this.properties=a.properties,this.linear=a.linear,this.pages=1},EPUBJS.Chapter.prototype.contents=function(a){return a?a.get(href):EPUBJS.core.request(href,"xml")},EPUBJS.Chapter.prototype.url=function(a){var b=new RSVP.Promise;return a?(this.tempUrl||(this.tempUrl=a.getUrl(this.href)),this.tempUrl):(b.resolve(this.href),b)},EPUBJS.Chapter.prototype.setPages=function(a){this.pages=a},EPUBJS.Chapter.prototype.getPages=function(){return this.pages},EPUBJS.Chapter.prototype.getID=function(){return this.ID},EPUBJS.Chapter.prototype.unload=function(a){this.tempUrl&&a&&(a.revokeUrl(this.tempUrl),this.tempUrl=!1)};var EPUBJS=EPUBJS||{};EPUBJS.core={},EPUBJS.core.getEl=function(a){return document.getElementById(a)},EPUBJS.core.getEls=function(a){return document.getElementsByClassName(a)},EPUBJS.core.request=function(a,b){function c(){if(this.readyState===this.DONE)if(200===this.status||this.responseXML){var a;a="xml"==b?this.responseXML:"json"==b?JSON.parse(this.response):this.response,d.resolve(a)}else d.reject(this)}var d=new RSVP.Promise,e=new XMLHttpRequest;return e.open("GET",a),e.onreadystatechange=c,"blob"==b&&(e.responseType=b),"json"==b&&e.setRequestHeader("Accept","application/json"),"xml"==b&&e.overrideMimeType("text/xml"),e.send(),d},EPUBJS.core.toArray=function(a){var b=[];for(member in a){var c;a.hasOwnProperty(member)&&(c=a[member],c.ident=member,b.push(c))}return b},EPUBJS.core.folder=function(a){var b=a.lastIndexOf("/"),c=a.slice(0,b+1);return-1==b&&(c=""),c},EPUBJS.core.dataURLToBlob=function(a){var b=";base64,";if(-1==a.indexOf(b)){var c=a.split(","),d=c[0].split(":")[1],e=c[1];return new Blob([e],{type:d})}for(var c=a.split(b),d=c[0].split(":")[1],e=window.atob(c[1]),f=e.length,g=new Uint8Array(f),h=0;f>h;++h)g[h]=e.charCodeAt(h);return new Blob([g],{type:d})},EPUBJS.core.addScript=function(a,b,c){var d,e;e=!1,d=document.createElement("script"),d.type="text/javascript",d.async=!1,d.src=a,d.onload=d.onreadystatechange=function(){e||this.readyState&&"complete"!=this.readyState||(e=!0,b&&b())},c=c||document.body,c.appendChild(d)},EPUBJS.core.addScripts=function(a,b,c){var d=a.length,e=0,f=function(){e++,d==e?b&&b():EPUBJS.core.loadScript(a[e],f,c)};EPUBJS.core.addScript(a[e],f,c)},EPUBJS.core.addCss=function(a,b,c){var d,e;e=!1,d=document.createElement("link"),d.type="text/css",d.rel="stylesheet",d.href=a,d.onload=d.onreadystatechange=function(){e||this.readyState&&"complete"!=this.readyState||(e=!0,b&&b())},c=c||document.body,c.appendChild(d)},EPUBJS.core.prefixed=function(a){var b=["Webkit","Moz","O","ms"],c=a[0].toUpperCase()+a.slice(1),d=b.length,e=0;if("undefined"!=typeof document.body.style[a])return a;for(;d>e;e++)if("undefined"!=typeof document.body.style[b[e]+c])return b[e]+c;return a},EPUBJS.core.resolveUrl=function(a,b){var c,d,e=[],f=a.split("/");return f.pop(),d=b.split("/"),d.forEach(function(a){".."===a?f.pop():e.push(a)}),c=f.concat(e),c.join("/")},EPUBJS.EpubCFI=function(a){return a?this.parse(a):void 0},EPUBJS.EpubCFI.prototype.generateChapter=function(a,b,c){var a=a+1,d="/"+a+"/";return d+=2*(b+1),c&&(d+="["+c+"]"),d+="!"},EPUBJS.EpubCFI.prototype.generateFragment=function(a,b){var c=this.pathTo(a),d=[];return b&&d.push(b),c.forEach(function(a){d.push(2*(a.index+1)),a.id&&"EPUBJS"!=a.id.slice(0,6)&&d.push("["+a.id+"]")}),d.join("/")},EPUBJS.EpubCFI.prototype.pathTo=function(a){for(var b,c=[];a&&null!==a.parentNode;)b=a.parentNode.children,c.unshift({id:a.id,tagName:a.tagName,index:b?Array.prototype.indexOf.call(b,a):0}),a=a.parentNode;return c},EPUBJS.EpubCFI.prototype.getChapter=function(a){var b=a.split("!");return b[0]},EPUBJS.EpubCFI.prototype.getFragment=function(a){var b=a.split("!");return b[1]},EPUBJS.EpubCFI.prototype.getOffset=function(a){var b=a.split(":");return[b[0],b[1]]},EPUBJS.EpubCFI.prototype.parse=function(a){var b,c,d,e,f={};return f.chapter=this.getChapter(a),f.fragment=this.getFragment(a),f.spinePos=parseInt(f.chapter.split("/")[2])/2-1||0,b=f.chapter.match(/\[(.*)\]/),f.spineId=b[1]||!1,c=f.fragment.split("/"),d=c[c.length-1],f.sections=[],parseInt(d)%2&&(e=this.getOffset(),f.text=parseInt(e[0]),f.character=parseInt(e[1]),c.pop()),c.forEach(function(a){var b,c,d;a&&(b=parseInt(a)/2-1,c=a.match(/\[(.*)\]/),c&&c[1]&&(d=c[1]),f.sections.push({index:b,id:d||!1}))}),f},EPUBJS.EpubCFI.prototype.getElement=function(a,b){var c,b=b||document,d=a.sections,e=b.getElementsByTagName("html")[0],f=Array.prototype.slice.call(e.children);for(d.shift();d.length>0;)c=d.shift(),c.id?e=b.querySelector("#"+c.id):(e=f[c.index],f||console.error("No Kids",e)),e||console.error("No Element For",c),f=Array.prototype.slice.call(e.children);return e},EPUBJS.Events=function(a,b){return this.events={},this.el=b?b:document.createElement("div"),a.createEvent=this.createEvent,a.tell=this.tell,a.listen=this.listen,a.deafen=this.deafen,a.listenUntil=this.listenUntil,this},EPUBJS.Events.prototype.createEvent=function(a){var b=new CustomEvent(a);return this.events[a]=b,b},EPUBJS.Events.prototype.tell=function(a,b){var c;this.events[a]?c=this.events[a]:(console.warn("No event:",a,"defined yet, creating."),c=this.createEvent(a)),b&&(c.msg=b),this.el.dispatchEvent(c)},EPUBJS.Events.prototype.listen=function(a,b,c){return this.events[a]?(c?this.el.addEventListener(a,b.bind(c),!1):this.el.addEventListener(a,b,!1),void 0):(console.warn("No event:",a,"defined yet, creating."),this.createEvent(a),void 0)},EPUBJS.Events.prototype.deafen=function(a,b){this.el.removeEventListener(a,b,!1)},EPUBJS.Events.prototype.listenUntil=function(a,b,c,d){function e(){this.deafen(a,c),this.deafen(b,e)}this.listen(a,c,d),this.listen(b,e,this)},EPUBJS.Hooks=function(){"use strict";return{register:function(a){if(void 0===this[a]&&(this[a]={}),"object"!=typeof this[a])throw"Already registered: "+a;return this[a]}}}(),EPUBJS.Parser=function(a){this.baseUrl=a||""},EPUBJS.Parser.prototype.container=function(a){var b=a.querySelector("rootfile"),c=b.getAttribute("full-path"),d=EPUBJS.core.folder(c);return{packagePath:c,basePath:d}},EPUBJS.Parser.prototype.package=function(a,b){var c=this;b&&(this.baseUrl=b);var d=a.querySelector("metadata"),e=a.querySelector("manifest"),f=a.querySelector("spine"),g=c.manifest(e),h=c.findTocPath(e),i=c.findCoverPath(e),j=Array.prototype.indexOf.call(f.parentNode.childNodes,f),k=c.spine(f,g),l={};return k.forEach(function(a){l[a.href]=a.index}),{metadata:c.metadata(d),spine:k,manifest:g,tocPath:h,coverPath:i,spineNodeIndex:j,spineIndexByURL:l}},EPUBJS.Parser.prototype.findTocPath=function(a){var b=a.querySelector("item[media-type='application/x-dtbncx+xml']");return b?b.getAttribute("href"):!1},EPUBJS.Parser.prototype.findCoverPath=function(a){var b=a.querySelector("item[properties='cover-image']");return b?b.getAttribute("href"):!1},EPUBJS.Parser.prototype.metadata=function(a){var b={},c=this;return b.bookTitle=c.getElementText(a,"title"),b.creator=c.getElementText(a,"creator"),b.description=c.getElementText(a,"description"),b.pubdate=c.getElementText(a,"date"),b.publisher=c.getElementText(a,"publisher"),b.identifier=c.getElementText(a,"identifier"),b.language=c.getElementText(a,"language"),b.rights=c.getElementText(a,"rights"),b.modified_date=c.querySelectorText(a,"meta[property='dcterms:modified']"),b.layout=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.orientation=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.spread=c.querySelectorText(a,"meta[property='rendition:spread']"),b +},EPUBJS.Parser.prototype.getElementText=function(a,b){var c,d=a.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",b);return d&&0!=d.length?(c=d[0],c.childNodes.length?c.childNodes[0].nodeValue:""):""},EPUBJS.Parser.prototype.querySelectorText=function(a,b){var c=a.querySelector(b);return c&&c.childNodes.length?c.childNodes[0].nodeValue:""},EPUBJS.Parser.prototype.manifest=function(a){var b=this.baseUrl,c={},d=a.querySelectorAll("item"),e=Array.prototype.slice.call(d);return e.forEach(function(a){var d=a.getAttribute("id"),e=a.getAttribute("href")||"",f=a.getAttribute("media-type")||"";c[d]={href:b+e,type:f}}),c},EPUBJS.Parser.prototype.spine=function(a,b){var c=[],d=a.getElementsByTagName("itemref"),e=Array.prototype.slice.call(d);return e.forEach(function(a,d){var e=a.getAttribute("idref"),f={id:e,linear:a.getAttribute("linear")||"",properties:a.getAttribute("properties")||"",href:b[e].href,index:d};c.push(f)}),c},EPUBJS.Parser.prototype.toc=function(a){function b(a){var c,d=[],e=[],f=a.childNodes,g=Array.prototype.slice.call(f),h=g.length,i=h;if(0==h)return!1;for(;i--;)c=g[i],"navPoint"===c.nodeName&&e.push(c);return e.forEach(function(a){var c=a.getAttribute("id"),e=a.querySelector("content"),f=e.getAttribute("src"),g=(f.split("#"),a.querySelector("navLabel")),h=g.textContent?g.textContent:"",i=b(a);d.unshift({id:c,href:f,label:h,subitems:i})}),d}var c=a.querySelector("navMap");return b(c)},EPUBJS.Renderer=function(a){var b=a.settings.element;if(this.book=a,this.settings=a.settings,_.isElement(b))this.el=b;else{if("string"!=typeof b)return console.error("Not an Element"),void 0;this.el=EPUBJS.core.getEl(b)}a.registerHook("beforeChapterDisplay",[this.replaceLinks.bind(this),this.replaceResources.bind(this),this.replaceHead.bind(this)],!0),this.crossBrowserColumnCss(),this.epubcfi=new EPUBJS.EpubCFI,this.initialize(),this.listeners()},EPUBJS.Renderer.prototype.initialize=function(){this.iframe=document.createElement("iframe"),this.settings.width||this.settings.height?this.resizeIframe(!1,this.settings.width||this.el.clientWidth,this.settings.height||this.el.clientHeight):(this.resizeIframe(!1,this.el.clientWidth,this.el.clientHeight),this.on("book:resized",this.resizeIframe,this)),this.el.appendChild(this.iframe)},EPUBJS.Renderer.prototype.listeners=function(){this.resized=_.debounce(this.onResized.bind(this),10),window.addEventListener("resize",this.resized,!1)},EPUBJS.Renderer.prototype.chapter=function(a){var b=this,c=!1;return this.book.settings.contained&&(c=this.book.zip),this.currentChapter&&(this.currentChapter.unload(),this.trigger("book:chapterDestroyed")),this.currentChapter=a,this.chapterPos=1,this.pageIds={},this.leftPos=0,this.currentChapterCfi=this.epubcfi.generateChapter(this.book.spineNodeIndex,a.spinePos,a.id),this.visibileEl=!1,a.url(c).then(function(a){return b.setIframeSrc(a)})},EPUBJS.Renderer.prototype.onResized=function(){this.trigger("book:resized",{width:this.el.clientWidth,height:this.el.clientHeight}),this.reformat()},EPUBJS.Renderer.prototype.reformat=function(){var a=this;a.book.settings.fixedLayout?a.fixedLayout():a.formatSpread(),setTimeout(function(){a.calcPages(),a.currentLocationCfi&&a.gotoCfiFragment(a.currentLocationCfi)},10)},EPUBJS.Renderer.prototype.destroy=function(){window.removeEventListener("resize",this.resized,!1)},EPUBJS.Renderer.prototype.resizeIframe=function(a,b,c){var d,e;a?(d=a.width,e=a.height):(d=b,e=c),this.iframe.height=e,0!=d%2&&(d+=1),this.iframe.width=d},EPUBJS.Renderer.prototype.crossBrowserColumnCss=function(){EPUBJS.Renderer.columnAxis=EPUBJS.core.prefixed("columnAxis"),EPUBJS.Renderer.columnGap=EPUBJS.core.prefixed("columnGap"),EPUBJS.Renderer.columnWidth=EPUBJS.core.prefixed("columnWidth"),EPUBJS.Renderer.transform=EPUBJS.core.prefixed("transform")},EPUBJS.Renderer.prototype.setIframeSrc=function(a){var b=this,c=new RSVP.Promise;return this.visible(!1),this.iframe.src=a,this.iframe.onload=function(){b.doc=b.iframe.contentDocument,b.docEl=b.doc.documentElement,b.bodyEl=b.doc.body,b.applyStyles(),b.book.settings.fixedLayout?b.fixedLayout():b.formatSpread(),b.beforeDisplay(function(){b.calcPages(),c.resolve(b),b.currentLocationCfi=b.getPageCfi(),b.trigger("book:chapterDisplayed"),b.visible(!0)})},c},EPUBJS.Renderer.prototype.formatSpread=function(){var a=2,b=800;this.colWidth&&(this.OldcolWidth=this.colWidth,this.OldspreadWidth=this.spreadWidth),this.elWidth=this.iframe.width,this.gap=this.gap||Math.ceil(this.elWidth/8),this.elWidth1?(this.chapterPos--,this.leftPos-=this.spreadWidth,this.setLeft(this.leftPos),this.currentLocationCfi=this.getPageCfi(),this.trigger("book:pageChanged",this.currentLocationCfi),this.chapterPos):!1},EPUBJS.Renderer.prototype.chapterEnd=function(){this.page(this.displayedPages),this.currentLocationCfi=this.getPageCfi()},EPUBJS.Renderer.prototype.setLeft=function(a){this.doc.defaultView.scrollTo(a,0)},EPUBJS.Renderer.prototype.replace=function(a,b,c){var d,e,f;d=this.doc.querySelectorAll(a),e=Array.prototype.slice.call(d),f=e.length,e.forEach(function(a){b(a,function(){f--,0>=f&&c&&c()})}.bind(this)),0===f&&c()},EPUBJS.Renderer.prototype.determineStore=function(){return this.book.fromStorage?"filesystem"==this.book.storage.getStorageType()?!1:this.book.store:this.book.contained?this.book.zip:!1},EPUBJS.Renderer.prototype.replaceHead=function(a){var b,c,d,e,f={},g=this,h=this.determineStore(),i=function(a,b){a.setAttribute("href",b),a.onload=function(){d--,0>=d&&j()}},j=function(){a&&a(),_.each(e,function(a){h.revokeUrl(a)}),g.urlCache=f};return h?(b=this.doc.head.querySelectorAll("[href]"),c=Array.prototype.slice.call(b),d=c.length,this.urlCache||(this.urlCache={}),e=_.clone(this.urlCache),c.forEach(function(a){var b=a.getAttribute("href"),c=this.book.settings.contentsPath+b;c in e?(i(a,e[c]),f[c]=e[c],delete e[c]):"stylesheet"===a.getAttribute("rel")?h.getText(c).then(function(b){g.replaceUrlsInCss(c,b).then(function(b){var d=window.URL||window.webkitURL||window.mozURL,e=new Blob([b],{type:"text/css"}),g=d.createObjectURL(e);i(a,g),f[c]=g},function(a){console.error(a)})}):h.getUrl(c).then(function(b){i(a,b),f[c]=b})}.bind(this)),0===d&&j(),void 0):(a&&a(),!1)},EPUBJS.Renderer.prototype.replaceUrlsInCss=function(a,b){var c=new RSVP.Promise,d=[],e=this.determineStore(),f=b.match(/url\(\'?\"?([^\'|^\"]*)\'?\"?\)/g);return f?(f.forEach(function(c){var f=EPUBJS.core.resolveUrl(a,c.replace(/url\(|[|\)|\'|\"]/g,""));replaced=e.getUrl(f).then(function(a){b=b.replace(c,'url("'+a+'")')},function(a){console.error(a)}),d.push(replaced)}),RSVP.all(d).then(function(){c.resolve(b)}),c):(c.resolve(b),c)},EPUBJS.Renderer.prototype.replaceLinks=function(a){var b=this.doc.querySelectorAll("a"),c=Array.prototype.slice.call(b),d=this;c.forEach(function(a){var b,c,e=a.getAttribute("href");e&&(b=e.search("://"),c="#"==e[0],-1!=b?a.setAttribute("target","_blank"):a.onclick=function(){return d.book.goto(e),!1})}),a&&a()},EPUBJS.Renderer.prototype.replaceResources=function(a){var b,c,d,e=this.determineStore();return e?(b=this.doc.querySelectorAll("[src]"),c=Array.prototype.slice.call(b),d=c.length,c.forEach(function(b){var c=b.getAttribute("src"),f=this.book.settings.contentsPath+c;e.getUrl(f).then(function(c){b.src=c,b.onload=function(){d--,0>=d&&a&&a()}})}.bind(this)),0===d&&a(),void 0):(a&&a(),!1)},EPUBJS.Renderer.prototype.page=function(a){return a>=1&&a<=this.displayedPages?(this.chapterPos=a,this.leftPos=this.spreadWidth*(a-1),this.setLeft(this.leftPos),!0):!1},EPUBJS.Renderer.prototype.section=function(a){var b=this.doc.getElementById(a);b&&this.pageByElement(b)},EPUBJS.Renderer.prototype.pageByElement=function(a){var b,c;a&&(b=this.leftPos+a.getBoundingClientRect().left,c=Math.floor(b/this.spreadWidth)+1,this.page(c))},EPUBJS.Renderer.prototype.beforeDisplay=function(a){this.book.triggerHooks("beforeChapterDisplay",a.bind(this),this)},EPUBJS.Renderer.prototype.walk=function(a){for(var b,a,c,d,e,f=a,g=[f],h=1e4,i=0;!b&&g.length;){if(a=g.shift(),this.isElementVisible(a)&&(b=a),!b&&a&&a.childElementCount>0){c=a.children,d=c.length;for(var j=0;d>j;j++)c[j]!=e&&g.push(c[j])}if(!b&&0==g.length&&f&&null!==f.parentNode&&(g.push(f.parentNode),e=f,f=f.parentNode),i++,i>h){console.error("ENDLESS LOOP");break}}return b},EPUBJS.Renderer.prototype.getPageCfi=function(){var a=this.visibileEl;return this.visibileEl=this.findFirstVisible(a),this.visibileEl.id||(this.visibileEl.id="EPUBJS-PAGE-"+this.chapterPos),this.pageIds[this.chapterPos]=this.visibileEl.id,this.epubcfi.generateFragment(this.visibileEl,this.currentChapterCfi)},EPUBJS.Renderer.prototype.gotoCfiFragment=function(a){var b;_.isString(a)&&(a=this.epubcfi.parse(a)),b=this.epubcfi.getElement(a,this.doc),this.pageByElement(b)},EPUBJS.Renderer.prototype.findFirstVisible=function(a){var b,c=a||this.bodyEl;return b=this.walk(c),b?b:a},EPUBJS.Renderer.prototype.isElementVisible=function(a){var b;return a&&"function"==typeof a.getBoundingClientRect&&(b=a.getBoundingClientRect().left,b>=0&&be;e++)if(b.call(d,a[e],e,a)===c)return}else for(var g in a)if(x.has(a,g)&&b.call(d,a[g],g,a)===c)return};x.map=x.collect=function(a,b,c){var d=[];return null==a?d:m&&a.map===m?a.map(b,c):(y(a,function(a,e,f){d[d.length]=b.call(c,a,e,f)}),d)};var z="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),n&&a.reduce===n)return d&&(b=x.bind(b,d)),e?a.reduce(b,c):a.reduce(b);if(y(a,function(a,f,g){e?c=b.call(d,c,a,f,g):(c=a,e=!0)}),!e)throw new TypeError(z);return c},x.reduceRight=x.foldr=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),o&&a.reduceRight===o)return d&&(b=x.bind(b,d)),e?a.reduceRight(b,c):a.reduceRight(b);var f=a.length;if(f!==+f){var g=x.keys(a);f=g.length}if(y(a,function(h,i,j){i=g?g[--f]:--f,e?c=b.call(d,c,a[i],i,j):(c=a[i],e=!0)}),!e)throw new TypeError(z);return c},x.find=x.detect=function(a,b,c){var d;return A(a,function(a,e,f){return b.call(c,a,e,f)?(d=a,!0):void 0}),d},x.filter=x.select=function(a,b,c){var d=[];return null==a?d:p&&a.filter===p?a.filter(b,c):(y(a,function(a,e,f){b.call(c,a,e,f)&&(d[d.length]=a)}),d)},x.reject=function(a,b,c){return x.filter(a,function(a,d,e){return!b.call(c,a,d,e)},c)},x.every=x.all=function(a,b,d){b||(b=x.identity);var e=!0;return null==a?e:q&&a.every===q?a.every(b,d):(y(a,function(a,f,g){return(e=e&&b.call(d,a,f,g))?void 0:c}),!!e)};var A=x.some=x.any=function(a,b,d){b||(b=x.identity);var e=!1;return null==a?e:r&&a.some===r?a.some(b,d):(y(a,function(a,f,g){return e||(e=b.call(d,a,f,g))?c:void 0}),!!e)};x.contains=x.include=function(a,b){return null==a?!1:s&&a.indexOf===s?-1!=a.indexOf(b):A(a,function(a){return a===b})},x.invoke=function(a,b){var c=h.call(arguments,2),d=x.isFunction(b);return x.map(a,function(a){return(d?b:a[b]).apply(a,c)})},x.pluck=function(a,b){return x.map(a,function(a){return a[b]})},x.where=function(a,b,c){return x.isEmpty(b)?c?null:[]:x[c?"find":"filter"](a,function(a){for(var c in b)if(b[c]!==a[c])return!1;return!0})},x.findWhere=function(a,b){return x.where(a,b,!0)},x.max=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&65535>a.length)return Math.max.apply(Math,a);if(!b&&x.isEmpty(a))return-1/0;var d={computed:-1/0,value:-1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g>=d.computed&&(d={value:a,computed:g})}),d.value},x.min=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&65535>a.length)return Math.min.apply(Math,a);if(!b&&x.isEmpty(a))return 1/0;var d={computed:1/0,value:1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;d.computed>g&&(d={value:a,computed:g})}),d.value},x.shuffle=function(a){var b,c=0,d=[];return y(a,function(a){b=x.random(c++),d[c-1]=d[b],d[b]=a}),d};var B=function(a){return x.isFunction(a)?a:function(b){return b[a]}};x.sortBy=function(a,b,c){var d=B(b);return x.pluck(x.map(a,function(a,b,e){return{value:a,index:b,criteria:d.call(c,a,b,e)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;if(c!==d){if(c>d||void 0===c)return 1;if(d>c||void 0===d)return-1}return a.indexf;){var h=f+g>>>1;e>c.call(d,a[h])?f=h+1:g=h}return f},x.toArray=function(a){return a?x.isArray(a)?h.call(a):a.length===+a.length?x.map(a,x.identity):x.values(a):[]},x.size=function(a){return null==a?0:a.length===+a.length?a.length:x.keys(a).length},x.first=x.head=x.take=function(a,b,c){return null==a?void 0:null==b||c?a[0]:h.call(a,0,b)},x.initial=function(a,b,c){return h.call(a,0,a.length-(null==b||c?1:b))},x.last=function(a,b,c){return null==a?void 0:null==b||c?a[a.length-1]:h.call(a,Math.max(a.length-b,0))},x.rest=x.tail=x.drop=function(a,b,c){return h.call(a,null==b||c?1:b)},x.compact=function(a){return x.filter(a,x.identity)};var D=function(a,b,c){return y(a,function(a){x.isArray(a)?b?g.apply(c,a):D(a,b,c):c.push(a)}),c};x.flatten=function(a,b){return D(a,b,[])},x.without=function(a){return x.difference(a,h.call(arguments,1))},x.uniq=x.unique=function(a,b,c,d){x.isFunction(b)&&(d=c,c=b,b=!1);var e=c?x.map(a,c,d):a,f=[],g=[];return y(e,function(c,d){(b?d&&g[g.length-1]===c:x.contains(g,c))||(g.push(c),f.push(a[d]))}),f},x.union=function(){return x.uniq(i.apply(d,arguments))},x.intersection=function(a){var b=h.call(arguments,1);return x.filter(x.uniq(a),function(a){return x.every(b,function(b){return x.indexOf(b,a)>=0})})},x.difference=function(a){var b=i.apply(d,h.call(arguments,1));return x.filter(a,function(a){return!x.contains(b,a)})},x.zip=function(){for(var a=h.call(arguments),b=x.max(x.pluck(a,"length")),c=Array(b),d=0;b>d;d++)c[d]=x.pluck(a,""+d);return c},x.object=function(a,b){if(null==a)return{};for(var c={},d=0,e=a.length;e>d;d++)b?c[a[d]]=b[d]:c[a[d][0]]=a[d][1];return c},x.indexOf=function(a,b,c){if(null==a)return-1;var d=0,e=a.length;if(c){if("number"!=typeof c)return d=x.sortedIndex(a,b),a[d]===b?d:-1;d=0>c?Math.max(0,e+c):c}if(s&&a.indexOf===s)return a.indexOf(b,c);for(;e>d;d++)if(a[d]===b)return d;return-1},x.lastIndexOf=function(a,b,c){if(null==a)return-1;var d=null!=c;if(t&&a.lastIndexOf===t)return d?a.lastIndexOf(b,c):a.lastIndexOf(b);for(var e=d?c:a.length;e--;)if(a[e]===b)return e;return-1},x.range=function(a,b,c){1>=arguments.length&&(b=a||0,a=0),c=arguments[2]||1;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=Array(d);d>e;)f[e++]=a,a+=c;return f},x.bind=function(a,b){if(a.bind===w&&w)return w.apply(a,h.call(arguments,1));var c=h.call(arguments,2);return function(){return a.apply(b,c.concat(h.call(arguments)))}},x.partial=function(a){var b=h.call(arguments,1);return function(){return a.apply(this,b.concat(h.call(arguments)))}},x.bindAll=function(a){var b=h.call(arguments,1);return 0===b.length&&(b=x.functions(a)),y(b,function(b){a[b]=x.bind(a[b],a)}),a},x.memoize=function(a,b){var c={};return b||(b=x.identity),function(){var d=b.apply(this,arguments);return x.has(c,d)?c[d]:c[d]=a.apply(this,arguments)}},x.delay=function(a,b){var c=h.call(arguments,2);return setTimeout(function(){return a.apply(null,c)},b)},x.defer=function(a){return x.delay.apply(x,[a,1].concat(h.call(arguments,1)))},x.throttle=function(a,b){var c,d,e,f,g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)};return function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},x.debounce=function(a,b,c){var d,e;return function(){var f=this,g=arguments,h=function(){d=null,c||(e=a.apply(f,g))},i=c&&!d;return clearTimeout(d),d=setTimeout(h,b),i&&(e=a.apply(f,g)),e}},x.once=function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}},x.wrap=function(a,b){return function(){var c=[a];return g.apply(c,arguments),b.apply(this,c)}},x.compose=function(){var a=arguments;return function(){for(var b=arguments,c=a.length-1;c>=0;c--)b=[a[c].apply(this,b)];return b[0]}},x.after=function(a,b){return 0>=a?b():function(){return 1>--a?b.apply(this,arguments):void 0}},x.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[];for(var c in a)x.has(a,c)&&(b[b.length]=c);return b},x.values=function(a){var b=[];for(var c in a)x.has(a,c)&&b.push(a[c]);return b},x.pairs=function(a){var b=[];for(var c in a)x.has(a,c)&&b.push([c,a[c]]);return b},x.invert=function(a){var b={};for(var c in a)x.has(a,c)&&(b[a[c]]=c);return b},x.functions=x.methods=function(a){var b=[];for(var c in a)x.isFunction(a[c])&&b.push(c);return b.sort()},x.extend=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)a[c]=b[c]}),a},x.pick=function(a){var b={},c=i.apply(d,h.call(arguments,1));return y(c,function(c){c in a&&(b[c]=a[c])}),b},x.omit=function(a){var b={},c=i.apply(d,h.call(arguments,1));for(var e in a)x.contains(c,e)||(b[e]=a[e]);return b},x.defaults=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)null==a[c]&&(a[c]=b[c])}),a},x.clone=function(a){return x.isObject(a)?x.isArray(a)?a.slice():x.extend({},a):a},x.tap=function(a,b){return b(a),a};var E=function(a,b,c,d){if(a===b)return 0!==a||1/a==1/b;if(null==a||null==b)return a===b;a instanceof x&&(a=a._wrapped),b instanceof x&&(b=b._wrapped);var e=j.call(a);if(e!=j.call(b))return!1;switch(e){case"[object String]":return a==b+"";case"[object Number]":return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return!1;for(var f=c.length;f--;)if(c[f]==a)return d[f]==b;c.push(a),d.push(b);var g=0,h=!0;if("[object Array]"==e){if(g=a.length,h=g==b.length)for(;g--&&(h=E(a[g],b[g],c,d)););}else{var i=a.constructor,k=b.constructor;if(i!==k&&!(x.isFunction(i)&&i instanceof i&&x.isFunction(k)&&k instanceof k))return!1;for(var l in a)if(x.has(a,l)&&(g++,!(h=x.has(b,l)&&E(a[l],b[l],c,d))))break;if(h){for(l in b)if(x.has(b,l)&&!g--)break;h=!g}}return c.pop(),d.pop(),h};x.isEqual=function(a,b){return E(a,b,[],[])},x.isEmpty=function(a){if(null==a)return!0;if(x.isArray(a)||x.isString(a))return 0===a.length;for(var b in a)if(x.has(a,b))return!1;return!0},x.isElement=function(a){return!(!a||1!==a.nodeType)},x.isArray=u||function(a){return"[object Array]"==j.call(a)},x.isObject=function(a){return a===Object(a)},y(["Arguments","Function","String","Number","Date","RegExp"],function(a){x["is"+a]=function(b){return j.call(b)=="[object "+a+"]"}}),x.isArguments(arguments)||(x.isArguments=function(a){return!(!a||!x.has(a,"callee"))}),"function"!=typeof/./&&(x.isFunction=function(a){return"function"==typeof a}),x.isFinite=function(a){return isFinite(a)&&!isNaN(parseFloat(a))},x.isNaN=function(a){return x.isNumber(a)&&a!=+a},x.isBoolean=function(a){return a===!0||a===!1||"[object Boolean]"==j.call(a)},x.isNull=function(a){return null===a},x.isUndefined=function(a){return void 0===a},x.has=function(a,b){return k.call(a,b)},x.noConflict=function(){return a._=b,this},x.identity=function(a){return a},x.times=function(a,b,c){for(var d=Array(a),e=0;a>e;e++)d[e]=b.call(c,e);return d},x.random=function(a,b){return null==b&&(b=a,a=0),a+Math.floor(Math.random()*(b-a+1))};var F={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};F.unescape=x.invert(F.escape);var G={escape:RegExp("["+x.keys(F.escape).join("")+"]","g"),unescape:RegExp("("+x.keys(F.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(a){x[a]=function(b){return null==b?"":(""+b).replace(G[a],function(b){return F[a][b]})}}),x.result=function(a,b){if(null==a)return null;var c=a[b];return x.isFunction(c)?c.call(a):c},x.mixin=function(a){y(x.functions(a),function(b){var c=x[b]=a[b];x.prototype[b]=function(){var a=[this._wrapped];return g.apply(a,arguments),L.call(this,c.apply(x,a))}})};var H=0;x.uniqueId=function(a){var b=++H+"";return a?a+b:b},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var I=/(.)^/,J={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},K=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(a,b,c){var d;c=x.defaults({},c,x.templateSettings);var e=RegExp([(c.escape||I).source,(c.interpolate||I).source,(c.evaluate||I).source].join("|")+"|$","g"),f=0,g="__p+='";a.replace(e,function(b,c,d,e,h){return g+=a.slice(f,h).replace(K,function(a){return"\\"+J[a]}),c&&(g+="'+\n((__t=("+c+"))==null?'':_.escape(__t))+\n'"),d&&(g+="'+\n((__t=("+d+"))==null?'':__t)+\n'"),e&&(g+="';\n"+e+"\n__p+='"),f=h+b.length,b}),g+="';\n",c.variable||(g="with(obj||{}){\n"+g+"}\n"),g="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+g+"return __p;\n";try{d=Function(c.variable||"obj","_",g)}catch(h){throw h.source=g,h}if(b)return d(b,x);var i=function(a){return d.call(this,a,x)};return i.source="function("+(c.variable||"obj")+"){\n"+g+"}",i},x.chain=function(a){return x(a).chain()};var L=function(a){return this._chain?x(a).chain():a};x.mixin(x),y(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=d[a];x.prototype[a]=function(){var c=this._wrapped;return b.apply(c,arguments),"shift"!=a&&"splice"!=a||0!==c.length||delete c[0],L.call(this,c)}}),y(["concat","join","slice"],function(a){var b=d[a];x.prototype[a]=function(){return L.call(this,b.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}.call(this),function(a){"use strict";function b(a,b){f.async(function(){a.trigger("promise:resolved",{detail:b}),a.isResolved=!0,a.resolvedValue=b})}function c(a,b){f.async(function(){a.trigger("promise:failed",{detail:b}),a.isRejected=!0,a.rejectedValue=b})}function d(a){var b,c=[],d=new p,e=a.length;0===e&&d.resolve([]);var f=function(a){return function(b){g(a,b)}},g=function(a,b){c[a]=b,0===--e&&d.resolve(c)},h=function(a){d.reject(a)};for(b=0;e>b;b++)a[b].then(f(b),h);return d}function e(a,b){f[a]=b}var f={},g="undefined"!=typeof window?window:{},h=g.MutationObserver||g.WebKitMutationObserver;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))f.async=function(a,b){process.nextTick(function(){a.call(b)})};else if(h){var i=[],j=new h(function(){var a=i.slice();i=[],a.forEach(function(a){var b=a[0],c=a[1];b.call(c)})}),k=document.createElement("div");j.observe(k,{attributes:!0}),window.addEventListener("unload",function(){j.disconnect(),j=null}),f.async=function(a,b){i.push([a,b]),k.setAttribute("drainQueue","drainQueue")}}else f.async=function(a,b){setTimeout(function(){a.call(b)},1)};var l=function(a,b){this.type=a;for(var c in b)b.hasOwnProperty(c)&&(this[c]=b[c])},m=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c][0]===b)return c;return-1},n=function(a){var b=a._promiseCallbacks;return b||(b=a._promiseCallbacks={}),b},o={mixin:function(a){return a.on=this.on,a.off=this.off,a.trigger=this.trigger,a},on:function(a,b,c){var d,e,f=n(this);for(a=a.split(/\s+/),c=c||this;e=a.shift();)d=f[e],d||(d=f[e]=[]),-1===m(d,b)&&d.push([b,c])},off:function(a,b){var c,d,e,f=n(this);for(a=a.split(/\s+/);d=a.shift();)b?(c=f[d],e=m(c,b),-1!==e&&c.splice(e,1)):f[d]=[]},trigger:function(a,b){var c,d,e,f,g,h=n(this);if(c=h[a])for(var i=0,j=c.length;j>i;i++)d=c[i],e=d[0],f=d[1],"object"!=typeof b&&(b={detail:b}),g=new l(a,b),e.call(f,g)}},p=function(){this.on("promise:resolved",function(a){this.trigger("success",{detail:a.detail})},this),this.on("promise:failed",function(a){this.trigger("error",{detail:a.detail})},this)},q=function(){},r=function(a,b,c,d){var e,f,g,h,i="function"==typeof c;if(i)try{e=c(d.detail),g=!0}catch(j){h=!0,f=j}else e=d.detail,g=!0;e&&"function"==typeof e.then?e.then(function(a){b.resolve(a)},function(a){b.reject(a)}):i&&g?b.resolve(e):h?b.reject(f):b[a](e)};p.prototype={then:function(a,b){var c=new p;return this.isResolved&&f.async(function(){r("resolve",c,a,{detail:this.resolvedValue})},this),this.isRejected&&f.async(function(){r("reject",c,b,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(b){r("resolve",c,a,b)}),this.on("promise:failed",function(a){r("reject",c,b,a)}),c},resolve:function(a){b(this,a),this.resolve=q,this.reject=q},reject:function(a){c(this,a),this.resolve=q,this.reject=q}},o.mixin(p.prototype),a.Promise=p,a.Event=l,a.EventTarget=o,a.all=d,a.configure=e}(window.RSVP={});var EPUBJS=EPUBJS||{};EPUBJS.VERSION="0.1.5",EPUBJS.plugins=EPUBJS.plugins||{},EPUBJS.filePath=EPUBJS.filePath||"/epubjs/",EPUBJS.Book=function(a,b){this.settings=_.defaults(b||{},{element:!1,storage:!1,fromStorage:!1,saved:!1,online:!0,contained:!1,width:!1,height:!1,spreads:!0,responsive:!0,version:1,restore:!0}),this.settings.EPUBJSVERSION=EPUBJS.VERSION,this.spinePos=0,this.stored=!1,this.hooks={beforeChapterDisplay:[]},this.getHooks(),this.online=this.settings.online||navigator.onLine,this.networkListeners(),0!=this.settings.storage&&(this.storage=new fileStorage.storage(this.settings.storage)),this.ready={manifest:new RSVP.Promise,spine:new RSVP.Promise,metadata:new RSVP.Promise,cover:new RSVP.Promise,toc:new RSVP.Promise},this.ready.all=RSVP.all(_.values(this.ready)),a&&(this.opened=this.open(a)),a&&this.settings.element&&this.opened.then(function(){this.rendered=this.renderTo(el)})},EPUBJS.Book.prototype.open=function(a,b){var c,d=this,e=this.isSaved(a);return this.settings.bookPath=a,this.bookUrl=this.urlFrom(a),e&&!b&&this.applySavedSettings(),this.settings.contained||this.isContained(a)?(this.settings.contained=this.contained=!0,this.bookUrl="",c=this.unarchive(a).then(function(){return e&&d.settings.restore&&!b?d.restore():d.unpack()})):c=e&&this.settings.restore&&!b?this.restore():this.unpack(),this.online&&this.settings.storage&&!this.settings.contained&&(this.settings.stored||c.then(d.storeOffline())),c},EPUBJS.Book.prototype.unpack=function(a){var b=this,c=new EPUBJS.Parser,a=a||"META-INF/container.xml";return b.loadXml(b.bookUrl+a).then(function(a){return c.container(a)}).then(function(a){return b.settings.contentsPath=b.bookUrl+a.basePath,b.settings.packageUrl=b.bookUrl+a.packagePath,b.loadXml(b.settings.packageUrl)}).then(function(a){return c.package(a,b.settings.contentsPath)}).then(function(a){return b.contents=a,b.manifest=b.contents.manifest,b.spine=b.contents.spine,b.spineIndexByURL=b.contents.spineIndexByURL,b.metadata=b.contents.metadata,b.cover=b.contents.cover=b.settings.contentsPath+a.coverPath,b.spineNodeIndex=b.contents.spineNodeIndex=a.spineNodeIndex,b.ready.manifest.resolve(b.contents.manifest),b.ready.spine.resolve(b.contents.spine),b.ready.metadata.resolve(b.contents.metadata),b.ready.cover.resolve(b.contents.cover),b.settings.tocUrl=b.settings.contentsPath+a.tocPath,b.loadXml(b.settings.tocUrl)}).then(function(a){return c.toc(a)}).then(function(a){b.toc=b.contents.toc=a,b.ready.toc.resolve(b.contents.toc)}).then(null,function(a){console.error(a)})},EPUBJS.Book.prototype.getMetadata=function(){return this.ready.metadata},EPUBJS.Book.prototype.getToc=function(){return this.ready.toc},EPUBJS.Book.prototype.networkListeners=function(){var a=this;window.addEventListener("offline",function(){a.online=!1,a.trigger("book:offline")},!1),window.addEventListener("online",function(){a.online=!0,a.trigger("book:online")},!1),window.addEventListener("beforeunload",function(){a.saveSettings(),a.settings.restore&&a.saveContents(),a.trigger("book:unload")},!1)},EPUBJS.Book.prototype.loadXml=function(a){return this.settings.fromStorage?this.storage.getXml(a):this.settings.contained?this.zip.getXml(a):EPUBJS.core.request(a,"xml")},EPUBJS.Book.prototype.urlFrom=function(a){var b=-1!=a.search("://"),c="/"==a[0],d=window.location,e=d.origin||d.protocol+"//"+d.host;return b?a:!b&&c?e+a:b||c?void 0:e+EPUBJS.core.folder(d.pathname)+a},EPUBJS.Book.prototype.unarchive=function(a){return this.zip=new EPUBJS.Unarchiver,this.zip.openZip(a)},EPUBJS.Book.prototype.isContained=function(a){var b=a.lastIndexOf("."),c=a.slice(b+1);return!c||"epub"!=c&&"zip"!=c?!1:!0},EPUBJS.Book.prototype.isSaved=function(a){var b=a+":"+this.settings.version,c=localStorage.getItem(b);return localStorage&&null!==c?!0:!1},EPUBJS.Book.prototype.removeSavedSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;localStorage.removeItem(a),this.settings.stored=!1},EPUBJS.Book.prototype.applySavedSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;return stored=JSON.parse(localStorage.getItem(a)),EPUBJS.VERSION!=stored.EPUBJSVERSION?!1:(this.settings=_.defaults(this.settings,stored),void 0)},EPUBJS.Book.prototype.saveSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;this.render&&(this.settings.previousLocationCfi=this.render.currentLocationCfi),localStorage.setItem(a,JSON.stringify(this.settings))},EPUBJS.Book.prototype.saveContents=function(){var a=this.settings.bookPath+":contents:"+this.settings.version;localStorage.setItem(a,JSON.stringify(this.contents))},EPUBJS.Book.prototype.renderTo=function(a){var b=this;return this.settings.element=a,this.opened.then(function(){return b.render=new EPUBJS.Renderer(b),b.startDisplay()})},EPUBJS.Book.prototype.startDisplay=function(){var a;return a=this.settings.restore&&this.settings.previousLocationCfi?this.displayChapter(this.settings.previousLocationCfi):this.displayChapter(this.spinePos)},EPUBJS.Book.prototype.restore=function(){var a=this,b=this.settings.bookPath+":contents:"+this.settings.version,c=new RSVP.Promise,d=["manifest","spine","metadata","cover","toc","spineNodeIndex","spineIndexByURL"],e=!1,f=localStorage.getItem(b);return"undefined"!=f&&"null"!=f&&(this.contents=JSON.parse(f),d.forEach(function(b){a[b]=a.contents[b],a[b]||(e=!0)})),!e&&f&&this.contents&&this.settings.contentsPath?(this.ready.manifest.resolve(this.manifest),this.ready.spine.resolve(this.spine),this.ready.metadata.resolve(this.metadata),this.ready.cover.resolve(this.cover),this.ready.toc.resolve(this.toc),c.resolve(),c):this.open(this.settings.bookPath,!0)},EPUBJS.Book.prototype.displayChapter=function(a,b){var c,d,e,f=this;return _.isNumber(a)?e=a:(d=new EPUBJS.EpubCFI(a),e=d.spinePos),e>=this.spine.length?!1:0>e?!1:(this.spinePos=e,this.chapter=new EPUBJS.Chapter(this.spine[e]),c=f.render.chapter(this.chapter),d?c.then(function(b){b.currentLocationCfi=a,b.gotoCfiFragment(d)}):b&&c.then(function(a){a.gotoChapterEnd()}),this.settings.fromStorage||this.settings.contained||c.then(function(){f.preloadNextChapter()}),c)},EPUBJS.Book.prototype.nextPage=function(){var a=this.render.nextPage();return a?void 0:this.nextChapter()},EPUBJS.Book.prototype.prevPage=function(){var a=this.render.prevPage();return a?void 0:this.prevChapter()},EPUBJS.Book.prototype.nextChapter=function(){return this.spinePos++,this.displayChapter(this.spinePos)},EPUBJS.Book.prototype.prevChapter=function(){return this.spinePos--,this.displayChapter(this.spinePos,!0)},EPUBJS.Book.prototype.goto=function(a){var b,c=a.split("#"),d=c[0],e=c[1]||!1,f=-1==d.search("://")?this.settings.contentsPath+d:d,g=this.spineIndexByURL[f];return d||(g=this.chapter.spinePos),"number"!=typeof g?!1:g==this.chapter.spinePos&&this.chapter?(e&&this.render.section(e),(new RSVP.Promise).resolve(this.currentChapter)):this.displayChapter(g).then(function(){e&&b.render.section(e)})},EPUBJS.Book.prototype.preloadNextChapter=function(){return document.createElement("iframe"),this.spinePos>=this.spine.length?!1:(next=new EPUBJS.Chapter(this.spine[this.spinePos+1]),EPUBJS.core.request(next.href),void 0)},EPUBJS.Book.prototype.storeOffline=function(){var a=this,b=_.values(this.manifest);return EPUBJS.storage.batch(b).then(function(){a.settings.stored=!0,a.trigger("book:stored")})},EPUBJS.Book.prototype.availableOffline=function(){return this.settings.stored>0?!0:!1},EPUBJS.Book.prototype.setStyle=function(a,b,c){this.renderer.setStyle(a,b,c),this.settings.styles[a]=b},EPUBJS.Book.prototype.removeStyle=function(a){this.renderer.removeStyle(a),delete this.settings.styles[a]},EPUBJS.Book.prototype.getHooks=function(){var a,b=this;plugTypes=_.values(this.hooks);for(plugType in this.hooks)a=_.values(EPUBJS.Hooks[plugType]),a.forEach(function(a){b.registerHook(plugType,a)})},EPUBJS.Book.prototype.registerHook=function(a,b,c){var d=this;"undefined"!=typeof this.hooks[a]?"function"==typeof b?c?this.hooks[a].unshift(b):this.hooks[a].push(b):Array.isArray(b)&&b.forEach(function(b){c?d.hooks[a].unshift(b):d.hooks[a].push(b)}):this.hooks[a]=[func]},EPUBJS.Book.prototype.triggerHooks=function(a,b,c){function d(){f--,0>=f&&b&&b()}var e,f;return"undefined"==typeof this.hooks[a]?!1:(e=this.hooks[a],f=e.length,e.forEach(function(a){a(d,c)}),void 0)},RSVP.EventTarget.mixin(EPUBJS.Book.prototype),EPUBJS.Chapter=function(a){this.href=a.href,this.id=a.id,this.spinePos=a.index,this.properties=a.properties,this.linear=a.linear,this.pages=1},EPUBJS.Chapter.prototype.contents=function(a){return a?a.get(href):EPUBJS.core.request(href,"xml")},EPUBJS.Chapter.prototype.url=function(a){var b=new RSVP.Promise;return a?(this.tempUrl||(this.tempUrl=a.getUrl(this.href)),this.tempUrl):(b.resolve(this.href),b)},EPUBJS.Chapter.prototype.setPages=function(a){this.pages=a},EPUBJS.Chapter.prototype.getPages=function(){return this.pages},EPUBJS.Chapter.prototype.getID=function(){return this.ID},EPUBJS.Chapter.prototype.unload=function(a){this.tempUrl&&a&&(a.revokeUrl(this.tempUrl),this.tempUrl=!1)};var EPUBJS=EPUBJS||{};EPUBJS.core={},EPUBJS.core.getEl=function(a){return document.getElementById(a)},EPUBJS.core.getEls=function(a){return document.getElementsByClassName(a)},EPUBJS.core.request=function(a,b){function c(){if(this.readyState===this.DONE)if(200===this.status||this.responseXML){var a;a="xml"==b?this.responseXML:"json"==b?JSON.parse(this.response):this.response,d.resolve(a)}else d.reject(this)}var d=new RSVP.Promise,e=new XMLHttpRequest;return e.open("GET",a),e.onreadystatechange=c,"blob"==b&&(e.responseType=b),"json"==b&&e.setRequestHeader("Accept","application/json"),"xml"==b&&e.overrideMimeType("text/xml"),e.send(),d},EPUBJS.core.toArray=function(a){var b=[];for(member in a){var c;a.hasOwnProperty(member)&&(c=a[member],c.ident=member,b.push(c))}return b},EPUBJS.core.folder=function(a){var b=a.lastIndexOf("/"),c=a.slice(0,b+1);return-1==b&&(c=""),c},EPUBJS.core.dataURLToBlob=function(a){var b=";base64,";if(-1==a.indexOf(b)){var c=a.split(","),d=c[0].split(":")[1],e=c[1];return new Blob([e],{type:d})}for(var c=a.split(b),d=c[0].split(":")[1],e=window.atob(c[1]),f=e.length,g=new Uint8Array(f),h=0;f>h;++h)g[h]=e.charCodeAt(h);return new Blob([g],{type:d})},EPUBJS.core.addScript=function(a,b,c){var d,e;e=!1,d=document.createElement("script"),d.type="text/javascript",d.async=!1,d.src=a,d.onload=d.onreadystatechange=function(){e||this.readyState&&"complete"!=this.readyState||(e=!0,b&&b())},c=c||document.body,c.appendChild(d)},EPUBJS.core.addScripts=function(a,b,c){var d=a.length,e=0,f=function(){e++,d==e?b&&b():EPUBJS.core.loadScript(a[e],f,c)};EPUBJS.core.addScript(a[e],f,c)},EPUBJS.core.addCss=function(a,b,c){var d,e;e=!1,d=document.createElement("link"),d.type="text/css",d.rel="stylesheet",d.href=a,d.onload=d.onreadystatechange=function(){e||this.readyState&&"complete"!=this.readyState||(e=!0,b&&b())},c=c||document.body,c.appendChild(d)},EPUBJS.core.prefixed=function(a){var b=["Webkit","Moz","O","ms"],c=a[0].toUpperCase()+a.slice(1),d=b.length,e=0;if("undefined"!=typeof document.body.style[a])return a;for(;d>e;e++)if("undefined"!=typeof document.body.style[b[e]+c])return b[e]+c;return a},EPUBJS.core.resolveUrl=function(a,b){var c,d,e=[],f=a.split("/");return f.pop(),d=b.split("/"),d.forEach(function(a){".."===a?f.pop():e.push(a)}),c=f.concat(e),c.join("/")},EPUBJS.EpubCFI=function(a){return a?this.parse(a):void 0},EPUBJS.EpubCFI.prototype.generateChapter=function(a,b,c){var a=a+1,d="/"+a+"/";return d+=2*(b+1),c&&(d+="["+c+"]"),d+="!"},EPUBJS.EpubCFI.prototype.generateFragment=function(a,b){var c=this.pathTo(a),d=[];return b&&d.push(b),c.forEach(function(a){d.push(2*(a.index+1)),a.id&&"EPUBJS"!=a.id.slice(0,6)&&d.push("["+a.id+"]")}),d.join("/")},EPUBJS.EpubCFI.prototype.pathTo=function(a){for(var b,c=[];a&&null!==a.parentNode;)b=a.parentNode.children,c.unshift({id:a.id,tagName:a.tagName,index:b?Array.prototype.indexOf.call(b,a):0}),a=a.parentNode;return c},EPUBJS.EpubCFI.prototype.getChapter=function(a){var b=a.split("!");return b[0]},EPUBJS.EpubCFI.prototype.getFragment=function(a){var b=a.split("!");return b[1]},EPUBJS.EpubCFI.prototype.getOffset=function(a){var b=a.split(":");return[b[0],b[1]]},EPUBJS.EpubCFI.prototype.parse=function(a){var b,c,d,e,f={};return f.chapter=this.getChapter(a),f.fragment=this.getFragment(a),f.spinePos=parseInt(f.chapter.split("/")[2])/2-1||0,b=f.chapter.match(/\[(.*)\]/),f.spineId=b[1]||!1,c=f.fragment.split("/"),d=c[c.length-1],f.sections=[],parseInt(d)%2&&(e=this.getOffset(),f.text=parseInt(e[0]),f.character=parseInt(e[1]),c.pop()),c.forEach(function(a){var b,c,d;a&&(b=parseInt(a)/2-1,c=a.match(/\[(.*)\]/),c&&c[1]&&(d=c[1]),f.sections.push({index:b,id:d||!1}))}),f},EPUBJS.EpubCFI.prototype.getElement=function(a,b){var c,b=b||document,d=a.sections,e=b.getElementsByTagName("html")[0],f=Array.prototype.slice.call(e.children);for(d.shift();d.length>0;)c=d.shift(),c.id?e=b.querySelector("#"+c.id):(e=f[c.index],f||console.error("No Kids",e)),e||console.error("No Element For",c),f=Array.prototype.slice.call(e.children);return e},EPUBJS.Events=function(a,b){return this.events={},this.el=b?b:document.createElement("div"),a.createEvent=this.createEvent,a.tell=this.tell,a.listen=this.listen,a.deafen=this.deafen,a.listenUntil=this.listenUntil,this},EPUBJS.Events.prototype.createEvent=function(a){var b=new CustomEvent(a);return this.events[a]=b,b},EPUBJS.Events.prototype.tell=function(a,b){var c;this.events[a]?c=this.events[a]:(console.warn("No event:",a,"defined yet, creating."),c=this.createEvent(a)),b&&(c.msg=b),this.el.dispatchEvent(c)},EPUBJS.Events.prototype.listen=function(a,b,c){return this.events[a]?(c?this.el.addEventListener(a,b.bind(c),!1):this.el.addEventListener(a,b,!1),void 0):(console.warn("No event:",a,"defined yet, creating."),this.createEvent(a),void 0)},EPUBJS.Events.prototype.deafen=function(a,b){this.el.removeEventListener(a,b,!1)},EPUBJS.Events.prototype.listenUntil=function(a,b,c,d){function e(){this.deafen(a,c),this.deafen(b,e)}this.listen(a,c,d),this.listen(b,e,this)},EPUBJS.Hooks=function(){"use strict";return{register:function(a){if(void 0===this[a]&&(this[a]={}),"object"!=typeof this[a])throw"Already registered: "+a;return this[a]}}}(),EPUBJS.Parser=function(a){this.baseUrl=a||""},EPUBJS.Parser.prototype.container=function(a){var b=a.querySelector("rootfile"),c=b.getAttribute("full-path"),d=EPUBJS.core.folder(c);return{packagePath:c,basePath:d}},EPUBJS.Parser.prototype.package=function(a,b){var c=this;b&&(this.baseUrl=b);var d=a.querySelector("metadata"),e=a.querySelector("manifest"),f=a.querySelector("spine"),g=c.manifest(e),h=c.findTocPath(e),i=c.findCoverPath(e),j=Array.prototype.indexOf.call(f.parentNode.childNodes,f),k=c.spine(f,g),l={};return k.forEach(function(a){l[a.href]=a.index}),{metadata:c.metadata(d),spine:k,manifest:g,tocPath:h,coverPath:i,spineNodeIndex:j,spineIndexByURL:l}},EPUBJS.Parser.prototype.findTocPath=function(a){var b=a.querySelector("item[media-type='application/x-dtbncx+xml']");return b?b.getAttribute("href"):!1},EPUBJS.Parser.prototype.findCoverPath=function(a){var b=a.querySelector("item[properties='cover-image']");return b?b.getAttribute("href"):!1},EPUBJS.Parser.prototype.metadata=function(a){var b={},c=this;return b.bookTitle=c.getElementText(a,"title"),b.creator=c.getElementText(a,"creator"),b.description=c.getElementText(a,"description"),b.pubdate=c.getElementText(a,"date"),b.publisher=c.getElementText(a,"publisher"),b.identifier=c.getElementText(a,"identifier"),b.language=c.getElementText(a,"language"),b.rights=c.getElementText(a,"rights"),b.modified_date=c.querySelectorText(a,"meta[property='dcterms:modified']"),b.layout=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.orientation=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.spread=c.querySelectorText(a,"meta[property='rendition:spread']"),b -},EPUBJS.Parser.prototype.getElementText=function(a,b){var c,d=a.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",b);return d&&0!=d.length?(c=d[0],c.childNodes.length?c.childNodes[0].nodeValue:""):""},EPUBJS.Parser.prototype.querySelectorText=function(a,b){var c=a.querySelector(b);return c&&c.childNodes.length?c.childNodes[0].nodeValue:""},EPUBJS.Parser.prototype.manifest=function(a){var b=this.baseUrl,c={},d=a.querySelectorAll("item"),e=Array.prototype.slice.call(d);return e.forEach(function(a){var d=a.getAttribute("id"),e=a.getAttribute("href")||"",f=a.getAttribute("media-type")||"";c[d]={href:b+e,type:f}}),c},EPUBJS.Parser.prototype.spine=function(a,b){var c=[],d=a.getElementsByTagName("itemref"),e=Array.prototype.slice.call(d);return e.forEach(function(a,d){var e=a.getAttribute("idref"),f={id:e,linear:a.getAttribute("linear")||"",properties:a.getAttribute("properties")||"",href:b[e].href,index:d};c.push(f)}),c},EPUBJS.Parser.prototype.toc=function(a){function b(a){var c,d=[],e=[],f=a.childNodes,g=Array.prototype.slice.call(f),h=g.length,i=h;if(0==h)return!1;for(;i--;)c=g[i],"navPoint"===c.nodeName&&e.push(c);return e.forEach(function(a){var c=a.getAttribute("id"),e=a.querySelector("content"),f=e.getAttribute("src"),g=(f.split("#"),a.querySelector("navLabel")),h=g.textContent?g.textContent:"",i=b(a);d.unshift({id:c,href:f,label:h,subitems:i})}),d}var c=a.querySelector("navMap");return b(c)},EPUBJS.Renderer=function(a){var b=a.settings.element;if(this.book=a,this.settings=a.settings,_.isElement(b))this.el=b;else{if("string"!=typeof b)return console.error("Not an Element"),void 0;this.el=EPUBJS.core.getEl(b)}a.registerHook("beforeChapterDisplay",[this.replaceLinks.bind(this),this.replaceResources.bind(this),this.replaceHead.bind(this)],!0),this.crossBrowserColumnCss(),this.epubcfi=new EPUBJS.EpubCFI,this.initialize(),this.listeners()},EPUBJS.Renderer.prototype.initialize=function(){this.iframe=document.createElement("iframe"),this.resizeIframe(!1,this.el.clientWidth,this.el.clientHeight),this.on("book:resized",this.resizeIframe,this),this.el.appendChild(this.iframe)},EPUBJS.Renderer.prototype.listeners=function(){this.resized=_.debounce(this.onResized.bind(this),10),window.addEventListener("resize",this.resized,!1)},EPUBJS.Renderer.prototype.chapter=function(a){var b=this,c=!1;return this.book.settings.contained&&(c=this.book.zip),this.currentChapter&&(this.currentChapter.unload(),this.trigger("book:chapterDestroyed")),this.currentChapter=a,this.chapterPos=1,this.pageIds={},this.leftPos=0,this.currentChapterCfi=this.epubcfi.generateChapter(this.book.spineNodeIndex,a.spinePos,a.id),this.visibileEl=!1,a.url(c).then(function(a){return b.setIframeSrc(a)})},EPUBJS.Renderer.prototype.onResized=function(){this.trigger("book:resized",{width:this.el.clientWidth,height:this.el.clientHeight}),this.reformat()},EPUBJS.Renderer.prototype.reformat=function(){var a=this;this.formatSpread(),setTimeout(function(){a.calcPages(),a.currentLocationCfi&&a.gotoCfiFragment(a.currentLocationCfi)},10)},EPUBJS.Renderer.prototype.destroy=function(){window.removeEventListener("resize",this.resized,!1)},EPUBJS.Renderer.prototype.resizeIframe=function(a,b,c){var d,e;a?(d=a.width,e=a.height):(d=b,e=c),this.iframe.height=e,0!=d%2&&(d+=1),this.iframe.width=d},EPUBJS.Renderer.prototype.crossBrowserColumnCss=function(){EPUBJS.Renderer.columnAxis=EPUBJS.core.prefixed("columnAxis"),EPUBJS.Renderer.columnGap=EPUBJS.core.prefixed("columnGap"),EPUBJS.Renderer.columnWidth=EPUBJS.core.prefixed("columnWidth"),EPUBJS.Renderer.transform=EPUBJS.core.prefixed("transform")},EPUBJS.Renderer.prototype.setIframeSrc=function(a){var b=this,c=new RSVP.Promise;return this.visible(!1),this.iframe.src=a,this.iframe.onload=function(){b.doc=b.iframe.contentDocument,b.docEl=b.doc.documentElement,b.bodyEl=b.doc.body,b.applyStyles(),b.formatSpread(),b.beforeDisplay(function(){b.calcPages(),c.resolve(b),b.currentLocationCfi=b.getPageCfi(),b.trigger("book:chapterDisplayed"),b.visible(!0)})},c},EPUBJS.Renderer.prototype.formatSpread=function(){var a=2,b=800;this.colWidth&&(this.OldcolWidth=this.colWidth,this.OldspreadWidth=this.spreadWidth),this.elWidth=this.iframe.width,this.gap=this.gap||Math.ceil(this.elWidth/8),this.elWidth1?(this.chapterPos--,this.leftPos-=this.spreadWidth,this.setLeft(this.leftPos),this.currentLocationCfi=this.getPageCfi(),this.trigger("book:pageChanged",this.currentLocationCfi),this.chapterPos):!1},EPUBJS.Renderer.prototype.chapterEnd=function(){this.page(this.displayedPages),this.currentLocationCfi=this.getPageCfi()},EPUBJS.Renderer.prototype.setLeft=function(a){this.doc.defaultView.scrollTo(a,0)},EPUBJS.Renderer.prototype.replace=function(a,b,c){var d,e,f;d=this.doc.querySelectorAll(a),e=Array.prototype.slice.call(d),f=e.length,e.forEach(function(a){b(a,function(){f--,0>=f&&c&&c()})}.bind(this)),0===f&&c()},EPUBJS.Renderer.prototype.determineStore=function(){return this.book.fromStorage?"filesystem"==this.book.storage.getStorageType()?!1:this.book.store:this.book.contained?this.book.zip:!1},EPUBJS.Renderer.prototype.replaceHead=function(a){var b,c,d,e,f={},g=this,h=this.determineStore(),i=function(a,b){a.setAttribute("href",b),a.onload=function(){d--,0>=d&&j()}},j=function(){a&&a(),_.each(e,function(a){h.revokeUrl(a)}),g.urlCache=f};return h?(b=this.doc.head.querySelectorAll("[href]"),c=Array.prototype.slice.call(b),d=c.length,this.urlCache||(this.urlCache={}),e=_.clone(this.urlCache),c.forEach(function(a){var b=a.getAttribute("href"),c=this.book.settings.contentsPath+b;c in e?(i(a,e[c]),f[c]=e[c],delete e[c]):"stylesheet"===a.getAttribute("rel")?h.getText(c).then(function(b){g.replaceUrlsInCss(c,b).then(function(b){var d=window.URL||window.webkitURL||window.mozURL,e=new Blob([b],{type:"text/css"}),g=d.createObjectURL(e);i(a,g),f[c]=g},function(a){console.error(a)})}):h.getUrl(c).then(function(b){i(a,b),f[c]=b})}.bind(this)),0===d&&j(),void 0):(a&&a(),!1)},EPUBJS.Renderer.prototype.replaceUrlsInCss=function(a,b){var c=new RSVP.Promise,d=[],e=this.determineStore(),f=b.match(/url\(\'?\"?([^\'|^\"]*)\'?\"?\)/g);return f?(f.forEach(function(c){var f=EPUBJS.core.resolveUrl(a,c.replace(/url\(|[|\)|\'|\"]/g,""));replaced=e.getUrl(f).then(function(a){b=b.replace(c,'url("'+a+'")')},function(a){console.error(a)}),d.push(replaced)}),RSVP.all(d).then(function(){c.resolve(b)}),c):(c.resolve(b),c)},EPUBJS.Renderer.prototype.replaceLinks=function(a){var b=this.doc.querySelectorAll("a"),c=Array.prototype.slice.call(b),d=this;c.forEach(function(a){var b,c,e=a.getAttribute("href");e&&(b=e.search("://"),c="#"==e[0],-1!=b?a.setAttribute("target","_blank"):a.onclick=function(){return d.book.goto(e),!1})}),a&&a()},EPUBJS.Renderer.prototype.replaceResources=function(a){var b,c,d,e=this.determineStore();return e?(b=this.doc.querySelectorAll("[src]"),c=Array.prototype.slice.call(b),d=c.length,c.forEach(function(b){var c=b.getAttribute("src"),f=this.book.settings.contentsPath+c;e.getUrl(f).then(function(c){b.src=c,b.onload=function(){d--,0>=d&&a&&a()}})}.bind(this)),0===d&&a(),void 0):(a&&a(),!1)},EPUBJS.Renderer.prototype.page=function(a){return a>=1&&a<=this.displayedPages?(this.chapterPos=a,this.leftPos=this.spreadWidth*(a-1),this.setLeft(this.leftPos),!0):!1},EPUBJS.Renderer.prototype.section=function(a){var b=this.doc.getElementById(a);b&&this.pageByElement(b)},EPUBJS.Renderer.prototype.pageByElement=function(a){var b,c;a&&(b=this.leftPos+a.getBoundingClientRect().left,c=Math.floor(b/this.spreadWidth)+1,this.page(c))},EPUBJS.Renderer.prototype.beforeDisplay=function(a){this.book.triggerHooks("beforeChapterDisplay",a.bind(this),this)},EPUBJS.Renderer.prototype.walk=function(a){for(var b,a,c,d,e,f=a,g=[f],h=1e4,i=0;!b&&g.length;){if(a=g.shift(),this.isElementVisible(a)&&(b=a),!b&&a&&a.childElementCount>0){c=a.children,d=c.length;for(var j=0;d>j;j++)c[j]!=e&&g.push(c[j])}if(!b&&0==g.length&&f&&null!==f.parentNode&&(g.push(f.parentNode),e=f,f=f.parentNode),i++,i>h){console.error("ENDLESS LOOP");break}}return b},EPUBJS.Renderer.prototype.getPageCfi=function(){var a=this.visibileEl;return this.visibileEl=this.findFirstVisible(a),this.visibileEl.id||(this.visibileEl.id="EPUBJS-PAGE-"+this.chapterPos),this.pageIds[this.chapterPos]=this.visibileEl.id,this.epubcfi.generateFragment(this.visibileEl,this.currentChapterCfi)},EPUBJS.Renderer.prototype.gotoCfiFragment=function(a){var b;_.isString(a)&&(a=this.epubcfi.parse(a)),b=this.epubcfi.getElement(a,this.doc),this.pageByElement(b)},EPUBJS.Renderer.prototype.findFirstVisible=function(a){var b,c=a||this.bodyEl;return b=this.walk(c),b?b:a},EPUBJS.Renderer.prototype.isElementVisible=function(a){var b;return a&&(b=a.getBoundingClientRect().left,b>=0&&be;e++)if(b.call(d,a[e],e,a)===c)return}else for(var g in a)if(x.has(a,g)&&b.call(d,a[g],g,a)===c)return};x.map=x.collect=function(a,b,c){var d=[];return null==a?d:m&&a.map===m?a.map(b,c):(y(a,function(a,e,f){d[d.length]=b.call(c,a,e,f)}),d)};var z="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),n&&a.reduce===n)return d&&(b=x.bind(b,d)),e?a.reduce(b,c):a.reduce(b);if(y(a,function(a,f,g){e?c=b.call(d,c,a,f,g):(c=a,e=!0)}),!e)throw new TypeError(z);return c},x.reduceRight=x.foldr=function(a,b,c,d){var e=arguments.length>2;if(null==a&&(a=[]),o&&a.reduceRight===o)return d&&(b=x.bind(b,d)),e?a.reduceRight(b,c):a.reduceRight(b);var f=a.length;if(f!==+f){var g=x.keys(a);f=g.length}if(y(a,function(h,i,j){i=g?g[--f]:--f,e?c=b.call(d,c,a[i],i,j):(c=a[i],e=!0)}),!e)throw new TypeError(z);return c},x.find=x.detect=function(a,b,c){var d;return A(a,function(a,e,f){return b.call(c,a,e,f)?(d=a,!0):void 0}),d},x.filter=x.select=function(a,b,c){var d=[];return null==a?d:p&&a.filter===p?a.filter(b,c):(y(a,function(a,e,f){b.call(c,a,e,f)&&(d[d.length]=a)}),d)},x.reject=function(a,b,c){return x.filter(a,function(a,d,e){return!b.call(c,a,d,e)},c)},x.every=x.all=function(a,b,d){b||(b=x.identity);var e=!0;return null==a?e:q&&a.every===q?a.every(b,d):(y(a,function(a,f,g){return(e=e&&b.call(d,a,f,g))?void 0:c}),!!e)};var A=x.some=x.any=function(a,b,d){b||(b=x.identity);var e=!1;return null==a?e:r&&a.some===r?a.some(b,d):(y(a,function(a,f,g){return e||(e=b.call(d,a,f,g))?c:void 0}),!!e)};x.contains=x.include=function(a,b){return null==a?!1:s&&a.indexOf===s?-1!=a.indexOf(b):A(a,function(a){return a===b})},x.invoke=function(a,b){var c=h.call(arguments,2),d=x.isFunction(b);return x.map(a,function(a){return(d?b:a[b]).apply(a,c)})},x.pluck=function(a,b){return x.map(a,function(a){return a[b]})},x.where=function(a,b,c){return x.isEmpty(b)?c?null:[]:x[c?"find":"filter"](a,function(a){for(var c in b)if(b[c]!==a[c])return!1;return!0})},x.findWhere=function(a,b){return x.where(a,b,!0)},x.max=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&65535>a.length)return Math.max.apply(Math,a);if(!b&&x.isEmpty(a))return-1/0;var d={computed:-1/0,value:-1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;g>=d.computed&&(d={value:a,computed:g})}),d.value},x.min=function(a,b,c){if(!b&&x.isArray(a)&&a[0]===+a[0]&&65535>a.length)return Math.min.apply(Math,a);if(!b&&x.isEmpty(a))return 1/0;var d={computed:1/0,value:1/0};return y(a,function(a,e,f){var g=b?b.call(c,a,e,f):a;d.computed>g&&(d={value:a,computed:g})}),d.value},x.shuffle=function(a){var b,c=0,d=[];return y(a,function(a){b=x.random(c++),d[c-1]=d[b],d[b]=a}),d};var B=function(a){return x.isFunction(a)?a:function(b){return b[a]}};x.sortBy=function(a,b,c){var d=B(b);return x.pluck(x.map(a,function(a,b,e){return{value:a,index:b,criteria:d.call(c,a,b,e)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;if(c!==d){if(c>d||void 0===c)return 1;if(d>c||void 0===d)return-1}return a.indexf;){var h=f+g>>>1;e>c.call(d,a[h])?f=h+1:g=h}return f},x.toArray=function(a){return a?x.isArray(a)?h.call(a):a.length===+a.length?x.map(a,x.identity):x.values(a):[]},x.size=function(a){return null==a?0:a.length===+a.length?a.length:x.keys(a).length},x.first=x.head=x.take=function(a,b,c){return null==a?void 0:null==b||c?a[0]:h.call(a,0,b)},x.initial=function(a,b,c){return h.call(a,0,a.length-(null==b||c?1:b))},x.last=function(a,b,c){return null==a?void 0:null==b||c?a[a.length-1]:h.call(a,Math.max(a.length-b,0))},x.rest=x.tail=x.drop=function(a,b,c){return h.call(a,null==b||c?1:b)},x.compact=function(a){return x.filter(a,x.identity)};var D=function(a,b,c){return y(a,function(a){x.isArray(a)?b?g.apply(c,a):D(a,b,c):c.push(a)}),c};x.flatten=function(a,b){return D(a,b,[])},x.without=function(a){return x.difference(a,h.call(arguments,1))},x.uniq=x.unique=function(a,b,c,d){x.isFunction(b)&&(d=c,c=b,b=!1);var e=c?x.map(a,c,d):a,f=[],g=[];return y(e,function(c,d){(b?d&&g[g.length-1]===c:x.contains(g,c))||(g.push(c),f.push(a[d]))}),f},x.union=function(){return x.uniq(i.apply(d,arguments))},x.intersection=function(a){var b=h.call(arguments,1);return x.filter(x.uniq(a),function(a){return x.every(b,function(b){return x.indexOf(b,a)>=0})})},x.difference=function(a){var b=i.apply(d,h.call(arguments,1));return x.filter(a,function(a){return!x.contains(b,a)})},x.zip=function(){for(var a=h.call(arguments),b=x.max(x.pluck(a,"length")),c=Array(b),d=0;b>d;d++)c[d]=x.pluck(a,""+d);return c},x.object=function(a,b){if(null==a)return{};for(var c={},d=0,e=a.length;e>d;d++)b?c[a[d]]=b[d]:c[a[d][0]]=a[d][1];return c},x.indexOf=function(a,b,c){if(null==a)return-1;var d=0,e=a.length;if(c){if("number"!=typeof c)return d=x.sortedIndex(a,b),a[d]===b?d:-1;d=0>c?Math.max(0,e+c):c}if(s&&a.indexOf===s)return a.indexOf(b,c);for(;e>d;d++)if(a[d]===b)return d;return-1},x.lastIndexOf=function(a,b,c){if(null==a)return-1;var d=null!=c;if(t&&a.lastIndexOf===t)return d?a.lastIndexOf(b,c):a.lastIndexOf(b);for(var e=d?c:a.length;e--;)if(a[e]===b)return e;return-1},x.range=function(a,b,c){1>=arguments.length&&(b=a||0,a=0),c=arguments[2]||1;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=Array(d);d>e;)f[e++]=a,a+=c;return f},x.bind=function(a,b){if(a.bind===w&&w)return w.apply(a,h.call(arguments,1));var c=h.call(arguments,2);return function(){return a.apply(b,c.concat(h.call(arguments)))}},x.partial=function(a){var b=h.call(arguments,1);return function(){return a.apply(this,b.concat(h.call(arguments)))}},x.bindAll=function(a){var b=h.call(arguments,1);return 0===b.length&&(b=x.functions(a)),y(b,function(b){a[b]=x.bind(a[b],a)}),a},x.memoize=function(a,b){var c={};return b||(b=x.identity),function(){var d=b.apply(this,arguments);return x.has(c,d)?c[d]:c[d]=a.apply(this,arguments)}},x.delay=function(a,b){var c=h.call(arguments,2);return setTimeout(function(){return a.apply(null,c)},b)},x.defer=function(a){return x.delay.apply(x,[a,1].concat(h.call(arguments,1)))},x.throttle=function(a,b){var c,d,e,f,g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)};return function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},x.debounce=function(a,b,c){var d,e;return function(){var f=this,g=arguments,h=function(){d=null,c||(e=a.apply(f,g))},i=c&&!d;return clearTimeout(d),d=setTimeout(h,b),i&&(e=a.apply(f,g)),e}},x.once=function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}},x.wrap=function(a,b){return function(){var c=[a];return g.apply(c,arguments),b.apply(this,c)}},x.compose=function(){var a=arguments;return function(){for(var b=arguments,c=a.length-1;c>=0;c--)b=[a[c].apply(this,b)];return b[0]}},x.after=function(a,b){return 0>=a?b():function(){return 1>--a?b.apply(this,arguments):void 0}},x.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[];for(var c in a)x.has(a,c)&&(b[b.length]=c);return b},x.values=function(a){var b=[];for(var c in a)x.has(a,c)&&b.push(a[c]);return b},x.pairs=function(a){var b=[];for(var c in a)x.has(a,c)&&b.push([c,a[c]]);return b},x.invert=function(a){var b={};for(var c in a)x.has(a,c)&&(b[a[c]]=c);return b},x.functions=x.methods=function(a){var b=[];for(var c in a)x.isFunction(a[c])&&b.push(c);return b.sort()},x.extend=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)a[c]=b[c]}),a},x.pick=function(a){var b={},c=i.apply(d,h.call(arguments,1));return y(c,function(c){c in a&&(b[c]=a[c])}),b},x.omit=function(a){var b={},c=i.apply(d,h.call(arguments,1));for(var e in a)x.contains(c,e)||(b[e]=a[e]);return b},x.defaults=function(a){return y(h.call(arguments,1),function(b){if(b)for(var c in b)null==a[c]&&(a[c]=b[c])}),a},x.clone=function(a){return x.isObject(a)?x.isArray(a)?a.slice():x.extend({},a):a},x.tap=function(a,b){return b(a),a};var E=function(a,b,c,d){if(a===b)return 0!==a||1/a==1/b;if(null==a||null==b)return a===b;a instanceof x&&(a=a._wrapped),b instanceof x&&(b=b._wrapped);var e=j.call(a);if(e!=j.call(b))return!1;switch(e){case"[object String]":return a==b+"";case"[object Number]":return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return!1;for(var f=c.length;f--;)if(c[f]==a)return d[f]==b;c.push(a),d.push(b);var g=0,h=!0;if("[object Array]"==e){if(g=a.length,h=g==b.length)for(;g--&&(h=E(a[g],b[g],c,d)););}else{var i=a.constructor,k=b.constructor;if(i!==k&&!(x.isFunction(i)&&i instanceof i&&x.isFunction(k)&&k instanceof k))return!1;for(var l in a)if(x.has(a,l)&&(g++,!(h=x.has(b,l)&&E(a[l],b[l],c,d))))break;if(h){for(l in b)if(x.has(b,l)&&!g--)break;h=!g}}return c.pop(),d.pop(),h};x.isEqual=function(a,b){return E(a,b,[],[])},x.isEmpty=function(a){if(null==a)return!0;if(x.isArray(a)||x.isString(a))return 0===a.length;for(var b in a)if(x.has(a,b))return!1;return!0},x.isElement=function(a){return!(!a||1!==a.nodeType)},x.isArray=u||function(a){return"[object Array]"==j.call(a)},x.isObject=function(a){return a===Object(a)},y(["Arguments","Function","String","Number","Date","RegExp"],function(a){x["is"+a]=function(b){return j.call(b)=="[object "+a+"]"}}),x.isArguments(arguments)||(x.isArguments=function(a){return!(!a||!x.has(a,"callee"))}),"function"!=typeof/./&&(x.isFunction=function(a){return"function"==typeof a}),x.isFinite=function(a){return isFinite(a)&&!isNaN(parseFloat(a))},x.isNaN=function(a){return x.isNumber(a)&&a!=+a},x.isBoolean=function(a){return a===!0||a===!1||"[object Boolean]"==j.call(a)},x.isNull=function(a){return null===a},x.isUndefined=function(a){return void 0===a},x.has=function(a,b){return k.call(a,b)},x.noConflict=function(){return a._=b,this},x.identity=function(a){return a},x.times=function(a,b,c){for(var d=Array(a),e=0;a>e;e++)d[e]=b.call(c,e);return d},x.random=function(a,b){return null==b&&(b=a,a=0),a+Math.floor(Math.random()*(b-a+1))};var F={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};F.unescape=x.invert(F.escape);var G={escape:RegExp("["+x.keys(F.escape).join("")+"]","g"),unescape:RegExp("("+x.keys(F.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(a){x[a]=function(b){return null==b?"":(""+b).replace(G[a],function(b){return F[a][b]})}}),x.result=function(a,b){if(null==a)return null;var c=a[b];return x.isFunction(c)?c.call(a):c},x.mixin=function(a){y(x.functions(a),function(b){var c=x[b]=a[b];x.prototype[b]=function(){var a=[this._wrapped];return g.apply(a,arguments),L.call(this,c.apply(x,a))}})};var H=0;x.uniqueId=function(a){var b=++H+"";return a?a+b:b},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var I=/(.)^/,J={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},K=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(a,b,c){var d;c=x.defaults({},c,x.templateSettings);var e=RegExp([(c.escape||I).source,(c.interpolate||I).source,(c.evaluate||I).source].join("|")+"|$","g"),f=0,g="__p+='";a.replace(e,function(b,c,d,e,h){return g+=a.slice(f,h).replace(K,function(a){return"\\"+J[a]}),c&&(g+="'+\n((__t=("+c+"))==null?'':_.escape(__t))+\n'"),d&&(g+="'+\n((__t=("+d+"))==null?'':__t)+\n'"),e&&(g+="';\n"+e+"\n__p+='"),f=h+b.length,b}),g+="';\n",c.variable||(g="with(obj||{}){\n"+g+"}\n"),g="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+g+"return __p;\n";try{d=Function(c.variable||"obj","_",g)}catch(h){throw h.source=g,h}if(b)return d(b,x);var i=function(a){return d.call(this,a,x)};return i.source="function("+(c.variable||"obj")+"){\n"+g+"}",i},x.chain=function(a){return x(a).chain()};var L=function(a){return this._chain?x(a).chain():a};x.mixin(x),y(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=d[a];x.prototype[a]=function(){var c=this._wrapped;return b.apply(c,arguments),"shift"!=a&&"splice"!=a||0!==c.length||delete c[0],L.call(this,c)}}),y(["concat","join","slice"],function(a){var b=d[a];x.prototype[a]=function(){return L.call(this,b.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}.call(this),function(a){"use strict";function b(a,b){f.async(function(){a.trigger("promise:resolved",{detail:b}),a.isResolved=!0,a.resolvedValue=b})}function c(a,b){f.async(function(){a.trigger("promise:failed",{detail:b}),a.isRejected=!0,a.rejectedValue=b})}function d(a){var b,c=[],d=new p,e=a.length;0===e&&d.resolve([]);var f=function(a){return function(b){g(a,b)}},g=function(a,b){c[a]=b,0===--e&&d.resolve(c)},h=function(a){d.reject(a)};for(b=0;e>b;b++)a[b].then(f(b),h);return d}function e(a,b){f[a]=b}var f={},g="undefined"!=typeof window?window:{},h=g.MutationObserver||g.WebKitMutationObserver;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))f.async=function(a,b){process.nextTick(function(){a.call(b)})};else if(h){var i=[],j=new h(function(){var a=i.slice();i=[],a.forEach(function(a){var b=a[0],c=a[1];b.call(c)})}),k=document.createElement("div");j.observe(k,{attributes:!0}),window.addEventListener("unload",function(){j.disconnect(),j=null}),f.async=function(a,b){i.push([a,b]),k.setAttribute("drainQueue","drainQueue")}}else f.async=function(a,b){setTimeout(function(){a.call(b)},1)};var l=function(a,b){this.type=a;for(var c in b)b.hasOwnProperty(c)&&(this[c]=b[c])},m=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c][0]===b)return c;return-1},n=function(a){var b=a._promiseCallbacks;return b||(b=a._promiseCallbacks={}),b},o={mixin:function(a){return a.on=this.on,a.off=this.off,a.trigger=this.trigger,a},on:function(a,b,c){var d,e,f=n(this);for(a=a.split(/\s+/),c=c||this;e=a.shift();)d=f[e],d||(d=f[e]=[]),-1===m(d,b)&&d.push([b,c])},off:function(a,b){var c,d,e,f=n(this);for(a=a.split(/\s+/);d=a.shift();)b?(c=f[d],e=m(c,b),-1!==e&&c.splice(e,1)):f[d]=[]},trigger:function(a,b){var c,d,e,f,g,h=n(this);if(c=h[a])for(var i=0,j=c.length;j>i;i++)d=c[i],e=d[0],f=d[1],"object"!=typeof b&&(b={detail:b}),g=new l(a,b),e.call(f,g)}},p=function(){this.on("promise:resolved",function(a){this.trigger("success",{detail:a.detail})},this),this.on("promise:failed",function(a){this.trigger("error",{detail:a.detail})},this)},q=function(){},r=function(a,b,c,d){var e,f,g,h,i="function"==typeof c;if(i)try{e=c(d.detail),g=!0}catch(j){h=!0,f=j}else e=d.detail,g=!0;e&&"function"==typeof e.then?e.then(function(a){b.resolve(a)},function(a){b.reject(a)}):i&&g?b.resolve(e):h?b.reject(f):b[a](e)};p.prototype={then:function(a,b){var c=new p;return this.isResolved&&f.async(function(){r("resolve",c,a,{detail:this.resolvedValue})},this),this.isRejected&&f.async(function(){r("reject",c,b,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(b){r("resolve",c,a,b)}),this.on("promise:failed",function(a){r("reject",c,b,a)}),c},resolve:function(a){b(this,a),this.resolve=q,this.reject=q},reject:function(a){c(this,a),this.resolve=q,this.reject=q}},o.mixin(p.prototype),a.Promise=p,a.Event=l,a.EventTarget=o,a.all=d,a.configure=e}(window.RSVP={});var EPUBJS=EPUBJS||{};EPUBJS.VERSION="0.1.5",EPUBJS.plugins=EPUBJS.plugins||{},EPUBJS.filePath=EPUBJS.filePath||"/epubjs/",EPUBJS.Book=function(a,b){this.settings=_.defaults(b||{},{element:!1,storage:!1,fromStorage:!1,saved:!1,online:!0,contained:!1,width:!1,height:!1,spreads:!0,fixedLayout:!1,responsive:!0,version:1,restore:!1,styles:{}}),this.settings.EPUBJSVERSION=EPUBJS.VERSION,this.spinePos=0,this.stored=!1,this.hooks={beforeChapterDisplay:[]},this.getHooks(),this.online=this.settings.online||navigator.onLine,this.networkListeners(),0!=this.settings.storage&&(this.storage=new fileStorage.storage(this.settings.storage)),this.ready={manifest:new RSVP.Promise,spine:new RSVP.Promise,metadata:new RSVP.Promise,cover:new RSVP.Promise,toc:new RSVP.Promise},this.ready.all=RSVP.all(_.values(this.ready)),a&&(this.opened=this.open(a)),a&&this.settings.element&&this.opened.then(function(){this.rendered=this.renderTo(el)})},EPUBJS.Book.prototype.open=function(a,b){var c,d=this,e=this.isSaved(a);return this.settings.bookPath=a,this.bookUrl=this.urlFrom(a),e&&!b&&this.applySavedSettings(),this.settings.contained||this.isContained(a)?(this.settings.contained=this.contained=!0,this.bookUrl="",c=this.unarchive(a).then(function(){return e&&d.settings.restore&&!b?d.restore():d.unpack()})):c=e&&this.settings.restore&&!b?this.restore():this.unpack(),this.online&&this.settings.storage&&!this.settings.contained&&(this.settings.stored||c.then(d.storeOffline())),c},EPUBJS.Book.prototype.unpack=function(a){var b=this,c=new EPUBJS.Parser,a=a||"META-INF/container.xml";return b.loadXml(b.bookUrl+a).then(function(a){return c.container(a)}).then(function(a){return b.settings.contentsPath=b.bookUrl+a.basePath,b.settings.packageUrl=b.bookUrl+a.packagePath,b.loadXml(b.settings.packageUrl)}).then(function(a){return c.package(a,b.settings.contentsPath)}).then(function(a){return b.contents=a,b.manifest=b.contents.manifest,b.spine=b.contents.spine,b.spineIndexByURL=b.contents.spineIndexByURL,b.metadata=b.contents.metadata,b.cover=b.contents.cover=b.settings.contentsPath+a.coverPath,b.spineNodeIndex=b.contents.spineNodeIndex=a.spineNodeIndex,b.ready.manifest.resolve(b.contents.manifest),b.ready.spine.resolve(b.contents.spine),b.ready.metadata.resolve(b.contents.metadata),b.ready.cover.resolve(b.contents.cover),b.settings.tocUrl=b.settings.contentsPath+a.tocPath,b.loadXml(b.settings.tocUrl)}).then(function(a){return c.toc(a)}).then(function(a){b.toc=b.contents.toc=a,b.ready.toc.resolve(b.contents.toc)}).then(null,function(a){console.error(a)})},EPUBJS.Book.prototype.getMetadata=function(){return this.ready.metadata},EPUBJS.Book.prototype.getToc=function(){return this.ready.toc},EPUBJS.Book.prototype.networkListeners=function(){var a=this;window.addEventListener("offline",function(){a.online=!1,a.trigger("book:offline")},!1),window.addEventListener("online",function(){a.online=!0,a.trigger("book:online")},!1),window.addEventListener("beforeunload",function(){a.saveSettings(),a.settings.restore&&a.saveContents(),a.trigger("book:unload")},!1)},EPUBJS.Book.prototype.loadXml=function(a){return this.settings.fromStorage?this.storage.getXml(a):this.settings.contained?this.zip.getXml(a):EPUBJS.core.request(a,"xml")},EPUBJS.Book.prototype.urlFrom=function(a){var b=-1!=a.search("://"),c="/"==a[0],d=window.location,e=d.origin||d.protocol+"//"+d.host;return b?a:!b&&c?e+a:b||c?void 0:e+EPUBJS.core.folder(d.pathname)+a},EPUBJS.Book.prototype.unarchive=function(a){return this.zip=new EPUBJS.Unarchiver,this.zip.openZip(a)},EPUBJS.Book.prototype.isContained=function(a){var b=a.lastIndexOf("."),c=a.slice(b+1);return!c||"epub"!=c&&"zip"!=c?!1:!0},EPUBJS.Book.prototype.isSaved=function(a){var b=a+":"+this.settings.version,c=localStorage.getItem(b);return localStorage&&null!==c?!0:!1},EPUBJS.Book.prototype.removeSavedSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;localStorage.removeItem(a),this.settings.stored=!1},EPUBJS.Book.prototype.applySavedSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;return stored=JSON.parse(localStorage.getItem(a)),EPUBJS.VERSION!=stored.EPUBJSVERSION?!1:(this.settings=_.defaults(this.settings,stored),void 0)},EPUBJS.Book.prototype.saveSettings=function(){var a=this.settings.bookPath+":"+this.settings.version;this.render&&(this.settings.previousLocationCfi=this.render.currentLocationCfi),localStorage.setItem(a,JSON.stringify(this.settings))},EPUBJS.Book.prototype.saveContents=function(){var a=this.settings.bookPath+":contents:"+this.settings.version;localStorage.setItem(a,JSON.stringify(this.contents))},EPUBJS.Book.prototype.renderTo=function(a){var b=this;return this.settings.element=a,this.opened.then(function(){return b.render=new EPUBJS.Renderer(b),b.startDisplay()})},EPUBJS.Book.prototype.startDisplay=function(){var a;return a=this.settings.restore&&this.settings.previousLocationCfi?this.displayChapter(this.settings.previousLocationCfi):this.displayChapter(this.spinePos)},EPUBJS.Book.prototype.restore=function(){var a=this,b=this.settings.bookPath+":contents:"+this.settings.version,c=new RSVP.Promise,d=["manifest","spine","metadata","cover","toc","spineNodeIndex","spineIndexByURL"],e=!1,f=localStorage.getItem(b);return"undefined"!=f&&"null"!=f&&(this.contents=JSON.parse(f),d.forEach(function(b){a[b]=a.contents[b],a[b]||(e=!0)})),!e&&f&&this.contents&&this.settings.contentsPath?(this.ready.manifest.resolve(this.manifest),this.ready.spine.resolve(this.spine),this.ready.metadata.resolve(this.metadata),this.ready.cover.resolve(this.cover),this.ready.toc.resolve(this.toc),c.resolve(),c):this.open(this.settings.bookPath,!0)},EPUBJS.Book.prototype.displayChapter=function(a,b){var c,d,e,f=this;return _.isNumber(a)?e=a:(d=new EPUBJS.EpubCFI(a),e=d.spinePos),e>=this.spine.length?!1:0>e?!1:(this.spinePos=e,this.chapter=new EPUBJS.Chapter(this.spine[e]),c=f.render.chapter(this.chapter),d?c.then(function(b){b.currentLocationCfi=a,b.gotoCfiFragment(d)}):b&&c.then(function(a){a.gotoChapterEnd()}),this.settings.fromStorage||this.settings.contained||c.then(function(){f.preloadNextChapter()}),c)},EPUBJS.Book.prototype.nextPage=function(){var a=this.render.nextPage();return a?void 0:this.nextChapter()},EPUBJS.Book.prototype.prevPage=function(){var a=this.render.prevPage();return a?void 0:this.prevChapter()},EPUBJS.Book.prototype.nextChapter=function(){return this.spinePos++,this.displayChapter(this.spinePos)},EPUBJS.Book.prototype.prevChapter=function(){return this.spinePos--,this.displayChapter(this.spinePos,!0)},EPUBJS.Book.prototype.goto=function(a){var b,c=a.split("#"),d=c[0],e=c[1]||!1,f=-1==d.search("://")?this.settings.contentsPath+d:d,g=this.spineIndexByURL[f];return d||(g=this.chapter.spinePos),"number"!=typeof g?!1:g==this.chapter.spinePos&&this.chapter?(e&&this.render.section(e),(new RSVP.Promise).resolve(this.currentChapter)):this.displayChapter(g).then(function(){e&&b.render.section(e)})},EPUBJS.Book.prototype.preloadNextChapter=function(){return document.createElement("iframe"),this.spinePos>=this.spine.length?!1:(next=new EPUBJS.Chapter(this.spine[this.spinePos+1]),EPUBJS.core.request(next.href),void 0)},EPUBJS.Book.prototype.storeOffline=function(){var a=this,b=_.values(this.manifest);return EPUBJS.storage.batch(b).then(function(){a.settings.stored=!0,a.trigger("book:stored")})},EPUBJS.Book.prototype.availableOffline=function(){return this.settings.stored>0?!0:!1},EPUBJS.Book.prototype.setStyle=function(a,b,c){this.render.setStyle(a,b,c),this.settings.styles[a]=b},EPUBJS.Book.prototype.removeStyle=function(a){this.render.removeStyle(a),delete this.settings.styles[a]},EPUBJS.Book.prototype.getHooks=function(){var a,b=this;plugTypes=_.values(this.hooks);for(plugType in this.hooks)a=_.values(EPUBJS.Hooks[plugType]),a.forEach(function(a){b.registerHook(plugType,a)})},EPUBJS.Book.prototype.registerHook=function(a,b,c){var d=this;"undefined"!=typeof this.hooks[a]?"function"==typeof b?c?this.hooks[a].unshift(b):this.hooks[a].push(b):Array.isArray(b)&&b.forEach(function(b){c?d.hooks[a].unshift(b):d.hooks[a].push(b)}):this.hooks[a]=[func]},EPUBJS.Book.prototype.triggerHooks=function(a,b,c){function d(){f--,0>=f&&b&&b()}var e,f;return"undefined"==typeof this.hooks[a]?!1:(e=this.hooks[a],f=e.length,e.forEach(function(a){a(d,c)}),void 0)},RSVP.EventTarget.mixin(EPUBJS.Book.prototype),EPUBJS.Chapter=function(a){this.href=a.href,this.id=a.id,this.spinePos=a.index,this.properties=a.properties,this.linear=a.linear,this.pages=1},EPUBJS.Chapter.prototype.contents=function(a){return a?a.get(href):EPUBJS.core.request(href,"xml")},EPUBJS.Chapter.prototype.url=function(a){var b=new RSVP.Promise;return a?(this.tempUrl||(this.tempUrl=a.getUrl(this.href)),this.tempUrl):(b.resolve(this.href),b)},EPUBJS.Chapter.prototype.setPages=function(a){this.pages=a},EPUBJS.Chapter.prototype.getPages=function(){return this.pages},EPUBJS.Chapter.prototype.getID=function(){return this.ID},EPUBJS.Chapter.prototype.unload=function(a){this.tempUrl&&a&&(a.revokeUrl(this.tempUrl),this.tempUrl=!1)};var EPUBJS=EPUBJS||{};EPUBJS.core={},EPUBJS.core.getEl=function(a){return document.getElementById(a)},EPUBJS.core.getEls=function(a){return document.getElementsByClassName(a)},EPUBJS.core.request=function(a,b){function c(){if(this.readyState===this.DONE)if(200===this.status||this.responseXML){var a;a="xml"==b?this.responseXML:"json"==b?JSON.parse(this.response):this.response,d.resolve(a)}else d.reject(this)}var d=new RSVP.Promise,e=new XMLHttpRequest;return e.open("GET",a),e.onreadystatechange=c,"blob"==b&&(e.responseType=b),"json"==b&&e.setRequestHeader("Accept","application/json"),"xml"==b&&e.overrideMimeType("text/xml"),e.send(),d},EPUBJS.core.toArray=function(a){var b=[];for(member in a){var c;a.hasOwnProperty(member)&&(c=a[member],c.ident=member,b.push(c))}return b},EPUBJS.core.folder=function(a){var b=a.lastIndexOf("/"),c=a.slice(0,b+1);return-1==b&&(c=""),c},EPUBJS.core.dataURLToBlob=function(a){var b=";base64,";if(-1==a.indexOf(b)){var c=a.split(","),d=c[0].split(":")[1],e=c[1];return new Blob([e],{type:d})}for(var c=a.split(b),d=c[0].split(":")[1],e=window.atob(c[1]),f=e.length,g=new Uint8Array(f),h=0;f>h;++h)g[h]=e.charCodeAt(h);return new Blob([g],{type:d})},EPUBJS.core.addScript=function(a,b,c){var d,e;e=!1,d=document.createElement("script"),d.type="text/javascript",d.async=!1,d.src=a,d.onload=d.onreadystatechange=function(){e||this.readyState&&"complete"!=this.readyState||(e=!0,b&&b())},c=c||document.body,c.appendChild(d)},EPUBJS.core.addScripts=function(a,b,c){var d=a.length,e=0,f=function(){e++,d==e?b&&b():EPUBJS.core.loadScript(a[e],f,c)};EPUBJS.core.addScript(a[e],f,c)},EPUBJS.core.addCss=function(a,b,c){var d,e;e=!1,d=document.createElement("link"),d.type="text/css",d.rel="stylesheet",d.href=a,d.onload=d.onreadystatechange=function(){e||this.readyState&&"complete"!=this.readyState||(e=!0,b&&b())},c=c||document.body,c.appendChild(d)},EPUBJS.core.prefixed=function(a){var b=["Webkit","Moz","O","ms"],c=a[0].toUpperCase()+a.slice(1),d=b.length,e=0;if("undefined"!=typeof document.body.style[a])return a;for(;d>e;e++)if("undefined"!=typeof document.body.style[b[e]+c])return b[e]+c;return a},EPUBJS.core.resolveUrl=function(a,b){var c,d,e=[],f=a.split("/");return f.pop(),d=b.split("/"),d.forEach(function(a){".."===a?f.pop():e.push(a)}),c=f.concat(e),c.join("/")},EPUBJS.EpubCFI=function(a){return a?this.parse(a):void 0},EPUBJS.EpubCFI.prototype.generateChapter=function(a,b,c){var a=a+1,d="/"+a+"/";return d+=2*(b+1),c&&(d+="["+c+"]"),d+="!"},EPUBJS.EpubCFI.prototype.generateFragment=function(a,b){var c=this.pathTo(a),d=[];return b&&d.push(b),c.forEach(function(a){d.push(2*(a.index+1)),a.id&&"EPUBJS"!=a.id.slice(0,6)&&d.push("["+a.id+"]")}),d.join("/")},EPUBJS.EpubCFI.prototype.pathTo=function(a){for(var b,c=[];a&&null!==a.parentNode;)b=a.parentNode.children,c.unshift({id:a.id,tagName:a.tagName,index:b?Array.prototype.indexOf.call(b,a):0}),a=a.parentNode;return c},EPUBJS.EpubCFI.prototype.getChapter=function(a){var b=a.split("!");return b[0]},EPUBJS.EpubCFI.prototype.getFragment=function(a){var b=a.split("!");return b[1]},EPUBJS.EpubCFI.prototype.getOffset=function(a){var b=a.split(":");return[b[0],b[1]]},EPUBJS.EpubCFI.prototype.parse=function(a){var b,c,d,e,f={};return f.chapter=this.getChapter(a),f.fragment=this.getFragment(a),f.spinePos=parseInt(f.chapter.split("/")[2])/2-1||0,b=f.chapter.match(/\[(.*)\]/),f.spineId=b[1]||!1,c=f.fragment.split("/"),d=c[c.length-1],f.sections=[],parseInt(d)%2&&(e=this.getOffset(),f.text=parseInt(e[0]),f.character=parseInt(e[1]),c.pop()),c.forEach(function(a){var b,c,d;a&&(b=parseInt(a)/2-1,c=a.match(/\[(.*)\]/),c&&c[1]&&(d=c[1]),f.sections.push({index:b,id:d||!1}))}),f},EPUBJS.EpubCFI.prototype.getElement=function(a,b){var c,b=b||document,d=a.sections,e=b.getElementsByTagName("html")[0],f=Array.prototype.slice.call(e.children);for(d.shift();d.length>0;)c=d.shift(),c.id?e=b.querySelector("#"+c.id):(e=f[c.index],f||console.error("No Kids",e)),e||console.error("No Element For",c),f=Array.prototype.slice.call(e.children);return e},EPUBJS.Events=function(a,b){return this.events={},this.el=b?b:document.createElement("div"),a.createEvent=this.createEvent,a.tell=this.tell,a.listen=this.listen,a.deafen=this.deafen,a.listenUntil=this.listenUntil,this},EPUBJS.Events.prototype.createEvent=function(a){var b=new CustomEvent(a);return this.events[a]=b,b},EPUBJS.Events.prototype.tell=function(a,b){var c;this.events[a]?c=this.events[a]:(console.warn("No event:",a,"defined yet, creating."),c=this.createEvent(a)),b&&(c.msg=b),this.el.dispatchEvent(c)},EPUBJS.Events.prototype.listen=function(a,b,c){return this.events[a]?(c?this.el.addEventListener(a,b.bind(c),!1):this.el.addEventListener(a,b,!1),void 0):(console.warn("No event:",a,"defined yet, creating."),this.createEvent(a),void 0)},EPUBJS.Events.prototype.deafen=function(a,b){this.el.removeEventListener(a,b,!1)},EPUBJS.Events.prototype.listenUntil=function(a,b,c,d){function e(){this.deafen(a,c),this.deafen(b,e)}this.listen(a,c,d),this.listen(b,e,this)},EPUBJS.Hooks=function(){"use strict";return{register:function(a){if(void 0===this[a]&&(this[a]={}),"object"!=typeof this[a])throw"Already registered: "+a;return this[a]}}}(),EPUBJS.Parser=function(a){this.baseUrl=a||""},EPUBJS.Parser.prototype.container=function(a){var b=a.querySelector("rootfile"),c=b.getAttribute("full-path"),d=EPUBJS.core.folder(c);return{packagePath:c,basePath:d}},EPUBJS.Parser.prototype.package=function(a,b){var c=this;b&&(this.baseUrl=b);var d=a.querySelector("metadata"),e=a.querySelector("manifest"),f=a.querySelector("spine"),g=c.manifest(e),h=c.findTocPath(e),i=c.findCoverPath(e),j=Array.prototype.indexOf.call(f.parentNode.childNodes,f),k=c.spine(f,g),l={};return k.forEach(function(a){l[a.href]=a.index}),{metadata:c.metadata(d),spine:k,manifest:g,tocPath:h,coverPath:i,spineNodeIndex:j,spineIndexByURL:l}},EPUBJS.Parser.prototype.findTocPath=function(a){var b=a.querySelector("item[media-type='application/x-dtbncx+xml']");return b?b.getAttribute("href"):!1},EPUBJS.Parser.prototype.findCoverPath=function(a){var b=a.querySelector("item[properties='cover-image']");return b?b.getAttribute("href"):!1},EPUBJS.Parser.prototype.metadata=function(a){var b={},c=this;return b.bookTitle=c.getElementText(a,"title"),b.creator=c.getElementText(a,"creator"),b.description=c.getElementText(a,"description"),b.pubdate=c.getElementText(a,"date"),b.publisher=c.getElementText(a,"publisher"),b.identifier=c.getElementText(a,"identifier"),b.language=c.getElementText(a,"language"),b.rights=c.getElementText(a,"rights"),b.modified_date=c.querySelectorText(a,"meta[property='dcterms:modified']"),b.layout=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.orientation=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.spread=c.querySelectorText(a,"meta[property='rendition:spread']"),b +},EPUBJS.Parser.prototype.getElementText=function(a,b){var c,d=a.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",b);return d&&0!=d.length?(c=d[0],c.childNodes.length?c.childNodes[0].nodeValue:""):""},EPUBJS.Parser.prototype.querySelectorText=function(a,b){var c=a.querySelector(b);return c&&c.childNodes.length?c.childNodes[0].nodeValue:""},EPUBJS.Parser.prototype.manifest=function(a){var b=this.baseUrl,c={},d=a.querySelectorAll("item"),e=Array.prototype.slice.call(d);return e.forEach(function(a){var d=a.getAttribute("id"),e=a.getAttribute("href")||"",f=a.getAttribute("media-type")||"";c[d]={href:b+e,type:f}}),c},EPUBJS.Parser.prototype.spine=function(a,b){var c=[],d=a.getElementsByTagName("itemref"),e=Array.prototype.slice.call(d);return e.forEach(function(a,d){var e=a.getAttribute("idref"),f={id:e,linear:a.getAttribute("linear")||"",properties:a.getAttribute("properties")||"",href:b[e].href,index:d};c.push(f)}),c},EPUBJS.Parser.prototype.toc=function(a){function b(a){var c,d=[],e=[],f=a.childNodes,g=Array.prototype.slice.call(f),h=g.length,i=h;if(0==h)return!1;for(;i--;)c=g[i],"navPoint"===c.nodeName&&e.push(c);return e.forEach(function(a){var c=a.getAttribute("id"),e=a.querySelector("content"),f=e.getAttribute("src"),g=(f.split("#"),a.querySelector("navLabel")),h=g.textContent?g.textContent:"",i=b(a);d.unshift({id:c,href:f,label:h,subitems:i})}),d}var c=a.querySelector("navMap");return b(c)},EPUBJS.Renderer=function(a){var b=a.settings.element;if(this.book=a,this.settings=a.settings,_.isElement(b))this.el=b;else{if("string"!=typeof b)return console.error("Not an Element"),void 0;this.el=EPUBJS.core.getEl(b)}a.registerHook("beforeChapterDisplay",[this.replaceLinks.bind(this),this.replaceResources.bind(this),this.replaceHead.bind(this)],!0),this.crossBrowserColumnCss(),this.epubcfi=new EPUBJS.EpubCFI,this.initialize(),this.listeners()},EPUBJS.Renderer.prototype.initialize=function(){this.iframe=document.createElement("iframe"),this.settings.width||this.settings.height?this.resizeIframe(!1,this.settings.width||this.el.clientWidth,this.settings.height||this.el.clientHeight):(this.resizeIframe(!1,this.el.clientWidth,this.el.clientHeight),this.on("book:resized",this.resizeIframe,this)),this.el.appendChild(this.iframe)},EPUBJS.Renderer.prototype.listeners=function(){this.resized=_.debounce(this.onResized.bind(this),10),window.addEventListener("resize",this.resized,!1)},EPUBJS.Renderer.prototype.chapter=function(a){var b=this,c=!1;return this.book.settings.contained&&(c=this.book.zip),this.currentChapter&&(this.currentChapter.unload(),this.trigger("book:chapterDestroyed")),this.currentChapter=a,this.chapterPos=1,this.pageIds={},this.leftPos=0,this.currentChapterCfi=this.epubcfi.generateChapter(this.book.spineNodeIndex,a.spinePos,a.id),this.visibileEl=!1,a.url(c).then(function(a){return b.setIframeSrc(a)})},EPUBJS.Renderer.prototype.onResized=function(){this.trigger("book:resized",{width:this.el.clientWidth,height:this.el.clientHeight}),this.reformat()},EPUBJS.Renderer.prototype.reformat=function(){var a=this;a.book.settings.fixedLayout?a.fixedLayout():a.formatSpread(),setTimeout(function(){a.calcPages(),a.currentLocationCfi&&a.gotoCfiFragment(a.currentLocationCfi)},10)},EPUBJS.Renderer.prototype.destroy=function(){window.removeEventListener("resize",this.resized,!1)},EPUBJS.Renderer.prototype.resizeIframe=function(a,b,c){var d,e;a?(d=a.width,e=a.height):(d=b,e=c),this.iframe.height=e,0!=d%2&&(d+=1),this.iframe.width=d},EPUBJS.Renderer.prototype.crossBrowserColumnCss=function(){EPUBJS.Renderer.columnAxis=EPUBJS.core.prefixed("columnAxis"),EPUBJS.Renderer.columnGap=EPUBJS.core.prefixed("columnGap"),EPUBJS.Renderer.columnWidth=EPUBJS.core.prefixed("columnWidth"),EPUBJS.Renderer.transform=EPUBJS.core.prefixed("transform")},EPUBJS.Renderer.prototype.setIframeSrc=function(a){var b=this,c=new RSVP.Promise;return this.visible(!1),this.iframe.src=a,this.iframe.onload=function(){b.doc=b.iframe.contentDocument,b.docEl=b.doc.documentElement,b.bodyEl=b.doc.body,b.applyStyles(),b.book.settings.fixedLayout?b.fixedLayout():b.formatSpread(),b.beforeDisplay(function(){b.calcPages(),c.resolve(b),b.currentLocationCfi=b.getPageCfi(),b.trigger("book:chapterDisplayed"),b.visible(!0)})},c},EPUBJS.Renderer.prototype.formatSpread=function(){var a=2,b=800;this.colWidth&&(this.OldcolWidth=this.colWidth,this.OldspreadWidth=this.spreadWidth),this.elWidth=this.iframe.width,this.gap=this.gap||Math.ceil(this.elWidth/8),this.elWidth1?(this.chapterPos--,this.leftPos-=this.spreadWidth,this.setLeft(this.leftPos),this.currentLocationCfi=this.getPageCfi(),this.trigger("book:pageChanged",this.currentLocationCfi),this.chapterPos):!1},EPUBJS.Renderer.prototype.chapterEnd=function(){this.page(this.displayedPages),this.currentLocationCfi=this.getPageCfi()},EPUBJS.Renderer.prototype.setLeft=function(a){this.doc.defaultView.scrollTo(a,0)},EPUBJS.Renderer.prototype.replace=function(a,b,c){var d,e,f;d=this.doc.querySelectorAll(a),e=Array.prototype.slice.call(d),f=e.length,e.forEach(function(a){b(a,function(){f--,0>=f&&c&&c()})}.bind(this)),0===f&&c()},EPUBJS.Renderer.prototype.determineStore=function(){return this.book.fromStorage?"filesystem"==this.book.storage.getStorageType()?!1:this.book.store:this.book.contained?this.book.zip:!1},EPUBJS.Renderer.prototype.replaceHead=function(a){var b,c,d,e,f={},g=this,h=this.determineStore(),i=function(a,b){a.setAttribute("href",b),a.onload=function(){d--,0>=d&&j()}},j=function(){a&&a(),_.each(e,function(a){h.revokeUrl(a)}),g.urlCache=f};return h?(b=this.doc.head.querySelectorAll("[href]"),c=Array.prototype.slice.call(b),d=c.length,this.urlCache||(this.urlCache={}),e=_.clone(this.urlCache),c.forEach(function(a){var b=a.getAttribute("href"),c=this.book.settings.contentsPath+b;c in e?(i(a,e[c]),f[c]=e[c],delete e[c]):"stylesheet"===a.getAttribute("rel")?h.getText(c).then(function(b){g.replaceUrlsInCss(c,b).then(function(b){var d=window.URL||window.webkitURL||window.mozURL,e=new Blob([b],{type:"text/css"}),g=d.createObjectURL(e);i(a,g),f[c]=g},function(a){console.error(a)})}):h.getUrl(c).then(function(b){i(a,b),f[c]=b})}.bind(this)),0===d&&j(),void 0):(a&&a(),!1)},EPUBJS.Renderer.prototype.replaceUrlsInCss=function(a,b){var c=new RSVP.Promise,d=[],e=this.determineStore(),f=b.match(/url\(\'?\"?([^\'|^\"]*)\'?\"?\)/g);return f?(f.forEach(function(c){var f=EPUBJS.core.resolveUrl(a,c.replace(/url\(|[|\)|\'|\"]/g,""));replaced=e.getUrl(f).then(function(a){b=b.replace(c,'url("'+a+'")')},function(a){console.error(a)}),d.push(replaced)}),RSVP.all(d).then(function(){c.resolve(b)}),c):(c.resolve(b),c)},EPUBJS.Renderer.prototype.replaceLinks=function(a){var b=this.doc.querySelectorAll("a"),c=Array.prototype.slice.call(b),d=this;c.forEach(function(a){var b,c,e=a.getAttribute("href");e&&(b=e.search("://"),c="#"==e[0],-1!=b?a.setAttribute("target","_blank"):a.onclick=function(){return d.book.goto(e),!1})}),a&&a()},EPUBJS.Renderer.prototype.replaceResources=function(a){var b,c,d,e=this.determineStore();return e?(b=this.doc.querySelectorAll("[src]"),c=Array.prototype.slice.call(b),d=c.length,c.forEach(function(b){var c=b.getAttribute("src"),f=this.book.settings.contentsPath+c;e.getUrl(f).then(function(c){b.src=c,b.onload=function(){d--,0>=d&&a&&a()}})}.bind(this)),0===d&&a(),void 0):(a&&a(),!1)},EPUBJS.Renderer.prototype.page=function(a){return a>=1&&a<=this.displayedPages?(this.chapterPos=a,this.leftPos=this.spreadWidth*(a-1),this.setLeft(this.leftPos),!0):!1},EPUBJS.Renderer.prototype.section=function(a){var b=this.doc.getElementById(a);b&&this.pageByElement(b)},EPUBJS.Renderer.prototype.pageByElement=function(a){var b,c;a&&(b=this.leftPos+a.getBoundingClientRect().left,c=Math.floor(b/this.spreadWidth)+1,this.page(c))},EPUBJS.Renderer.prototype.beforeDisplay=function(a){this.book.triggerHooks("beforeChapterDisplay",a.bind(this),this)},EPUBJS.Renderer.prototype.walk=function(a){for(var b,a,c,d,e,f=a,g=[f],h=1e4,i=0;!b&&g.length;){if(a=g.shift(),this.isElementVisible(a)&&(b=a),!b&&a&&a.childElementCount>0){c=a.children,d=c.length;for(var j=0;d>j;j++)c[j]!=e&&g.push(c[j])}if(!b&&0==g.length&&f&&null!==f.parentNode&&(g.push(f.parentNode),e=f,f=f.parentNode),i++,i>h){console.error("ENDLESS LOOP");break}}return b},EPUBJS.Renderer.prototype.getPageCfi=function(){var a=this.visibileEl;return this.visibileEl=this.findFirstVisible(a),this.visibileEl.id||(this.visibileEl.id="EPUBJS-PAGE-"+this.chapterPos),this.pageIds[this.chapterPos]=this.visibileEl.id,this.epubcfi.generateFragment(this.visibileEl,this.currentChapterCfi)},EPUBJS.Renderer.prototype.gotoCfiFragment=function(a){var b;_.isString(a)&&(a=this.epubcfi.parse(a)),b=this.epubcfi.getElement(a,this.doc),this.pageByElement(b)},EPUBJS.Renderer.prototype.findFirstVisible=function(a){var b,c=a||this.bodyEl;return b=this.walk(c),b?b:a},EPUBJS.Renderer.prototype.isElementVisible=function(a){var b;return a&&"function"==typeof a.getBoundingClientRect&&(b=a.getBoundingClientRect().left,b>=0&&b550?a("#main").width(k-m):a("#main").width(k),j=new EPUBJS.Book(b),j.on("book:online",g),j.on("book:offline",h),j.getMetadata().then(c),j.getToc().then(d),j.ready.all.then(f),j.renderTo("area"),a(function(){i()}),j}function c(b){var c=b.bookTitle,d=b.creator,e=a("#book-title"),f=a("#chapter-title"),g=a("#title-seperator");document.title=c+" – "+d,e.html(c),f.html(d),g.show()}function d(b){var c,d,f=a("#toc");f.empty(),d=e(b,1),f.append(d),c=a(".toc_link"),c.on("click",function(b){var c=a(this),d=c.data("url");a(".openChapter").removeClass("openChapter"),c.parents("li").addClass("openChapter"),j.goto(d),b.preventDefault()})}function e(b,c){var d=a("
    "),f=1==c?"chapter":"section";return b.forEach(function(b){var g,h=a("
  • "),i=a(""+b.label+"");h.append(i),b.subitems&&b.subitems.length&&(c++,g=e(b.subitems,c),h.append(g)),d.append(h)}),d}function f(){var b=a("#divider"),c=a("#loader");c.hide(),j.single||b.addClass("show")}function g(){var b=a("#store");l=!1,b.attr("src",b.data("save"))}function h(){var b=a("#store");l=!0,b.attr("src",b.data("saved"))}function i(){function b(){n.addClass("open"),h.addClass("closed"),p.attr("src",p.data("close"))}function c(){i.css("pointer-events","visible"),n.removeClass("open"),h.removeClass("closed"),p.attr("src",p.data("open"))}function d(){t.hide(),s.show()}function e(){s.hide(),t.show()}var f=a("#next"),g=a("#prev"),h=a("#main"),i=a("#area"),n=a("#sidebar"),o=a("#open"),p=o.find("img"),q=a("#network"),r=a("#setting"),s=a("#settingsPanel"),t=a("#toc"),u=a(window);u.on("resize",function(){k=a(window).width(),k>550?h.width(k-m):h.width(k)}),f.on("click",function(){j.nextPage()}),g.on("click",function(){j.prevPage()}),r.on("click",function(){s.is(":visible")?e():d()});var v=!1;a(document).keydown(function(a){return v?void 0:37==a.keyCode?(g.trigger("click"),v=!0,setTimeout(function(){v=!1},100),!1):39==a.keyCode?(f.trigger("click"),v=!0,setTimeout(function(){v=!1},100),!1):void 0}),o.on("click",function(){n.hasClass("open")?c():b()}),q.on("click",function(){l=!l,j.fromStorage(l)})}var j,k,l=!1,m=0;return b}(jQuery),jQuery.fn.extend({clickOutside:function(a,b){var c=this;return jQuery(document).on("click.offer",function(d){b&&jQuery.inArray(d.target,b)>-1||jQuery.contains(c[0],d.target)||(jQuery(document).off("click.offer"),a(d,c))}),this}}); \ No newline at end of file +var EPUBJSR=EPUBJSR||{};EPUBJSR.app={},EPUBJSR.app.init=function(a){"use strict";function b(b){var e=window.location.search.match(/book=(.*)/),b=b||(e?e[1]:"moby-dick");return k=a(window).width(),k>550?a("#main").width(k-m):a("#main").width(k),j=new EPUBJS.Book(b,{restore:!0}),j.on("book:online",g),j.on("book:offline",h),j.getMetadata().then(c),j.getToc().then(d),j.ready.all.then(f),j.renderTo("area"),a(function(){i()}),j}function c(b){var c=b.bookTitle,d=b.creator,e=a("#book-title"),f=a("#chapter-title"),g=a("#title-seperator");document.title=c+" – "+d,e.html(c),f.html(d),g.show()}function d(b){var c,d,f=a("#toc");f.empty(),d=e(b,1),f.append(d),c=a(".toc_link"),c.on("click",function(b){var c=a(this),d=c.data("url");a(".openChapter").removeClass("openChapter"),c.parents("li").addClass("openChapter"),j.goto(d),b.preventDefault()})}function e(b,c){var d=a("
      "),f=1==c?"chapter":"section";return b.forEach(function(b){var g,h=a("
    • "),i=a(""+b.label+"");h.append(i),b.subitems&&b.subitems.length&&(c++,g=e(b.subitems,c),h.append(g)),d.append(h)}),d}function f(){var b=a("#divider"),c=a("#loader");c.hide(),j.single||b.addClass("show")}function g(){var b=a("#store");l=!1,b.attr("src",b.data("save"))}function h(){var b=a("#store");l=!0,b.attr("src",b.data("saved"))}function i(){function b(){n.addClass("open"),h.addClass("closed"),p.attr("src",p.data("close"))}function c(){i.css("pointer-events","visible"),n.removeClass("open"),h.removeClass("closed"),p.attr("src",p.data("open"))}function d(){t.hide(),s.show()}function e(){s.hide(),t.show()}var f=a("#next"),g=a("#prev"),h=a("#main"),i=a("#area"),n=a("#sidebar"),o=a("#open"),p=o.find("img"),q=a("#network"),r=a("#setting"),s=a("#settingsPanel"),t=a("#toc"),u=a(window);u.on("resize",function(){k=a(window).width(),k>550?h.width(k-m):h.width(k)}),f.on("click",function(){j.nextPage()}),g.on("click",function(){j.prevPage()}),r.on("click",function(){s.is(":visible")?e():d()});var v=!1;a(document).keydown(function(a){return v?void 0:37==a.keyCode?(g.trigger("click"),v=!0,setTimeout(function(){v=!1},100),!1):39==a.keyCode?(f.trigger("click"),v=!0,setTimeout(function(){v=!1},100),!1):void 0}),o.on("click",function(){n.hasClass("open")?c():b()}),q.on("click",function(){l=!l,j.fromStorage(l)})}var j,k,l=!1,m=0;return b}(jQuery),jQuery.fn.extend({clickOutside:function(a,b){var c=this;return jQuery(document).on("click.offer",function(d){b&&jQuery.inArray(d.target,b)>-1||jQuery.contains(c[0],d.target)||(jQuery(document).off("click.offer"),a(d,c))}),this}}); \ No newline at end of file diff --git a/examples/annotator.html b/examples/annotator.html index 58c3249..302db55 100755 --- a/examples/annotator.html +++ b/examples/annotator.html @@ -3,93 +3,100 @@ - + ePubJS Annotator Example - - - + - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + var Book = new EPUBJS.Book("/demo/moby-dick/", { restore: true }); + + + -
      -
      - -
      -
      - -   â€“   - -
      -
      - +
      - - +
      +
      + + diff --git a/examples/basic.css b/examples/basic.css new file mode 100644 index 0000000..a6eb64b --- /dev/null +++ b/examples/basic.css @@ -0,0 +1,64 @@ +body { + overflow: hidden; +} + +#main { + position: absolute; + width: 100%; + height: 100%; +} + +#area { + width: 80%; + height: 80%; + margin: 5% auto; + max-width: 1250px; +} + +#area iframe { + border: none; +} + +#prev { + left: 40px; +} + +#next { + right: 40px; +} + +.arrow { + position: absolute; + top: 50%; + margin-top: -32px; + font-size: 64px; + color: #E2E2E2; + font-family: arial, sans-serif; + font-weight: bold; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.arrow:hover { + color: #777; +} + +.arrow:active { + color: #000; +} + +#loader { + position: absolute; + z-index: 10; + left: 50%; + top: 50%; + margin: -33px 0 0 -33px; +} + +#toc { + position: absolute; + top: 0; + left: 0; +} \ No newline at end of file diff --git a/examples/basic.html b/examples/basic.html new file mode 100644 index 0000000..e959bbf --- /dev/null +++ b/examples/basic.html @@ -0,0 +1,89 @@ + + + + + + Basic ePubJS Example + + + + + + + + + + + + + +
      + +
      + +
      + + + + diff --git a/examples/contained.html b/examples/contained.html new file mode 100644 index 0000000..4e8205b --- /dev/null +++ b/examples/contained.html @@ -0,0 +1,38 @@ + + + + + Contained ePub Example + + + + + + + + + + + + + + + +
      + +
      + +
      + + + + diff --git a/examples/fixed.html b/examples/fixed.html new file mode 100644 index 0000000..7e06fe9 --- /dev/null +++ b/examples/fixed.html @@ -0,0 +1,76 @@ + + + + + + Basic ePubJS Example + + + + + + + + + + + + + + + +
      + +
      +
      +
      + +
      + + + + diff --git a/examples/hypothesis.html b/examples/hypothesis.html index 4f3ab1a..57f3f8a 100644 --- a/examples/hypothesis.html +++ b/examples/hypothesis.html @@ -1,90 +1,58 @@ - - - - - - - + + + + Basic ePubJS Example + + + - - - + + + + + - - - - + + + + + + +
      + +
      + +
      - - - - - + - - - - - - - - - - - - - - - - -
      -
      - -
      -
      - -   â€“   - -
      -
      - -
      - - -
      -
      - + + diff --git a/examples/promises.html b/examples/promises.html new file mode 100644 index 0000000..eb6e7b8 --- /dev/null +++ b/examples/promises.html @@ -0,0 +1,74 @@ + + + + + + ePubJS Promises Example + + + + + + + + + + + + +
      + +
      + +
      + +
      + + + + diff --git a/examples/single.html b/examples/single.html new file mode 100644 index 0000000..1bd1c6d --- /dev/null +++ b/examples/single.html @@ -0,0 +1,77 @@ + + + + + + Basic ePubJS Example + + + + + + + + + + + + + + + +
      + +
      +
      +
      + +
      + + + + diff --git a/hooks/extensions/annotate.js b/hooks/extensions/annotate.js index fc82d02..482547c 100644 --- a/hooks/extensions/annotate.js +++ b/hooks/extensions/annotate.js @@ -11,21 +11,51 @@ EPUBJS.Hooks.register("beforeChapterDisplay").annotate = function(callback, chap //EPUBJS.core.loadScripts(files, annotate, chapter.doc.head); - $(chapter.doc.body).annotator().annotator('setupPlugins', {}, { + // $(chapter.doc.body).annotator().annotator('setupPlugins', {}, { - Filter:false, - Store: { - annotationData: { - 'uri': chapter.path - }, - loadFromSearch: { - 'limit': 100, - 'uri': chapter.path - } - } + // Filter:false, + // Store: { + // annotationData: { + // 'uri': chapter.path + // }, + // loadFromSearch: { + // 'limit': 100, + // 'uri': chapter.path + // } + // } - }); - EPUBJS.core.addCss("css/annotator.css", false, chapter.doc.head); + // }); + Util.mousePosition = function(e, offsetEl) { + var offset; + offset = $(offsetEl).position(); + return { + top: e.pageY, + left: e.pageX + }; + }; + + devAnnotator = new Annotator(chapter.doc.body) + .addPlugin('Auth', { + tokenUrl: 'http://annotateit.org/api/token',//'http://localhost:5001/api/token' + }) + .addPlugin('Unsupported') + .addPlugin('AnnotateItPermissions') + .addPlugin('Store', { + prefix: 'http://annotateit.org/api',//'http://localhost:5000', + loadFromSearch: { + uri: chapter.currentChapter.href + }, + annotationData: { + uri: chapter.currentChapter.href + } + }); + + // devAnnotator.plugins.Auth.withToken(function (tok) { + // console.log(tok); + // }) + + EPUBJS.core.addCss("../libs/annotator/css/annotator.css", false, chapter.doc.head); + if(callback) callback(); function annotate(){ diff --git a/libs/annotator/annotator-full-o.js b/libs/annotator/annotator-full-o.js deleted file mode 100644 index 046cec6..0000000 --- a/libs/annotator/annotator-full-o.js +++ /dev/null @@ -1,2759 +0,0 @@ -/* -** Annotator 1.2.6-dev-f4e0b5d -** https://github.com/okfn/annotator/ -** -** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning. -** Dual licensed under the MIT and GPLv3 licenses. -** https://github.com/okfn/annotator/blob/master/LICENSE -** -** Built at: 2013-03-04 19:18:55Z -*/ - -(function() { - var $, Annotator, Delegator, LinkParser, Range, base64Decode, base64UrlDecode, createDateFromISO8601, fn, functions, g, gettext, parseToken, util, _Annotator, _gettext, _i, _j, _len, _len2, _ref, _ref2, _t, - __slice = Array.prototype.slice, - __hasProp = Object.prototype.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - gettext = null; - - if (typeof Gettext !== "undefined" && Gettext !== null) { - _gettext = new Gettext({ - domain: "annotator" - }); - gettext = function(msgid) { - return _gettext.gettext(msgid); - }; - } else { - gettext = function(msgid) { - return msgid; - }; - } - - _t = function(msgid) { - return gettext(msgid); - }; - - if (!(typeof jQuery !== "undefined" && jQuery !== null ? (_ref = jQuery.fn) != null ? _ref.jquery : void 0 : void 0)) { - console.error(_t("Annotator requires jQuery: have you included lib/vendor/jquery.js?")); - } - - if (!(JSON && JSON.parse && JSON.stringify)) { - console.error(_t("Annotator requires a JSON implementation: have you included lib/vendor/json2.js?")); - } - - $ = jQuery.sub(); - - $.flatten = function(array) { - var flatten; - flatten = function(ary) { - var el, flat, _i, _len; - flat = []; - for (_i = 0, _len = ary.length; _i < _len; _i++) { - el = ary[_i]; - flat = flat.concat(el && $.isArray(el) ? flatten(el) : el); - } - return flat; - }; - return flatten(array); - }; - - $.plugin = function(name, object) { - return jQuery.fn[name] = function(options) { - var args; - args = Array.prototype.slice.call(arguments, 1); - return this.each(function() { - var instance; - instance = $.data(this, name); - if (instance) { - return options && instance[options].apply(instance, args); - } else { - instance = new object(this, options); - return $.data(this, name, instance); - } - }); - }; - }; - - $.fn.textNodes = function() { - var getTextNodes; - getTextNodes = function(node) { - var nodes; - if (node && node.nodeType !== 3) { - nodes = []; - if (node.nodeType !== 8) { - node = node.lastChild; - while (node) { - nodes.push(getTextNodes(node)); - node = node.previousSibling; - } - } - return nodes.reverse(); - } else { - return node; - } - }; - return this.map(function() { - return $.flatten(getTextNodes(this)); - }); - }; - - $.fn.xpath = function(relativeRoot) { - var jq; - jq = this.map(function() { - var elem, idx, path; - path = ''; - elem = this; - while (elem && elem.nodeType === 1 && elem !== relativeRoot) { - idx = $(elem.parentNode).children(elem.tagName).index(elem) + 1; - idx = "[" + idx + "]"; - path = "/" + elem.tagName.toLowerCase() + idx + path; - elem = elem.parentNode; - } - return path; - }); - return jq.get(); - }; - - $.escape = function(html) { - return html.replace(/&(?!\w+;)/g, '&').replace(//g, '>').replace(/"/g, '"'); - }; - - $.fn.escape = function(html) { - if (arguments.length) return this.html($.escape(html)); - return this.html(); - }; - - $.fn.reverse = []._reverse || [].reverse; - - functions = ["log", "debug", "info", "warn", "exception", "assert", "dir", "dirxml", "trace", "group", "groupEnd", "groupCollapsed", "time", "timeEnd", "profile", "profileEnd", "count", "clear", "table", "error", "notifyFirebug", "firebug", "userObjects"]; - - if (typeof console !== "undefined" && console !== null) { - if (!(console.group != null)) { - console.group = function(name) { - return console.log("GROUP: ", name); - }; - } - if (!(console.groupCollapsed != null)) console.groupCollapsed = console.group; - for (_i = 0, _len = functions.length; _i < _len; _i++) { - fn = functions[_i]; - if (!(console[fn] != null)) { - console[fn] = function() { - return console.log(_t("Not implemented:") + (" console." + name)); - }; - } - } - } else { - this.console = {}; - for (_j = 0, _len2 = functions.length; _j < _len2; _j++) { - fn = functions[_j]; - this.console[fn] = function() {}; - } - this.console['error'] = function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return alert("ERROR: " + (args.join(', '))); - }; - this.console['warn'] = function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return alert("WARNING: " + (args.join(', '))); - }; - } - - Delegator = (function() { - - Delegator.prototype.events = {}; - - Delegator.prototype.options = {}; - - Delegator.prototype.element = null; - - function Delegator(element, options) { - this.options = $.extend(true, {}, this.options, options); - this.element = $(element); - this.on = this.subscribe; - this.addEvents(); - } - - Delegator.prototype.addEvents = function() { - var event, functionName, sel, selector, _k, _ref2, _ref3, _results; - _ref2 = this.events; - _results = []; - for (sel in _ref2) { - functionName = _ref2[sel]; - _ref3 = sel.split(' '), selector = 2 <= _ref3.length ? __slice.call(_ref3, 0, _k = _ref3.length - 1) : (_k = 0, []), event = _ref3[_k++]; - _results.push(this.addEvent(selector.join(' '), event, functionName)); - } - return _results; - }; - - Delegator.prototype.addEvent = function(bindTo, event, functionName) { - var closure, isBlankSelector, - _this = this; - closure = function() { - return _this[functionName].apply(_this, arguments); - }; - isBlankSelector = typeof bindTo === 'string' && bindTo.replace(/\s+/g, '') === ''; - if (isBlankSelector) bindTo = this.element; - if (typeof bindTo === 'string') { - this.element.delegate(bindTo, event, closure); - } else { - if (this.isCustomEvent(event)) { - this.subscribe(event, closure); - } else { - $(bindTo).bind(event, closure); - } - } - return this; - }; - - Delegator.prototype.isCustomEvent = function(event) { - event = event.split('.')[0]; - return $.inArray(event, Delegator.natives) === -1; - }; - - Delegator.prototype.publish = function() { - this.element.triggerHandler.apply(this.element, arguments); - return this; - }; - - Delegator.prototype.subscribe = function(event, callback) { - var closure; - closure = function() { - return callback.apply(this, [].slice.call(arguments, 1)); - }; - closure.guid = callback.guid = ($.guid += 1); - this.element.bind(event, closure); - return this; - }; - - Delegator.prototype.unsubscribe = function() { - this.element.unbind.apply(this.element, arguments); - return this; - }; - - return Delegator; - - })(); - - Delegator.natives = (function() { - var key, specials, val; - specials = (function() { - var _ref2, _results; - _ref2 = jQuery.event.special; - _results = []; - for (key in _ref2) { - if (!__hasProp.call(_ref2, key)) continue; - val = _ref2[key]; - _results.push(key); - } - return _results; - })(); - return "blur focus focusin focusout load resize scroll unload click dblclick\nmousedown mouseup mousemove mouseover mouseout mouseenter mouseleave\nchange select submit keydown keypress keyup error".split(/[^a-z]+/).concat(specials); - })(); - - Range = {}; - - Range.sniff = function(r) { - if (r.commonAncestorContainer != null) { - return new Range.BrowserRange(r); - } else if (typeof r.start === "string") { - return new Range.SerializedRange(r); - } else if (r.start && typeof r.start === "object") { - return new Range.NormalizedRange(r); - } else { - console.error(_t("Could not sniff range type")); - return false; - } - }; - - Range.nodeFromXPath = function(xpath, root) { - var customResolver, evaluateXPath, namespace, node, segment; - if (root == null) root = document; - evaluateXPath = function(xp, nsResolver) { - if (nsResolver == null) nsResolver = null; - return document.evaluate('.' + xp, root, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - }; - if (!$.isXMLDoc(document.documentElement)) { - return evaluateXPath(xpath); - } else { - customResolver = document.createNSResolver(document.ownerDocument === null ? document.documentElement : document.ownerDocument.documentElement); - node = evaluateXPath(xpath, customResolver); - if (!node) { - xpath = ((function() { - var _k, _len3, _ref2, _results; - _ref2 = xpath.split('/'); - _results = []; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - segment = _ref2[_k]; - if (segment && segment.indexOf(':') === -1) { - _results.push(segment.replace(/^([a-z]+)/, 'xhtml:$1')); - } else { - _results.push(segment); - } - } - return _results; - })()).join('/'); - namespace = document.lookupNamespaceURI(null); - customResolver = function(ns) { - if (ns === 'xhtml') { - return namespace; - } else { - return document.documentElement.getAttribute('xmlns:' + ns); - } - }; - node = evaluateXPath(xpath, customResolver); - } - return node; - } - }; - - Range.RangeError = (function(_super) { - - __extends(RangeError, _super); - - function RangeError(type, message, parent) { - this.type = type; - this.message = message; - this.parent = parent != null ? parent : null; - RangeError.__super__.constructor.call(this, this.message); - } - - return RangeError; - - })(Error); - - Range.BrowserRange = (function() { - - function BrowserRange(obj) { - this.commonAncestorContainer = obj.commonAncestorContainer; - this.startContainer = obj.startContainer; - this.startOffset = obj.startOffset; - this.endContainer = obj.endContainer; - this.endOffset = obj.endOffset; - } - - BrowserRange.prototype.normalize = function(root) { - var it, node, nr, offset, p, r, _k, _len3, _ref2; - if (this.tainted) { - console.error(_t("You may only call normalize() once on a BrowserRange!")); - return false; - } else { - this.tainted = true; - } - r = {}; - nr = {}; - _ref2 = ['start', 'end']; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - p = _ref2[_k]; - node = this[p + 'Container']; - offset = this[p + 'Offset']; - if (node.nodeType === 1) { - it = node.childNodes[offset]; - node = it || node.childNodes[offset - 1]; - if (node.nodeType === 1 && !node.firstChild) { - it = null; - node = node.previousSibling; - } - while (node.nodeType !== 3) { - node = node.firstChild; - } - offset = it ? 0 : node.nodeValue.length; - } - r[p] = node; - r[p + 'Offset'] = offset; - } - nr.start = r.startOffset > 0 ? r.start.splitText(r.startOffset) : r.start; - if (r.start === r.end) { - if ((r.endOffset - r.startOffset) < nr.start.nodeValue.length) { - nr.start.splitText(r.endOffset - r.startOffset); - } - nr.end = nr.start; - } else { - if (r.endOffset < r.end.nodeValue.length) r.end.splitText(r.endOffset); - nr.end = r.end; - } - nr.commonAncestor = this.commonAncestorContainer; - while (nr.commonAncestor.nodeType !== 1) { - nr.commonAncestor = nr.commonAncestor.parentNode; - } - return new Range.NormalizedRange(nr); - }; - - BrowserRange.prototype.serialize = function(root, ignoreSelector) { - return this.normalize(root).serialize(root, ignoreSelector); - }; - - return BrowserRange; - - })(); - - Range.NormalizedRange = (function() { - - function NormalizedRange(obj) { - this.commonAncestor = obj.commonAncestor; - this.start = obj.start; - this.end = obj.end; - } - - NormalizedRange.prototype.normalize = function(root) { - return this; - }; - - NormalizedRange.prototype.limit = function(bounds) { - var nodes, parent, startParents, _k, _len3, _ref2; - nodes = $.grep(this.textNodes(), function(node) { - return node.parentNode === bounds || $.contains(bounds, node.parentNode); - }); - if (!nodes.length) return null; - this.start = nodes[0]; - this.end = nodes[nodes.length - 1]; - startParents = $(this.start).parents(); - _ref2 = $(this.end).parents(); - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - parent = _ref2[_k]; - if (startParents.index(parent) !== -1) { - this.commonAncestor = parent; - break; - } - } - return this; - }; - - NormalizedRange.prototype.serialize = function(root, ignoreSelector) { - var end, serialization, start; - serialization = function(node, isEnd) { - var n, nodes, offset, origParent, textNodes, xpath, _k, _len3; - if (ignoreSelector) { - origParent = $(node).parents(":not(" + ignoreSelector + ")").eq(0); - } else { - origParent = $(node).parent(); - } - xpath = origParent.xpath(root)[0]; - textNodes = origParent.textNodes(); - nodes = textNodes.slice(0, textNodes.index(node)); - offset = 0; - for (_k = 0, _len3 = nodes.length; _k < _len3; _k++) { - n = nodes[_k]; - offset += n.nodeValue.length; - } - if (isEnd) { - return [xpath, offset + node.nodeValue.length]; - } else { - return [xpath, offset]; - } - }; - start = serialization(this.start); - end = serialization(this.end, true); - return new Range.SerializedRange({ - start: start[0], - end: end[0], - startOffset: start[1], - endOffset: end[1] - }); - }; - - NormalizedRange.prototype.text = function() { - var node; - return ((function() { - var _k, _len3, _ref2, _results; - _ref2 = this.textNodes(); - _results = []; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - node = _ref2[_k]; - _results.push(node.nodeValue); - } - return _results; - }).call(this)).join(''); - }; - - NormalizedRange.prototype.textNodes = function() { - var end, start, textNodes, _ref2; - textNodes = $(this.commonAncestor).textNodes(); - _ref2 = [textNodes.index(this.start), textNodes.index(this.end)], start = _ref2[0], end = _ref2[1]; - return $.makeArray(textNodes.slice(start, end + 1 || 9e9)); - }; - - NormalizedRange.prototype.toRange = function() { - var range; - range = document.createRange(); - range.setStartBefore(this.start); - range.setEndAfter(this.end); - return range; - }; - - return NormalizedRange; - - })(); - - Range.SerializedRange = (function() { - - function SerializedRange(obj) { - this.start = obj.start; - this.startOffset = obj.startOffset; - this.end = obj.end; - this.endOffset = obj.endOffset; - } - - SerializedRange.prototype.normalize = function(root) { - var contains, length, node, p, range, tn, _k, _l, _len3, _len4, _ref2, _ref3; - range = {}; - _ref2 = ['start', 'end']; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - p = _ref2[_k]; - try { - node = Range.nodeFromXPath(this[p], root); - } catch (e) { - throw new Range.RangeError(p, ("Error while finding " + p + " node: " + this[p] + ": ") + e, e); - } - if (!node) { - throw new Range.RangeError(p, "Couldn't find " + p + " node: " + this[p]); - } - length = 0; - _ref3 = $(node).textNodes(); - for (_l = 0, _len4 = _ref3.length; _l < _len4; _l++) { - tn = _ref3[_l]; - if (length + tn.nodeValue.length >= this[p + 'Offset']) { - range[p + 'Container'] = tn; - range[p + 'Offset'] = this[p + 'Offset'] - length; - break; - } else { - length += tn.nodeValue.length; - } - } - if (!(range[p + 'Offset'] != null)) { - throw new Range.RangeError("" + p + "offset", "Couldn't find offset " + this[p + 'Offset'] + " in element " + this[p]); - } - } - contains = !(document.compareDocumentPosition != null) ? function(a, b) { - return a.contains(b); - } : function(a, b) { - return a.compareDocumentPosition(b) & 16; - }; - $(range.startContainer).parents().each(function() { - if (contains(this, range.endContainer)) { - range.commonAncestorContainer = this; - return false; - } - }); - return new Range.BrowserRange(range).normalize(root); - }; - - SerializedRange.prototype.serialize = function(root, ignoreSelector) { - return this.normalize(root).serialize(root, ignoreSelector); - }; - - SerializedRange.prototype.toObject = function() { - return { - start: this.start, - startOffset: this.startOffset, - end: this.end, - endOffset: this.endOffset - }; - }; - - return SerializedRange; - - })(); - - util = { - uuid: (function() { - var counter; - counter = 0; - return function() { - return counter++; - }; - })(), - getGlobal: function() { - return (function() { - return this; - })(); - }, - maxZIndex: function($elements) { - var all, el; - all = (function() { - var _k, _len3, _results; - _results = []; - for (_k = 0, _len3 = $elements.length; _k < _len3; _k++) { - el = $elements[_k]; - if ($(el).css('position') === 'static') { - _results.push(-1); - } else { - _results.push(parseInt($(el).css('z-index'), 10) || -1); - } - } - return _results; - })(); - return Math.max.apply(Math, all); - }, - mousePosition: function(e, offsetEl) { - var offset; - offset = $(offsetEl).offset(); - return { - top: e.pageY, - left: e.pageX - }; - }, - preventEventDefault: function(event) { - return event != null ? typeof event.preventDefault === "function" ? event.preventDefault() : void 0 : void 0; - } - }; - - _Annotator = this.Annotator; - - Annotator = (function(_super) { - - __extends(Annotator, _super); - - Annotator.prototype.events = { - ".annotator-adder button click": "onAdderClick", - ".annotator-adder button mousedown": "onAdderMousedown", - ".annotator-hl mouseover": "onHighlightMouseover", - ".annotator-hl mouseout": "startViewerHideTimer" - }; - - Annotator.prototype.html = { - adder: '
      ', - wrapper: '
      ' - }; - - Annotator.prototype.options = { - readOnly: false - }; - - Annotator.prototype.plugins = {}; - - Annotator.prototype.editor = null; - - Annotator.prototype.viewer = null; - - Annotator.prototype.selectedRanges = null; - - Annotator.prototype.mouseIsDown = false; - - Annotator.prototype.ignoreMouseup = false; - - Annotator.prototype.viewerHideTimer = null; - - function Annotator(element, options) { - this.onDeleteAnnotation = __bind(this.onDeleteAnnotation, this); - this.onEditAnnotation = __bind(this.onEditAnnotation, this); - this.onAdderClick = __bind(this.onAdderClick, this); - this.onAdderMousedown = __bind(this.onAdderMousedown, this); - this.onHighlightMouseover = __bind(this.onHighlightMouseover, this); - this.checkForEndSelection = __bind(this.checkForEndSelection, this); - this.checkForStartSelection = __bind(this.checkForStartSelection, this); - this.clearViewerHideTimer = __bind(this.clearViewerHideTimer, this); - this.startViewerHideTimer = __bind(this.startViewerHideTimer, this); - this.showViewer = __bind(this.showViewer, this); - this.onEditorSubmit = __bind(this.onEditorSubmit, this); - this.onEditorHide = __bind(this.onEditorHide, this); - this.showEditor = __bind(this.showEditor, this); Annotator.__super__.constructor.apply(this, arguments); - this.plugins = {}; - if (!Annotator.supported()) return this; - if (!this.options.readOnly) this._setupDocumentEvents(); - this._setupWrapper()._setupViewer()._setupEditor(); - this._setupDynamicStyle(); - this.adder = $(this.html.adder).appendTo(this.wrapper).hide(); - } - - Annotator.prototype._setupWrapper = function() { - this.wrapper = $(this.html.wrapper); - this.element.find('script').remove(); - this.element.wrapInner(this.wrapper); - this.wrapper = this.element.find('.annotator-wrapper'); - return this; - }; - - Annotator.prototype._setupViewer = function() { - var _this = this; - this.viewer = new Annotator.Viewer({ - readOnly: this.options.readOnly - }); - this.viewer.hide().on("edit", this.onEditAnnotation).on("delete", this.onDeleteAnnotation).addField({ - load: function(field, annotation) { - if (annotation.text) { - $(field).escape(annotation.text); - } else { - $(field).html("" + (_t('No Comment')) + ""); - } - return _this.publish('annotationViewerTextField', [field, annotation]); - } - }).element.appendTo(this.wrapper).bind({ - "mouseover": this.clearViewerHideTimer, - "mouseout": this.startViewerHideTimer - }); - return this; - }; - - Annotator.prototype._setupEditor = function() { - this.editor = new Annotator.Editor(); - this.editor.hide().on('hide', this.onEditorHide).on('save', this.onEditorSubmit).addField({ - type: 'textarea', - label: _t('Comments') + '\u2026', - load: function(field, annotation) { - return $(field).find('textarea').val(annotation.text || ''); - }, - submit: function(field, annotation) { - return annotation.text = $(field).find('textarea').val(); - } - }); - this.editor.element.appendTo(this.wrapper); - return this; - }; - - Annotator.prototype._setupDocumentEvents = function() { - $(document).bind({ - "mouseup": this.checkForEndSelection, - "mousedown": this.checkForStartSelection - }); - return this; - }; - - Annotator.prototype._setupDynamicStyle = function() { - var max, sel, style, x; - style = $('#annotator-dynamic-style'); - if (!style.length) { - style = $('').appendTo(document.head); - } - sel = '*' + ((function() { - var _k, _len3, _ref2, _results; - _ref2 = ['adder', 'outer', 'notice', 'filter']; - _results = []; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - x = _ref2[_k]; - _results.push(":not(.annotator-" + x + ")"); - } - return _results; - })()).join(''); - max = util.maxZIndex($(document.body).find(sel)); - max = Math.max(max, 1000); - style.text([".annotator-adder, .annotator-outer, .annotator-notice {", " z-index: " + (max + 20) + ";", "}", ".annotator-filter {", " z-index: " + (max + 10) + ";", "}"].join("\n")); - return this; - }; - - Annotator.prototype.getSelectedRanges = function() { - var browserRange, i, normedRange, r, ranges, rangesToIgnore, selection, _k, _len3; - selection = util.getGlobal().getSelection(); - ranges = []; - rangesToIgnore = []; - if (!selection.isCollapsed) { - ranges = (function() { - var _ref2, _results; - _results = []; - for (i = 0, _ref2 = selection.rangeCount; 0 <= _ref2 ? i < _ref2 : i > _ref2; 0 <= _ref2 ? i++ : i--) { - r = selection.getRangeAt(i); - browserRange = new Range.BrowserRange(r); - normedRange = browserRange.normalize().limit(this.wrapper[0]); - if (normedRange === null) rangesToIgnore.push(r); - _results.push(normedRange); - } - return _results; - }).call(this); - selection.removeAllRanges(); - } - for (_k = 0, _len3 = rangesToIgnore.length; _k < _len3; _k++) { - r = rangesToIgnore[_k]; - selection.addRange(r); - } - return $.grep(ranges, function(range) { - if (range) selection.addRange(range.toRange()); - return range; - }); - }; - - Annotator.prototype.createAnnotation = function() { - var annotation; - annotation = {}; - this.publish('beforeAnnotationCreated', [annotation]); - return annotation; - }; - - Annotator.prototype.setupAnnotation = function(annotation) { - var normed, normedRanges, r, root, _k, _l, _len3, _len4, _ref2; - root = this.wrapper[0]; - annotation.ranges || (annotation.ranges = this.selectedRanges); - normedRanges = []; - _ref2 = annotation.ranges; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - r = _ref2[_k]; - try { - normedRanges.push(Range.sniff(r).normalize(root)); - } catch (e) { - if (e instanceof Range.RangeError) { - this.publish('rangeNormalizeFail', [annotation, r, e]); - } else { - throw e; - } - } - } - annotation.quote = []; - annotation.ranges = []; - annotation.highlights = []; - for (_l = 0, _len4 = normedRanges.length; _l < _len4; _l++) { - normed = normedRanges[_l]; - annotation.quote.push($.trim(normed.text())); - annotation.ranges.push(normed.serialize(this.wrapper[0], '.annotator-hl')); - $.merge(annotation.highlights, this.highlightRange(normed)); - } - annotation.quote = annotation.quote.join(' / '); - $(annotation.highlights).data('annotation', annotation); - return annotation; - }; - - Annotator.prototype.updateAnnotation = function(annotation) { - this.publish('beforeAnnotationUpdated', [annotation]); - this.publish('annotationUpdated', [annotation]); - return annotation; - }; - - Annotator.prototype.deleteAnnotation = function(annotation) { - var h, _k, _len3, _ref2; - _ref2 = annotation.highlights; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - h = _ref2[_k]; - $(h).replaceWith(h.childNodes); - } - this.publish('annotationDeleted', [annotation]); - return annotation; - }; - - Annotator.prototype.loadAnnotations = function(annotations) { - var clone, loader, - _this = this; - if (annotations == null) annotations = []; - loader = function(annList) { - var n, now, _k, _len3; - if (annList == null) annList = []; - now = annList.splice(0, 10); - for (_k = 0, _len3 = now.length; _k < _len3; _k++) { - n = now[_k]; - _this.setupAnnotation(n); - } - if (annList.length > 0) { - return setTimeout((function() { - return loader(annList); - }), 10); - } else { - return _this.publish('annotationsLoaded', [clone]); - } - }; - clone = annotations.slice(); - if (annotations.length) loader(annotations); - return this; - }; - - Annotator.prototype.dumpAnnotations = function() { - if (this.plugins['Store']) { - return this.plugins['Store'].dumpAnnotations(); - } else { - return console.warn(_t("Can't dump annotations without Store plugin.")); - } - }; - - Annotator.prototype.highlightRange = function(normedRange, cssClass) { - var hl, node, white, _k, _len3, _ref2, _results; - if (cssClass == null) cssClass = 'annotator-hl'; - white = /^\s*$/; - hl = $(""); - _ref2 = normedRange.textNodes(); - _results = []; - for (_k = 0, _len3 = _ref2.length; _k < _len3; _k++) { - node = _ref2[_k]; - if (!white.test(node.nodeValue)) { - _results.push($(node).wrapAll(hl).parent().show()[0]); - } - } - return _results; - }; - - Annotator.prototype.highlightRanges = function(normedRanges, cssClass) { - var highlights, r, _k, _len3; - if (cssClass == null) cssClass = 'annotator-hl'; - highlights = []; - for (_k = 0, _len3 = normedRanges.length; _k < _len3; _k++) { - r = normedRanges[_k]; - $.merge(highlights, this.highlightRange(r, cssClass)); - } - return highlights; - }; - - Annotator.prototype.addPlugin = function(name, options) { - var klass, _base; - if (this.plugins[name]) { - console.error(_t("You cannot have more than one instance of any plugin.")); - } else { - klass = Annotator.Plugin[name]; - if (typeof klass === 'function') { - this.plugins[name] = new klass(this.element[0], options); - this.plugins[name].annotator = this; - if (typeof (_base = this.plugins[name]).pluginInit === "function") { - _base.pluginInit(); - } - } else { - console.error(_t("Could not load ") + name + _t(" plugin. Have you included the appropriate + + + var gt = new Gettext({ "domain" : "myDomain" }); + // rest is the same + + + // ////////////////////////////////////////////////////////// + // The reson the shortcuts aren't exported by default is because they'd be + // glued to the single domain you created. So, if you're adding i18n support + // to some js library, you should use it as so: + + if (typeof(MyNamespace) == 'undefined') MyNamespace = {}; + MyNamespace.MyClass = function () { + var gtParms = { "domain" : 'MyNamespace_MyClass' }; + this.gt = new Gettext(gtParams); + return this; + }; + MyNamespace.MyClass.prototype._ = function (msgid) { + return this.gt.gettext(msgid); + }; + MyNamespace.MyClass.prototype.something = function () { + var myString = this._("this will get translated"); + }; + + // ////////////////////////////////////////////////////////// + // Adding the shortcuts to a global scope is easier. If that's + // ok in your app, this is certainly easier. + var myGettext = new Gettext({ 'domain' : 'myDomain' }); + function _ (msgid) { + return myGettext.gettext(msgid); + } + alert( _("text") ); + + // ////////////////////////////////////////////////////////// + // Data structure of the json data + // NOTE: if you're loading via the + + // in domain.json + json_locale_data = { + "mydomain" : { + // po header fields + "" : { + "plural-forms" : "...", + "lang" : "en", + }, + // all the msgid strings and translations + "msgid" : [ "msgid_plural", "translation", "plural_translation" ], + }, + }; + // please see the included bin/po2json script for the details on this format + +This method also allows you to use unsupported file formats, so long as you can parse them into the above format. + +=item 2. Use AJAX to load language file. + +Use XMLHttpRequest (actually, SJAX - syncronous) to load an external resource. + +Supported external formats are: + +=over + +=item * Javascript Object Notation (.json) + +(see bin/po2json) + + type=application/json + +=item * Uniforum Portable Object (.po) + +(see GNU Gettext's xgettext) + + type=application/x-po + +=item * Machine Object (compiled .po) (.mo) + +NOTE: .mo format isn't actually supported just yet, but support is planned. + +(see GNU Gettext's msgfmt) + + type=application/x-mo + +=back + +=back + +=head1 METHODS + +The following methods are implemented: + + new Gettext(args) + textdomain (domain) + gettext (msgid) + dgettext (domainname, msgid) + dcgettext (domainname, msgid, LC_MESSAGES) + ngettext (msgid, msgid_plural, count) + dngettext (domainname, msgid, msgid_plural, count) + dcngettext (domainname, msgid, msgid_plural, count, LC_MESSAGES) + pgettext (msgctxt, msgid) + dpgettext (domainname, msgctxt, msgid) + dcpgettext (domainname, msgctxt, msgid, LC_MESSAGES) + npgettext (msgctxt, msgid, msgid_plural, count) + dnpgettext (domainname, msgctxt, msgid, msgid_plural, count) + dcnpgettext (domainname, msgctxt, msgid, msgid_plural, count, LC_MESSAGES) + strargs (string, args_array) + + +=head2 new Gettext (args) + +Several methods of loading locale data are included. You may specify a plugin or alternative method of loading data by passing the data in as the "locale_data" option. For example: + + var get_locale_data = function () { + // plugin does whatever to populate locale_data + return locale_data; + }; + var gt = new Gettext( 'domain' : 'messages', + 'locale_data' : get_locale_data() ); + +The above can also be used if locale data is specified in a statically included