diff --git a/README.md b/README.md index 0547d4f..9a48ce6 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,68 @@ -# epubreader-js +# EpubReader -![UI](demo-ui.png) + ## About the Reader -The **epubreader-js** application is based on the [epub.js](https://github.com/futurepress/epub.js) library and is a fork of the [epubjs-reader](https://github.com/futurepress/epubjs-reader) repository. +The epubreader application is based on the epub.js library and is a fork of the epub-reader repository. ## Getting Started -Open up [epubreader-js](https://intity.github.io/epubreader-js/) in a browser. +Open up epubreader in a browser. -You can change the ePub it opens by passing a link to `bookPath` in the url: +You can change the ePub it opens by passing a link to bookPath in the url: -`?bookPath=https://s3.amazonaws.com/epubjs/books/alice.epub` +?bookPath=https://s3.amazonaws.com/epubjs/books/alice.epub + +or to open through path `public/epub-book` folder + +?bookPath=epub-book/[filename].epub ## Running Locally -Install [node.js](https://nodejs.org/en/) +Install node.js -Then install the project dependences with npm +Then install the project dependencies with npm -```javascript +```sh npm install ``` +Next you need to clone the repository into local with below command + +```sh +git clone +``` + +After that, you need to move to repo directory. You can run the reader locally with the command -```javascript -npm run serve +```sh +cd +npm start ``` -Builds are concatenated and minified using [webpack](https://github.com/webpack/webpack) +The application automatically starts at `localhost:8088`. + +Builds are concated and minified using webpack To generate a new build run -```javascript +```sh npm run build ``` -or rebuilding all *.js files +or rebuilding all \*.js files -```javascript +```sh npm run prepare ``` ## Pre-configuration -The **epubreader-js** application settings is a JavaScript object that you pass as an argument to the `Reader` constructor. You can make preliminary settings in the file [index.html](dist/index.html). For example, this is what the default `Reader` initialization looks like: +The epubreader application settings is a JavaScript object that you pass an argument to the `Reader` constructor. You can make prelimitary settings in the file index.html. For example, this is what the default `Reader` initialization looks like: -```html +```js + + + + + + + + Chế độ đọc sách - - - - - - + + + + - - + + + + - - - - - - - - - - - - - \ No newline at end of file + + diff --git a/dist/js/epubreader.js b/dist/js/epubreader.js index 651b5ce..e7d563b 100644 --- a/dist/js/epubreader.js +++ b/dist/js/epubreader.js @@ -584,7 +584,7 @@ __webpack_require__.d(__webpack_exports__, { // EXTERNAL MODULE: ./node_modules/event-emitter/index.js var event_emitter = __webpack_require__(68); -;// ./src/utils.js +;// CONCATENATED MODULE: ./src/utils.js const d = (obj, prop) => obj ? obj[prop] : undefined const q = (src, dst, ext, prop) => { @@ -643,7 +643,7 @@ const detectMobile = () => { ] return matches.some((i) => navigator.userAgent.match(i)) } -;// ./src/storage.js +;// CONCATENATED MODULE: ./src/storage.js class Storage { constructor() { @@ -744,7 +744,7 @@ class Storage { } } } -;// ./src/strings.js +;// CONCATENATED MODULE: ./src/strings.js class Strings { constructor(reader) { @@ -759,6 +759,7 @@ class Strings { "toolbar/openbook/error": "Your browser does not support the required features.\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.", "toolbar/bookmark": "Add this page to bookmarks", "toolbar/fullscreen": "Fullscreen", + "toolbar/background": "Change background", "sidebar/close": "Close Sidebar", "sidebar/contents": "Contents", @@ -797,7 +798,10 @@ class Strings { "sidebar/metadata/direction": "Direction", // page-progression-direction "notedlg/label": "Note", - "notedlg/add": "Add" + "notedlg/add": "Add", + + "status/fullscreen": "Fullscreen", + "status/": "", }, fr: { "toolbar/sidebar": "Barre latérale", @@ -807,6 +811,7 @@ class Strings { "toolbar/openbook/error": "Votre navigateur ne prend pas en charge les fonctions nécessaires.\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.", "toolbar/bookmark": "Insérer un marque page ici", "toolbar/fullscreen": "Plein écran", + "toolbar/background": "Changer l'arrière-plan", "sidebar/close": "???", "sidebar/contents": "Sommaire", @@ -845,7 +850,10 @@ class Strings { "sidebar/metadata/direction": "???", "notedlg/label": "???", - "notedlg/add": "Ajouter" + "notedlg/add": "Ajouter", + + "status/fullscreen": "", + "status/": "", }, ja: { "toolbar/sidebar": "サイドバー", @@ -855,6 +863,7 @@ class Strings { "toolbar/openbook/error": "ご利用のブラウザは必要な機能をサポートしていません。\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。", "toolbar/bookmark": "このページに栞を設定する", "toolbar/fullscreen": "フルスクリーン", + "toolbar/background": "背景を変更する", "sidebar/close": "???", "sidebar/contents": "目次", @@ -893,7 +902,10 @@ class Strings { "sidebar/metadata/direction": "???", "notedlg/label": "???", - "notedlg/add": "追加" + "notedlg/add": "追加", + + "status/fullscreen": "", + "status/": "", }, ru: { "toolbar/sidebar": "Боковая панель", @@ -903,6 +915,7 @@ class Strings { "toolbar/openbook/error": "Ваш браузер не поддерживает необходимые функции.\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.", "toolbar/bookmark": "Добавить эту страницу в закладки", "toolbar/fullscreen": "Полноэкранный режим", + "toolbar/background": "изменить фон", "sidebar/close": "Закрыть боковую панель", "sidebar/contents": "Содержание", @@ -941,7 +954,62 @@ class Strings { "sidebar/metadata/direction": "Направление", "notedlg/label": "Заметка", - "notedlg/add": "Добавить" + "notedlg/add": "Добавить", + + "status/fullscreen": "", + "status/": "", + }, + vi: { + "toolbar/sidebar": "Thanh bên", + "toolbar/prev": "Trang trước", + "toolbar/next": "Trang kế tiếp", + "toolbar/openbook": "Mở sách", + "toolbar/openbook/error": "Trình duyệt của bạn không hỗ trợ các tính năng cần thiết. Vui lòng sử dụng trình duyệt hiện đại như Google Chrome hoặc Mozilla Firefox.", + "toolbar/bookmark": "Thêm trang này vào dấu trang", + "toolbar/fullscreen": "Toàn màn hình", + "toolbar/background": "Đổi màu nền", + + "sidebar/close": "Đóng thanh bên", + "sidebar/contents": "Nội dung", + "sidebar/bookmarks": "Dấu trang", + "sidebar/bookmarks/add": "Thêm dấu trang", + "sidebar/bookmarks/remove": "Xóa dấu trang", + "sidebar/bookmarks/clear": "???", + "sidebar/annotations": "Chú thích", + "sidebar/annotations/add": "Thêm chú thích", + "sidebar/annotations/remove": "Xóa chú thích", + "sidebar/annotations/clear": "???", + "sidebar/annotations/anchor": "???", + "sidebar/annotations/cancel": "???", + "sidebar/search": "Tìm kiếm", + "sidebar/search/placeholder": "???", + "sidebar/settings": "Cài đặt", + "sidebar/settings/language": "Ngôn ngữ", + "sidebar/settings/fontsize": "Cỡ chữ (%)", + "sidebar/settings/flow": "???", + "sidebar/settings/pagination": ["???", "???"], + "sidebar/settings/spread": "???", + "sidebar/settings/spread/minwidth": "????", + "sidebar/metadata": "Metadata", + "sidebar/metadata/title": "Chủ đề", + "sidebar/metadata/creator": "Người sáng tạo", + "sidebar/metadata/description": "Mô tả", + "sidebar/metadata/pubdate": "Ngày tạo", + "sidebar/metadata/publisher": "Nhà xuất bản", + "sidebar/metadata/identifier": "Định dạng", + "sidebar/metadata/language": "Ngôn ngữ", + "sidebar/metadata/rights": "Quyền", + "sidebar/metadata/modified_date": "Ngày sửa đổi", + "sidebar/metadata/layout": "???", // rendition:layout + "sidebar/metadata/flow": "???", // rendition:flow + "sidebar/metadata/spread": "???", // rendition:spread + "sidebar/metadata/direction": "???", // page-progression-direction + + "notedlg/label": "???", + "notedlg/add": "???", + + "status/fullscreen": "Toàn màn hình", + "status/": "", } }; @@ -952,7 +1020,7 @@ class Strings { get(key) { return this.values[this.language][key] || "???"; } } -;// ./src/ui.js +;// CONCATENATED MODULE: ./src/ui.js /** * @author mrdoob https://github.com/mrdoob/ui.js */ @@ -964,10 +1032,10 @@ const ERROR_MSG = "is not an instance of UIElement."; * @param {string} tag */ class UIElement { - + constructor(tag) { - this.dom = document.createElement(tag); + this.dom = document.createElement(tag); } add() { @@ -1125,6 +1193,16 @@ class UIDiv extends UIElement { super("div"); } + + setClass(className) { + this.dom.className = className; + return this; + } + + addClass(className) { + this.dom.classList.add(className); + return this; + } } /** @@ -1717,7 +1795,93 @@ class UIBox extends UIElement { this.add(items); } } -;// ./src/toolbar.js + +/** + * UIButton + * @param {UIButton} items + */ +class UIButton extends UIElement { + constructor(items) { + super("button"); + } +} +;// CONCATENATED MODULE: ./src/sidebar/search.js + + +class SearchPanel extends UIPanel { + + constructor(reader) { + + super(); + const container = new UIDiv().setClass("list-container"); + const strings = reader.strings; + + let searchQuery = undefined; + const search = new UIInput("search").setId("nav-q"); + search.dom.placeholder = strings.get("sidebar/search/placeholder"); + search.dom.onsearch = () => { + + const value = search.getValue(); + + if (value.length === 0) { + this.items.clear(); + } else if (searchQuery !== value) { + this.items.clear(); + this.doSearch(value).then(results => { + + results.forEach(data => { + this.set(data); + }); + }); + } + searchQuery = value; + }; + + this.setId("search"); + this.items = new UIList(); + container.add(this.items); + this.add([new UIBox(search), container]); + this.reader = reader; + this.selector = undefined; + // + // improvement of the highlighting of keywords is required... + // + } + + /** + * Searching the entire book + * @param {*} q Query keyword + * @returns The search result array. + */ + async doSearch(q) { + + const book = this.reader.book; + const results = await Promise.all( + book.spine.spineItems.map(item => item.load(book.load.bind(book)) + .then(item.find.bind(item, q)).finally(item.unload.bind(item)))); + return await Promise.resolve([].concat.apply([], results)); + } + + set(data) { + + const link = new UILink("#" + data.cfi, data.excerpt); + const item = new UIItem(); + link.dom.onclick = () => { + + if (this.selector && this.selector !== item) + this.selector.unselect(); + + item.select(); + this.selector = item; + this.reader.rendition.display(data.cfi); + return false; + }; + item.add(link); + this.items.add(item); + } +} +;// CONCATENATED MODULE: ./src/toolbar.js + class Toolbar { @@ -1735,8 +1899,13 @@ class Toolbar { "toolbar/openbook", "toolbar/openbook/error", "toolbar/bookmark", - "toolbar/fullscreen" + "toolbar/fullscreen", + "toolbar/background", + "toolbar/search", + "toolbar/close", ]; + + /*------------------------ Toolbar Menu 1 --------------------------*/ const menu1 = new UIDiv().setClass("menu-1"); const openerBox = new UIDiv().setId("btn-m").setClass("box"); const openerBtn = new UIInput("button"); @@ -1778,7 +1947,360 @@ class Toolbar { menu1.add(nextBox); } + /* ------------------------ Button Logo ------------------------- */ + const logoBox = new UIDiv().setId("btn-logo").setClass("logo"); + const logoLink = new UILink().setId("logo-link").setHref("#").setTextContent("LOGO"); + + logoBox.add(logoLink); + menu1.add(logoBox); + + /* ------------------------ Button Index List (muc luc) -------------------------- */ + let tocBox, tocBtn; + tocBox = new UIDiv().setId("btn-t").setClass("box"); + tocBtn = new UIInput("button"); + + // load toc content title for toc list + tocBtn.dom.onclick = (e) => { + e.stopPropagation(); + reader.book.loaded.navigation.then((toc) => { + showToc(toc); + }) + } + + tocBox.add(tocBtn); + menu1.add(tocBox); + + // Function to show the toc list + function showToc(toc) { + let existingToc = document.getElementById("toolbar-toc-list"); + + if (existingToc) { + existingToc.remove(); + } else { + let tocList = document.createElement("ul"); + tocList.setAttribute("id", "toolbar-toc-list"); + + let tocTitle = document.createElement("h3"); + tocTitle.textContent = "Mục lục"; + + tocList.appendChild(tocTitle); + + toc.forEach((chapter) => { + let tocItem = document.createElement("li"); + let tocLink = document.createElement("a"); + + tocLink.href = "#"; + tocLink.textContent = chapter.label; + + tocLink.onclick = (e) => { + e.preventDefault(); + + document.querySelectorAll("#toolbar-toc-list li a").forEach((link) => { + link.classList.remove("active"); + }) + + tocLink.classList.add("active"); + + // show the chapter with the title chosed in toc list + reader.rendition.display(chapter.href); + }; + + tocItem.appendChild(tocLink); + tocList.appendChild(tocItem); + }); + + tocBox.dom.appendChild(tocList); + } + + let tocList = document.getElementById("toolbar-toc-list"); + tocList.classList.toggle("active"); + } + + + + /* ------------------------ Button My Bookmark (bookmark cua toi) --------------------------*/ + let bookmarksBox, bookmarksBtn; + bookmarksBox = new UIDiv().setId("btn-d").setClass("box"); + bookmarksBtn = new UIInput("button"); + + bookmarksBtn.dom.onclick = (e) => { + e.stopPropagation(); + showBookmarks(); + } + + bookmarksBox.add(bookmarksBtn); + menu1.add(bookmarksBox); + + function showBookmarks() { + let bookmarksList = document.getElementById("toolbar-bookmarks-list"); + + if (!bookmarksList) { + bookmarksList = document.createElement("ul"); + bookmarksList.setAttribute("id", "toolbar-bookmarks-list"); + bookmarkBox.dom.appendChild(bookmarksList); + } + + updateBookmarksList(); + bookmarksList.classList.toggle("active"); + } + + reader.on("bookmarked", (boolean, cfi) => { + updateBookmarksList(); + }) + + function updateBookmarksList() { + let bookmarksList = document.getElementById("toolbar-bookmarks-list"); + + if (!bookmarksList) return; + + bookmarksList.innerHTML = ""; + + let title = document.createElement("h3"); + title.textContent = "Bookmarks của tui"; + bookmarksList.appendChild(title); + + reader.settings.bookmarks.forEach((cfi, index) => { + let bookmarkItem = document.createElement("li"); + let bookmarkLink = document.createElement("a"); + let deleteBtn = document.createElement("span"); + + bookmarkLink.href = "#"; + bookmarkLink.textContent = `Bookmark ${index + 1}`; + + bookmarkLink.onclick = (e) => { + e.preventDefault(); + + document.querySelectorAll("#toolbar-bookmarks-list li a").forEach((link) => { + link.classList.remove("active"); + }); + + bookmarkLink.classList.add("active"); + + reader.rendition.display(cfi); + }; + + deleteBtn.innerHTML = ''; + deleteBtn.onclick = (e) => { + e.stopPropagation(); + reader.removeBookmarkFromToolbar(cfi); + }; + + bookmarkItem.appendChild(bookmarkLink); + bookmarkItem.appendChild(deleteBtn); + bookmarksList.appendChild(bookmarkItem); + }) + } + + // Hàm xóa bookmark từ toolbar + reader.removeBookmarkFromToolbar = function (cfi) { + + let bookmarksList = document.getElementById("toolbar-bookmarks-list"); + if (!bookmarksList) return; + + let bookmarkItems = bookmarksList.querySelectorAll("li"); + let targetItem = Array.from(bookmarkItems).find(item => { + return item.querySelector("a").textContent.includes(cfi); + }); + + if (targetItem) { + targetItem.remove(); + } + + const index = reader.settings.bookmarks.indexOf(cfi); + if (index !== -1) { + reader.settings.bookmarks.splice(index, 1); + } + + reader.emit("bookmarked", false, cfi); + reader.bookmarksPanel.removeBookmark(cfi); + }; + + + + /* ------------------------ Button Highlight And Note ---------------------------- */ + let annotationsBox, annotationsBtn; + annotationsBox = new UIDiv().setId("btn-a").setClass("box"); + annotationsBtn = new UIInput("button"); + + // show annotations list when click icon on toolbar + annotationsBtn.dom.onclick = (e) => { + e.stopPropagation(); + showAnnotations(); + } + + annotationsBox.add(annotationsBtn); + menu1.add(annotationsBox); + + // Function to show the annotations list + function showAnnotations() { + let existingList = document.getElementById("toolbar-annotations-list"); + + if (!existingList) { + let annotationsList = document.createElement("ul"); + annotationsList.setAttribute("id", "toolbar-annotations-list"); + + let title = document.createElement("h3"); + title.textContent = "Highlights & Ghi chú"; + + annotationsList.appendChild(title); + + reader.settings.annotations.forEach((note) => { + let noteItem = document.createElement("li"); + let noteLink = document.createElement("a"); + let deleteBtn = document.createElement("span"); + + noteLink.href = "#"; + noteLink.textContent = note.text; + + noteLink.onclick = (e) => { + e.preventDefault(); + + document.querySelectorAll("#toolbar-annotations-list li a").forEach((link) => { + link.classList.remove("active"); + }) + + noteLink.classList.add("active"); + + reader.rendition.display(note.cfi); + } + + deleteBtn.innerHTML = ''; + // emit event to delete annotation items + deleteBtn.onclick = (e) => { + e.stopPropagation(); + reader.removeNoteFromToolbar(note); + } + + noteItem.appendChild(noteLink); + noteItem.appendChild(deleteBtn); + annotationsList.appendChild(noteItem); + }) + + annotationsBox.dom.appendChild(annotationsList); + } + + let annotationsList = document.getElementById("toolbar-annotations-list"); + annotationsList.classList.toggle("active"); + } + + reader.removeNoteFromToolbar = function (note) { + let annotationsList = document.getElementById("toolbar-annotations-list"); + if (!annotationsList) return; + + let noteItems = annotationsList.querySelectorAll("li"); + let targetItem = Array.from(noteItems).find(item => { + item.querySelector('a').textContent === note.text; + }) + + if (targetItem) { + targetItem.remove(); + } + + const annotationsPanel = reader.annotationsPanel; + if (annotationsPanel) { + annotationsPanel.removeNote(note); + annotationsPanel.update(); + } + + const index = reader.settings.annotations.findIndex((n) => n.cfi === note.cfi); + if (index !== -1) { + reader.settings.annotations.splice(index, 1); + } + + reader.rendition.annotations.remove(note.cfi, "highlight"); + } + + + + + /* ----------------------------- Current Page -------------------------------- */ + const centerPageCount = new UIDiv().setClass("menu-center"); + + const centerLabel = new UILabel().setClass("toolbar-center-label"); + centerLabel.setTextContent("Determined"); + + const curOfTotal = new UIDiv().setClass("page-map"); + const curPageIndex = new UISpan().setClass("current-page-index").setTextContent("1"); + const separator = new UIText().setTextContent(" của "); + const totalPage = new UISpan().setClass("total-pages").setTextContent("200"); + + curOfTotal.add(curPageIndex); + curOfTotal.add(separator); + curOfTotal.add(totalPage); + + centerPageCount.add(centerLabel); + centerPageCount.add(curOfTotal); + + + + /*------------------------ Toolbar Menu 2 --------------------------*/ const menu2 = new UIDiv().setClass("menu-2"); + // Button change background + let backgroundBox, colorPicker; + if (settings.background) { + // Init elements: background box div, input color picker + backgroundBox = new UIDiv().setId("btn-bg").setClass("box"); + colorPicker = new UIInput("color").setClass("color-picker"); + colorPicker.dom.title = strings.get(keys[7]); + + // Handle event get color from color table of input color + colorPicker.dom.oninput = (e) => { + const selectedColor = e.target.value; + + // Emit 'colorchanged' event with selected color + reader.emit("colorchanged", selectedColor); + } + + backgroundBox.add(colorPicker); + menu2.add(backgroundBox); + } + + + // Button "A-", "A+" and input (hidden) for font-size + let fontLabel = new UILabel().setClass("font-size-px").setTextContent("Fontsize (px):") + let fontSizeBox = new UIDiv().setId("btn-fontsize").setClass("box"); + let decreaseFontBtn = new UIInput("button").setClass("btn-font-decrease"); + let increaseFontBtn = new UIInput("button").setClass("btn-font-increase"); + let fontSizeInput = new UIInput("text").setClass("input-font-size"); + + let fontSize = settings.fontSize || 16; + fontSizeInput.dom.value = fontSize; + + decreaseFontBtn.dom.textContent = "-"; + decreaseFontBtn.dom.onclick = () => { + fontSize = Math.max(8, fontSize - 1); + fontSizeInput.dom.value = fontSize; + + reader.emit("styleschanged", { fontSize: fontSize }); + }; + + increaseFontBtn.dom.textContent = "+"; + increaseFontBtn.dom.onclick = () => { + fontSize = Math.min(72, fontSize + 1); + fontSizeInput.dom.value = fontSize; + + reader.emit("styleschanged", { fontSize: fontSize }); + }; + + fontSizeInput.dom.onchange = () => { + let newSize = parseInt(fontSizeInput.dom.value, 10); + if (!isNaN(newSize) && newSize >= 8 && newSize <= 72) { + fontSize = newSize; + + reader.emit("styleschanged", { fontSize: fontSize }); + } else { + fontSizeInput.dom.value = fontSize; + } + }; + + fontSizeBox.add(fontLabel); + fontSizeBox.add(decreaseFontBtn); + fontSizeBox.add(fontSizeInput); + fontSizeBox.add(increaseFontBtn); + menu2.add(fontSizeBox); + + + // Button open file let openbookBtn; if (settings.openbook) { const onload = (e) => { @@ -1822,6 +2344,91 @@ class Toolbar { menu2.add(openbookBox); } + + // Button search + let searchBox, searchBtn; + let searchInput, searchResults; + searchBox = new UIDiv().setId("btn-s").setClass("box"); + searchBtn = new UIInput("button"); + searchBtn.setTitle(strings.get(keys[8])); + + searchBtn.dom.onclick = (e) => { + e.stopPropagation(); + showSearchPopup(); + } + + searchBox.add(searchBtn); + menu2.add(searchBox); + + function showSearchPopup() { + let existingPopup = document.getElementById("toolbar-search-list"); + if (!existingPopup) { + let searchPopup = document.createElement("div"); + searchPopup.setAttribute("id", "toolbar-search-list"); + searchPopup.classList.add("search-popup"); + + let searchContainer = document.createElement("div"); + searchContainer.classList.add("search-container"); + + let searchIcon = document.createElement("span"); + searchIcon.classList.add("search-icon"); + searchIcon.innerHTML = ''; + + let searchInput = document.createElement("input"); + searchInput.setAttribute("type", "search"); + searchInput.setAttribute("placeholder", "Search"); + searchInput.setAttribute("id", "nav-q"); + searchInput.setAttribute("class", "toolbar-search-input"); + + searchContainer.appendChild(searchIcon); + searchContainer.appendChild(searchInput); + + let resultContainer = document.createElement("ul"); + resultContainer.setAttribute('id', 'toolbar-search-results'); + + let searchPanel = new SearchPanel(reader); + searchInput.oninput = async () => { + let query = searchInput.value.trim(); + if (query.length > 0) { + let results = await searchPanel.doSearch(query); + resultContainer.innerHTML = ""; + + if (results.length === 0) { + let noResultItem = document.createElement("li"); + noResultItem.innerText = "Không tìm thấy kết quả trùng khớp"; + noResultItem.style.color = "gray"; + noResultItem.style.padding = "8px"; + resultContainer.appendChild(noResultItem); + } + + results.forEach((data) => { + let item = document.createElement("li"); + let link = document.createElement("a"); + link.href = "#" + data.cfi; + link.textContent = data.excerpt; + link.onclick = (e) => { + e.preventDefault(); + searchPanel.reader.rendition.display(data.cfi); + } + item.appendChild(link); + resultContainer.appendChild(item); + }) + } else { + resultContainer.innerHTML = ""; + } + } + + searchPopup.appendChild(searchContainer); + searchPopup.appendChild(resultContainer); + searchBox.dom.appendChild(searchPopup); + } + + let searchPopup = document.getElementById("toolbar-search-list"); + searchPopup.classList.toggle("active"); + } + + + // Button Bookmark let bookmarkBox, bookmarkBtn; if (settings.bookmarks) { bookmarkBox = new UIDiv().setId("btn-b").setClass("box"); @@ -1839,6 +2446,7 @@ class Toolbar { menu2.add(bookmarkBox); } + // Button Full Screen let fullscreenBtn; if (settings.fullscreen) { @@ -1874,9 +2482,21 @@ class Toolbar { menu2.add(fullscreenBox); } - container.add([menu1, menu2]); + container.add([menu1, centerPageCount, menu2]); document.body.appendChild(container.dom); + // Button Close + let closeBox, closeBtn; + closeBox = new UIDiv().setId("btn-close").setClass("box"); + closeBtn = new UIInput("button").setClass("active"); + closeBtn.setTitle(strings.get(keys[9])); + + + + closeBox.add(closeBtn); + menu2.add(closeBox); + + //-- events --// reader.on("relocated", (location) => { @@ -1923,6 +2543,10 @@ class Toolbar { if (settings.fullscreen) { fullscreenBtn.setTitle(strings.get(keys[6])); } + if (settings.background) { + backgroundBtn.setTitle(strings.get(keys[7])); + } + }); } @@ -1937,7 +2561,7 @@ class Toolbar { } } } -;// ./src/content.js +;// CONCATENATED MODULE: ./src/content.js class Content { @@ -1956,13 +2580,20 @@ class Content { reader.emit("prev"); e.preventDefault(); }; - prev.add(new UISpan("<")); + const iconLeft = new UISpan(); + iconLeft.dom.innerHTML = ''; + prev.add(iconLeft); container.add(prev); } const viewer = new UIDiv().setId("viewer"); container.add(viewer); + // Handle the 'colorchanged' event to change background of 'viewer' + reader.on("colorchanged", (color) => { + viewer.dom.style.backgroundColor = color; + }); + let next; if (settings.arrows === "content") { next = new UIDiv().setId("next").setClass("arrow"); @@ -1971,7 +2602,9 @@ class Content { reader.emit("next"); e.preventDefault(); }; - next.add(new UISpan(">")); + const iconRight = new UISpan(); + iconRight.dom.innerHTML = ''; + next.add(iconRight); container.add(next); } @@ -2009,7 +2642,7 @@ class Content { }); reader.on("flowchanged", (value) => { - + viewer.setClass(value); }); @@ -2056,7 +2689,7 @@ class Content { }); } } -;// ./src/sidebar/toc.js +;// CONCATENATED MODULE: ./src/sidebar/toc.js class TocPanel extends UIPanel { @@ -2077,11 +2710,14 @@ class TocPanel extends UIPanel { //-- events --// - reader.on("navigation", (toc) => { - - container.clear(); - container.add(this.generateToc(toc)); - this.add(container); + reader.on("bookready", () => { + reader.book.loaded.navigation.then((toc) => { + container.clear(); + container.add(this.generateToc(toc)); + this.add(container); + console.log(toc); + + }) }); reader.on("languagechanged", (value) => { @@ -2147,7 +2783,7 @@ class TocPanel extends UIPanel { return list; } } -;// ./src/sidebar/bookmarks.js +;// CONCATENATED MODULE: ./src/sidebar/bookmarks.js class BookmarksPanel extends UIPanel { @@ -2199,7 +2835,6 @@ class BookmarksPanel extends UIPanel { }); reader.on("bookmarked", (boolean, cfi) => { - if (boolean) { this.appendBookmark(); } else { @@ -2218,15 +2853,16 @@ class BookmarksPanel extends UIPanel { appendBookmark() { const cfi = this.locationCfi; + if (this.reader.isBookmarked(cfi) > -1) { return; } this.setBookmark(cfi); this.reader.settings.bookmarks.push(cfi); + } removeBookmark(cfi) { - const _cfi = cfi || this.locationCfi; const index = this.reader.isBookmarked(_cfi); if (index === -1) { @@ -2243,7 +2879,6 @@ class BookmarksPanel extends UIPanel { } setBookmark(cfi) { - const link = new UILink(); const item = new UIItem(); const btnr = new UISpan().setClass("btn-remove"); @@ -2284,7 +2919,7 @@ class BookmarksPanel extends UIPanel { this.bookmarks.add(item); } } -;// ./src/sidebar/annotations.js +;// CONCATENATED MODULE: ./src/sidebar/annotations.js class AnnotationsPanel extends UIPanel { @@ -2319,7 +2954,7 @@ class AnnotationsPanel extends UIPanel { //-- events --// - reader.on("bookready", (cfg) => { + reader.on("navigation", (cfg) => { cfg.annotations.forEach((note) => { @@ -2329,7 +2964,6 @@ class AnnotationsPanel extends UIPanel { }); reader.on("noteadded", (note) => { - this.set(note); this.update(); }); @@ -2370,6 +3004,29 @@ class AnnotationsPanel extends UIPanel { this.reader.rendition.annotations.add( "highlight", note.cfi, {}, call, "note-highlight", {}); this.update(); + + const toolbarList = document.getElementById("toolbar-annotations-list"); + if (toolbarList) { + const toolbarNoteItem = document.createElement("li"); + const toolbarNoteLink = document.createElement("a"); + toolbarNoteLink.href = "#"; + toolbarNoteLink.textContent = note.text; // sửa lại nếu cần + toolbarNoteLink.onclick = (e) => { + e.preventDefault(); + this.reader.rendition.display(note.cfi); + }; + toolbarNoteItem.appendChild(toolbarNoteLink); + + const deleteBtn = document.createElement("span"); + deleteBtn.innerHTML = ''; + + deleteBtn.onclick = (e) => { + e.stopPropagation(); + this.reader.removeNoteFromToolbar(note); + } + toolbarNoteItem.appendChild(deleteBtn); + toolbarList.appendChild(toolbarNoteItem); + } } removeNote(note) { @@ -2382,6 +3039,16 @@ class AnnotationsPanel extends UIPanel { this.reader.settings.annotations.splice(index, 1); this.reader.rendition.annotations.remove(note.cfi, "highlight"); this.update(); + + const toolbarList = document.getElementById("toolbar-annotations-list"); + if (toolbarList) { + const toolbarItems = toolbarList.querySelectorAll("li"); + toolbarItems.forEach(item => { + if (item.querySelector("a").textContent === note.text) { + item.remove(); + } + }) + } } clearNotes() { @@ -2394,82 +3061,7 @@ class AnnotationsPanel extends UIPanel { this.update(); } } -;// ./src/sidebar/search.js - - -class SearchPanel extends UIPanel { - - constructor(reader) { - - super(); - const container = new UIDiv().setClass("list-container"); - const strings = reader.strings; - - let searchQuery = undefined; - const search = new UIInput("search").setId("nav-q"); - search.dom.placeholder = strings.get("sidebar/search/placeholder"); - search.dom.onsearch = () => { - - const value = search.getValue(); - - if (value.length === 0) { - this.items.clear(); - } else if (searchQuery !== value) { - this.items.clear(); - this.doSearch(value).then(results => { - - results.forEach(data => { - this.set(data); - }); - }); - } - searchQuery = value; - }; - - this.setId("search"); - this.items = new UIList(); - container.add(this.items); - this.add([new UIBox(search), container]); - this.reader = reader; - this.selector = undefined; - // - // improvement of the highlighting of keywords is required... - // - } - - /** - * Searching the entire book - * @param {*} q Query keyword - * @returns The search result array. - */ - async doSearch(q) { - - const book = this.reader.book; - const results = await Promise.all( - book.spine.spineItems.map(item => item.load(book.load.bind(book)) - .then(item.find.bind(item, q)).finally(item.unload.bind(item)))); - return await Promise.resolve([].concat.apply([], results)); - } - - set(data) { - - const link = new UILink("#" + data.cfi, data.excerpt); - const item = new UIItem(); - link.dom.onclick = () => { - - if (this.selector && this.selector !== item) - this.selector.unselect(); - - item.select(); - this.selector = item; - this.reader.rendition.display(data.cfi); - return false; - }; - item.add(link); - this.items.add(item); - } -} -;// ./src/sidebar/settings.js +;// CONCATENATED MODULE: ./src/sidebar/settings.js class SettingsPanel extends UIPanel { @@ -2497,7 +3089,8 @@ class SettingsPanel extends UIPanel { en: "English", fr: "French", ja: "Japanese", - ru: "Russian" + ru: "Russian", + vi: "Vietnamese" }); language.dom.onchange = (e) => { @@ -2509,16 +3102,22 @@ class SettingsPanel extends UIPanel { const fontSizeLabel = new UILabel(strings.get(keys[2]), "fontsize"); const fontSizeRow = new UIRow(); - const fontSize = new UINumber(100, 1); + const fontSize = new UINumber(16, 1); + fontSize.dom.onchange = (e) => { + const newSize = parseInt(e.target.value); - reader.emit("styleschanged", { - fontSize: parseInt(e.target.value) - }); + if (newSize >= 8 && newSize <= 72) { + reader.emit("styleschanged", { + fontSize: newSize + }); + } }; - fontSize.setId("fontsize") + + fontSize.setId("fontsize"); fontSizeRow.add(fontSizeLabel); fontSizeRow.add(fontSize); + fontSize.dom.disabled = true; //-- flow configure --// @@ -2640,7 +3239,7 @@ class SettingsPanel extends UIPanel { }); } } -;// ./src/sidebar/metadata.js +;// CONCATENATED MODULE: ./src/sidebar/metadata.js class MetadataPanel extends UIPanel { @@ -2706,7 +3305,7 @@ class MetadataPanel extends UIPanel { }); } } -;// ./src/sidebar.js +;// CONCATENATED MODULE: ./src/sidebar.js @@ -2747,11 +3346,16 @@ class Sidebar { container.addTab("btn-t", strings.get(keys[1]), new TocPanel(reader)); if (controls.bookmarks) { - container.addTab("btn-d", strings.get(keys[2]), new BookmarksPanel(reader)); + const bookmarkPanel = new BookmarksPanel(reader); + container.addTab("btn-d", strings.get(keys[2]), bookmarkPanel); + reader.bookmarksPanel = bookmarkPanel; } if (controls.annotations) { - container.addTab("btn-a", strings.get(keys[3]), new AnnotationsPanel(reader)); + const annotationPanel = new AnnotationsPanel(reader); + container.addTab("btn-a", strings.get(keys[3]), annotationPanel); + reader.annotationsPanel = annotationPanel; } + container.addTab("btn-s", strings.get(keys[4]), new SearchPanel(reader)); container.addTab("btn-c", strings.get(keys[5]), new SettingsPanel(reader)); container.addTab("btn-i", strings.get(keys[6]), new MetadataPanel(reader)); @@ -2786,7 +3390,7 @@ class Sidebar { }); } } -;// ./src/notedlg.js +;// CONCATENATED MODULE: ./src/notedlg.js @@ -2859,7 +3463,164 @@ class NoteDlg { }); } } -;// ./src/reader.js +;// CONCATENATED MODULE: ./src/status.js + + +class Status { + constructor(reader) { + const strings = reader.strings; + const settings = reader.settings; + + const container = new UIDiv().setId("status-bar"); + const keys = [ + "status/fullscreen", + "status/apprec", + ]; + + /* ---------------------------- Status Bar ----------------------------- */ + const leftText = new UIDiv().setClass("status-title"); + const rightAction = new UIDiv().setClass("status-action"); + + let text = new UILabel().setClass("status-text").setTextContent("Trang cuối của chương"); + leftText.add(text); + + + // Button apps rectangle + let appRecBtn; + const appRecBox = new UIDiv().setId("btn-ar").setClass("box"); + appRecBtn = new UIInput("button"); + appRecBtn.setTitle(strings.get(keys[1])); + + appRecBtn.dom.onclick = (e) => { + e.preventDefault(); + toggleBookList(); + }; + + appRecBox.add(appRecBtn); + rightAction.add(appRecBox); + + function toggleBookList() { + const bookList = [ + { title: "Determined", author: "Robert M. Sapolsky", page: 1 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 2 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 3 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 4 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 5 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 6 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 7 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 8 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 9 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 10 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 11 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 12 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 13 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 14 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 15 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 16 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 17 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 18 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 19 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 20 }, + ]; + + let existingModal = document.getElementById('book-list-modal'); + if (!existingModal) { + let modal = document.createElement('div'); + modal.setAttribute('id', 'book-list-modal'); + modal.setAttribute('class', 'book-modal'); + + let modalContent = document.createElement('div'); + modalContent.setAttribute('class', 'book-modal-content'); + + let bookGrid = document.createElement('div'); + bookGrid.setAttribute('class', 'book-grid'); + bookList.forEach((book) => { + let bookItem = document.createElement('div'); + bookItem.setAttribute('class', 'book-item'); + bookItem.innerHTML = ` +
+

${book.title}

+

${book.author}

+
+
${book.page}
+ `; + bookGrid.appendChild(bookItem); + }); + + modalContent.appendChild(bookGrid); + modal.appendChild(modalContent); + + container.dom.appendChild(modal); + } + + let modal = document.getElementById('book-list-modal'); + modal.classList.toggle("active"); + } + + + // Button Full Screen + let fullscreenBtn; + if (settings.fullscreen) { + + const fullscreenBox = new UIDiv().setId("btn-f").setClass("box"); + fullscreenBtn = new UIInput("button"); + fullscreenBtn.setTitle(strings.get(keys[0])); + fullscreenBtn.dom.onclick = (e) => { + + this.toggleFullScreen(); + e.preventDefault(); + }; + + document.onkeydown = (e) => { + + if (e.key === "F11") { + e.preventDefault(); + this.toggleFullScreen(); + } + }; + + document.onfullscreenchange = (e) => { + + // const w = window.screen.width === e.target.clientWidth; + // const h = window.screen.height === e.target.clientHeight; + + if (document.fullscreenElement) { + fullscreenBox.addClass("resize-small"); + } else { + fullscreenBox.removeClass("resize-small"); + } + }; + + + fullscreenBox.add(fullscreenBtn); + rightAction.add(fullscreenBox); + } + + reader.on("languagechanged", (value) => { + if (settings.fullscreen) { + fullscreenBtn.setTitle(strings.get(keys[0])); + } + }); + + + container.add([leftText, rightAction]); + document.body.appendChild(container.dom); + } + + toggleFullScreen() { + + document.activeElement.blur(); + + if (document.fullscreenElement === null) { + document.documentElement.requestFullscreen(); + } else if (document.exitFullscreen) { + document.exitFullscreen(); + } + } +} + +;// CONCATENATED MODULE: ./src/reader.js + @@ -2887,6 +3648,7 @@ class Reader { this.strings = new Strings(this); this.toolbar = new Toolbar(this); this.content = new Content(this); + this.status = new Status(this); this.sidebar = new Sidebar(this); if (this.settings.annotations) { this.notedlg = new NoteDlg(this); @@ -2963,7 +3725,7 @@ class Reader { }); this.book.loaded.navigation.then((toc) => { - this.emit("navigation", toc); + this.emit("bookready", toc); }); this.rendition.on("click", (e) => { @@ -3025,7 +3787,7 @@ class Reader { this.on("styleschanged", (value) => { const fontSize = value.fontSize; this.settings.styles.fontSize = fontSize; - this.rendition.themes.fontSize(fontSize + "%"); + this.rendition.themes.fontSize(fontSize + "px"); }); } @@ -3051,7 +3813,6 @@ class Reader { * @returns The index of the bookmark if it exists, or -1 otherwise. */ isBookmarked(cfi) { - return this.settings.bookmarks.indexOf(cfi); } @@ -3089,10 +3850,11 @@ class Reader { min: 800 }, styles: { - fontSize: 100 + fontSize: 16 // Default fontsize by 'px' }, pagination: undefined, // not implemented - fullscreen: document.fullscreenEnabled + fullscreen: document.fullscreenEnabled, + background: [], // Setting for change background "viewer" }; extend(settings || {}, this.settings); @@ -3166,6 +3928,7 @@ class Reader { delete cfg.openbook; delete cfg.pagination; delete cfg.fullscreen; + delete cfg.background; localStorage.setItem(this.entryKey, JSON.stringify(cfg)); } @@ -3200,7 +3963,7 @@ class Reader { keyboardHandler(e) { - const step = 2; + const step = 1; let value = this.settings.styles.fontSize; switch (e.key) { @@ -3215,7 +3978,7 @@ class Reader { this.emit("styleschanged", { fontSize: value }); break; case "0": - value = 100; + value = 16; this.emit("styleschanged", { fontSize: value }); break; case "ArrowLeft": diff --git a/dist/js/epubreader.js.map b/dist/js/epubreader.js.map index 9f09115..52daac5 100644 --- a/dist/js/epubreader.js.map +++ b/dist/js/epubreader.js.map @@ -1 +1 @@ -{"version":3,"file":"js/epubreader.js","mappings":";;;;;AAAa;;AAEb,sBAAsB,mBAAO,CAAC,GAAe;AAC7C,sBAAsB,mBAAO,CAAC,GAAwB;AACtD,sBAAsB,mBAAO,CAAC,GAAuB;AACrD,sBAAsB,mBAAO,CAAC,GAAkC;AAChE,sBAAsB,mBAAO,CAAC,GAA2B;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,UAAU;AACV;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,UAAU;AACV;AACA;;;;;;;;AC7Da;;AAEb;AACA;;;;;;;;ACHa;;AAEb,iBAAiB,mBAAO,CAAC,GAAkB,sBAAsB,mBAAO,CAAC,GAAQ;;;;;;;;ACFpE;;AAEb;AACA;AACA;AACA,SAAS;AACT,eAAe,YAAY,IAAI,cAAc;AAC7C;AACA;;;;;;;;ACRa;;AAEb,YAAY,mBAAO,CAAC,EAAS;AAC7B,YAAY,mBAAO,CAAC,GAAgB;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBa;;AAEb,iBAAiB,mBAAO,CAAC,EAAkB,KAAK;;AAEhD,kCAAkC;;;;;;;;ACJrB;;AAEb,iBAAiB,mBAAO,CAAC,GAAkB,oBAAoB,mBAAO,CAAC,GAAQ;;;;;;;;ACFlE;;AAEb;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;ACTa;;AAEb,cAAc,mBAAO,CAAC,GAAa;;AAEnC;;AAEA,qCAAqC;;;;;;;;ACNxB;;AAEb,cAAc,mBAAO,CAAC,GAAY;;AAElC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;;;;;;;;ACnBa;;AAEb;AACA;AACA;AACA;;;;;;;;ACLa;;AAEb,cAAc,mBAAO,CAAC,GAAY;;AAElC;AACA;AACA;AACA;;;;;;;;ACPa;;AAEb,iBAAiB,mBAAO,CAAC,GAAkB,kCAAkC,mBAAO,CAAC,GAAQ;;;;;;;;ACFhF;;AAEb;;AAEA;AACA;AACA;AACA;;;;;;;;ACPa;;AAEb;;AAEA;AACA;AACA;;;;;;;;ACNa;;AAEb,eAAe,mBAAO,CAAC,GAAG;AAC1B,eAAe,mBAAO,CAAC,GAA+B;;AAEtD;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,4BAA4B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;;AAErB;AACA,cAAc,2BAA2B;AACzC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe;;;;;;;;ACnIF;;AAEb,kBAAkB,mBAAO,CAAC,GAAiB;;AAE3C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;;;;;;;AClBa;;AAEb,cAAc,mBAAO,CAAC,GAAa;;AAEnC;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;;;;;;;;ACVa;;AAEb,iBAAiB,mBAAO,CAAC,EAAgB;;AAEzC,4BAA4B,EAAE;;AAE9B;AACA;AACA;AACA;AACA;;;;;;;;ACVa;;AAEb,eAAe,mBAAO,CAAC,GAAc;;AAErC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;ACZa;;AAEb;AACA;;AAEA,oCAAoC;;;;;;;SCLpC;SACA;;SAEA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;;SAEA;SACA;;SAEA;SACA;SACA;;;;;UCtBA;UACA;UACA;UACA;UACA,yCAAyC,wCAAwC;UACjF;UACA;UACA;;;;;UCPA;;;;;UCAA;UACA;UACA;UACA,uDAAuD,iBAAiB;UACxE;UACA,gDAAgD,aAAa;UAC7D;;;;;;;;;;;;;;;;ACNA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gCAAgC,mBAAmB;AACnD;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,mBAAmB;AACpD;AACA;AACA;;ACnGO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA,YAAY;AACZ;;AC9MA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;AACP;AACA;;AAEA;AACA;;AAEA;;AAEA,kBAAkB,sBAAsB;;AAExC;;AAEA;;AAEA;;AAEA,KAAK;;AAEL,oBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,sBAAsB;;AAExC;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,GAAG;AACd;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,IAAI;AACJ;AACA,qDAAqD,KAAK;AAC1D;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,eAAe;AAC1B;AACO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA,yCAAyC;AACzC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,WAAW;AACtB;AACO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;;AC3vByC;;AAElC;;AAEP;;AAEA;AACA;;AAEA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,KAAK;AACzB,wBAAwB,KAAK;AAC7B,wBAAwB,OAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,KAAK;AACtB,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,KAAK;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,KAAK;AACL;AACA;AACA;AACA;AACA,2BAA2B,KAAK;AAChC,qBAAqB,OAAO;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,KAAK;AAC1B,qBAAqB,OAAO;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6BAA6B,KAAK;AAClC,uBAAuB,OAAO;AAC9B;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AC1NwC;;AAEjC;;AAEP;;AAEA;AACA,wBAAwB,KAAK;;AAE7B;AACA;;AAEA,cAAc,KAAK;AACnB;;AAEA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;;AAEA,qBAAqB,KAAK;AAC1B;;AAEA;AACA;AACA,cAAc,KAAK;AACnB;;AAEA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;;AAEA,qBAAqB,KAAK;AAC1B,sBAAsB,KAAK;AAC3B,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;AACH;AACA;;ACrHyF;;AAElF,uBAAuB,OAAO;;AAErC;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B;AACA,6BAA6B;AAC7B;AACA,eAAe,KAAK;;AAEpB;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;AACH;;AAEA;;AAEA,mBAAmB,MAAM;;AAEzB;;AAEA,oBAAoB,MAAM;AAC1B,oBAAoB,MAAM;AAC1B,oBAAoB,MAAM;;AAE1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;ACzFyG;;AAElG,6BAA6B,OAAO;;AAE3C;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC,uBAAuB,OAAO;AAC9B;;AAEA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA,uBAAuB,MAAM;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;;AAEA,0CAA0C;AAC1C,GAAG;;AAEH;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;ACvI8G;;AAEvG,+BAA+B,OAAO;;AAE7C;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC,uBAAuB,OAAO;AAC9B;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AC5GkF;;AAE3E,0BAA0B,OAAO;;AAExC;;AAEA;AACA,wBAAwB,KAAK;AAC7B;;AAEA;AACA,qBAAqB,OAAO;AAC5B;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;;AAEA;AACA,mBAAmB,MAAM;AACzB;AACA,gBAAgB,KAAK;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEsG;;AAE/F,4BAA4B,OAAO;;AAE1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC,eAAe,KAAK;;AAEpB,4BAA4B,OAAO;AACnC,0BAA0B,KAAK;AAC/B,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,OAAO;AACnC,0BAA0B,KAAK;AAC/B,uBAAuB,QAAQ;AAC/B;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,OAAO;AAC/B,sBAAsB,KAAK;AAC3B,mBAAmB,QAAQ;AAC3B;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6BAA6B,QAAQ;AACrC,0BAA0B,OAAO;AACjC,wBAAwB,KAAK;AAC7B,qBAAqB,QAAQ;AAC7B;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA,kCAAkC,OAAO;AACzC,gCAAgC,KAAK;AACrC;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B,KAAK;AACjC,yBAAyB,OAAO;AAChC;AACA;;AAEA;AACA;;AAEA,wBAAwB,OAAO;AAC/B;;AAEA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;ACzKyE;;AAElE,4BAA4B,OAAO;;AAE1C;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,eAAe,KAAK;AACpB;;AAEA,mBAAmB,MAAM;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,qBAAqB,MAAM;AAC3B,qBAAqB,MAAM;AAC3B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AChEwD;AACZ;AACY;AACI;AACV;AACI;AACA;;AAE/C;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,aAAa;;AAErC,wBAAwB,KAAK;AAC7B,wBAAwB,OAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD,QAAQ;AAC9D;AACA,uDAAuD,cAAc;AACrE;AACA;AACA,uDAAuD,gBAAgB;AACvE;AACA,sDAAsD,WAAW;AACjE,sDAAsD,aAAa;AACnE,sDAAsD,aAAa;AACnE;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AC9EkC;AACuB;;AAElD;;AAEP;;AAEA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC,4BAA4B,OAAO;AACnC;;AAEA;AACA;AACA;;AAEA,2BAA2B,OAAO;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,0BAA0B,KAAK;AAC/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA,SAAS;AACT;AACA;;ACvEyC;;AAES;AACX;AACA;AACA;AACA;AACA;AACA;;AAEhC;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;;AAEA;AACA,kBAAkB,YAAY;AAC9B,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf,YAAY,GAAG;AACf;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,GAAG;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,KAAK;AACjB,YAAY,KAAK;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE,MAAM,eAAe;;AAEvB;AACA,yCAAyC;AACzC,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG,MAAM;AACT;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAY,mB","sources":["webpack://epubreader-js/./node_modules/d/index.js","webpack://epubreader-js/./node_modules/es5-ext/function/noop.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/is-value.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/normalize-options.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-callable.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-value.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/index.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/shim.js","webpack://epubreader-js/./node_modules/event-emitter/index.js","webpack://epubreader-js/./node_modules/type/function/is.js","webpack://epubreader-js/./node_modules/type/object/is.js","webpack://epubreader-js/./node_modules/type/plain-function/is.js","webpack://epubreader-js/./node_modules/type/prototype/is.js","webpack://epubreader-js/./node_modules/type/value/is.js","webpack://epubreader-js/webpack/bootstrap","webpack://epubreader-js/webpack/runtime/define property getters","webpack://epubreader-js/webpack/runtime/hasOwnProperty shorthand","webpack://epubreader-js/webpack/runtime/make namespace object","webpack://epubreader-js/./src/utils.js","webpack://epubreader-js/./src/storage.js","webpack://epubreader-js/./src/strings.js","webpack://epubreader-js/./src/ui.js","webpack://epubreader-js/./src/toolbar.js","webpack://epubreader-js/./src/content.js","webpack://epubreader-js/./src/sidebar/toc.js","webpack://epubreader-js/./src/sidebar/bookmarks.js","webpack://epubreader-js/./src/sidebar/annotations.js","webpack://epubreader-js/./src/sidebar/search.js","webpack://epubreader-js/./src/sidebar/settings.js","webpack://epubreader-js/./src/sidebar/metadata.js","webpack://epubreader-js/./src/sidebar.js","webpack://epubreader-js/./src/notedlg.js","webpack://epubreader-js/./src/reader.js"],"sourcesContent":["\"use strict\";\n\nvar isValue = require(\"type/value/is\")\n , isPlainFunction = require(\"type/plain-function/is\")\n , assign = require(\"es5-ext/object/assign\")\n , normalizeOpts = require(\"es5-ext/object/normalize-options\")\n , contains = require(\"es5-ext/string/#/contains\");\n\nvar d = (module.exports = function (dscr, value/*, options*/) {\n\tvar c, e, w, options, desc;\n\tif (arguments.length < 2 || typeof dscr !== \"string\") {\n\t\toptions = value;\n\t\tvalue = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[2];\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t\tw = contains.call(dscr, \"w\");\n\t} else {\n\t\tc = w = true;\n\t\te = false;\n\t}\n\n\tdesc = { value: value, configurable: c, enumerable: e, writable: w };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n});\n\nd.gs = function (dscr, get, set/*, options*/) {\n\tvar c, e, options, desc;\n\tif (typeof dscr !== \"string\") {\n\t\toptions = set;\n\t\tset = get;\n\t\tget = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[3];\n\t}\n\tif (!isValue(get)) {\n\t\tget = undefined;\n\t} else if (!isPlainFunction(get)) {\n\t\toptions = get;\n\t\tget = set = undefined;\n\t} else if (!isValue(set)) {\n\t\tset = undefined;\n\t} else if (!isPlainFunction(set)) {\n\t\toptions = set;\n\t\tset = undefined;\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t} else {\n\t\tc = true;\n\t\te = false;\n\t}\n\n\tdesc = { get: get, set: set, configurable: c, enumerable: e };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n};\n","\"use strict\";\n\n// eslint-disable-next-line no-empty-function\nmodule.exports = function () {};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.assign : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\tvar assign = Object.assign, obj;\n\tif (typeof assign !== \"function\") return false;\n\tobj = { foo: \"raz\" };\n\tassign(obj, { bar: \"dwa\" }, { trzy: \"trzy\" });\n\treturn obj.foo + obj.bar + obj.trzy === \"razdwatrzy\";\n};\n","\"use strict\";\n\nvar keys = require(\"../keys\")\n , value = require(\"../valid-value\")\n , max = Math.max;\n\nmodule.exports = function (dest, src /*, …srcn*/) {\n\tvar error, i, length = max(arguments.length, 2), assign;\n\tdest = Object(value(dest));\n\tassign = function (key) {\n\t\ttry {\n\t\t\tdest[key] = src[key];\n\t\t} catch (e) {\n\t\t\tif (!error) error = e;\n\t\t}\n\t};\n\tfor (i = 1; i < length; ++i) {\n\t\tsrc = arguments[i];\n\t\tkeys(src).forEach(assign);\n\t}\n\tif (error !== undefined) throw error;\n\treturn dest;\n};\n","\"use strict\";\n\nvar _undefined = require(\"../function/noop\")(); // Support ES3 engines\n\nmodule.exports = function (val) { return val !== _undefined && val !== null; };\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.keys : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\ttry {\n\t\tObject.keys(\"primitive\");\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\nvar isValue = require(\"../is-value\");\n\nvar keys = Object.keys;\n\nmodule.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nvar forEach = Array.prototype.forEach, create = Object.create;\n\nvar process = function (src, obj) {\n\tvar key;\n\tfor (key in src) obj[key] = src[key];\n};\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = function (opts1 /*, …options*/) {\n\tvar result = create(null);\n\tforEach.call(arguments, function (options) {\n\t\tif (!isValue(options)) return;\n\t\tprocess(Object(options), result);\n\t});\n\treturn result;\n};\n","\"use strict\";\n\nmodule.exports = function (fn) {\n\tif (typeof fn !== \"function\") throw new TypeError(fn + \" is not a function\");\n\treturn fn;\n};\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) throw new TypeError(\"Cannot use null or undefined\");\n\treturn value;\n};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? String.prototype.contains : require(\"./shim\");\n","\"use strict\";\n\nvar str = \"razdwatrzy\";\n\nmodule.exports = function () {\n\tif (typeof str.contains !== \"function\") return false;\n\treturn str.contains(\"dwa\") === true && str.contains(\"foo\") === false;\n};\n","\"use strict\";\n\nvar indexOf = String.prototype.indexOf;\n\nmodule.exports = function (searchString /*, position*/) {\n\treturn indexOf.call(this, searchString, arguments[1]) > -1;\n};\n","'use strict';\n\nvar d = require('d')\n , callable = require('es5-ext/object/valid-callable')\n\n , apply = Function.prototype.apply, call = Function.prototype.call\n , create = Object.create, defineProperty = Object.defineProperty\n , defineProperties = Object.defineProperties\n , hasOwnProperty = Object.prototype.hasOwnProperty\n , descriptor = { configurable: true, enumerable: false, writable: true }\n\n , on, once, off, emit, methods, descriptors, base;\n\non = function (type, listener) {\n\tvar data;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) {\n\t\tdata = descriptor.value = create(null);\n\t\tdefineProperty(this, '__ee__', descriptor);\n\t\tdescriptor.value = null;\n\t} else {\n\t\tdata = this.__ee__;\n\t}\n\tif (!data[type]) data[type] = listener;\n\telse if (typeof data[type] === 'object') data[type].push(listener);\n\telse data[type] = [data[type], listener];\n\n\treturn this;\n};\n\nonce = function (type, listener) {\n\tvar once, self;\n\n\tcallable(listener);\n\tself = this;\n\ton.call(this, type, once = function () {\n\t\toff.call(self, type, once);\n\t\tapply.call(listener, this, arguments);\n\t});\n\n\tonce.__eeOnceListener__ = listener;\n\treturn this;\n};\n\noff = function (type, listener) {\n\tvar data, listeners, candidate, i;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return this;\n\tdata = this.__ee__;\n\tif (!data[type]) return this;\n\tlisteners = data[type];\n\n\tif (typeof listeners === 'object') {\n\t\tfor (i = 0; (candidate = listeners[i]); ++i) {\n\t\t\tif ((candidate === listener) ||\n\t\t\t\t\t(candidate.__eeOnceListener__ === listener)) {\n\t\t\t\tif (listeners.length === 2) data[type] = listeners[i ? 0 : 1];\n\t\t\t\telse listeners.splice(i, 1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ((listeners === listener) ||\n\t\t\t\t(listeners.__eeOnceListener__ === listener)) {\n\t\t\tdelete data[type];\n\t\t}\n\t}\n\n\treturn this;\n};\n\nemit = function (type) {\n\tvar i, l, listener, listeners, args;\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return;\n\tlisteners = this.__ee__[type];\n\tif (!listeners) return;\n\n\tif (typeof listeners === 'object') {\n\t\tl = arguments.length;\n\t\targs = new Array(l - 1);\n\t\tfor (i = 1; i < l; ++i) args[i - 1] = arguments[i];\n\n\t\tlisteners = listeners.slice();\n\t\tfor (i = 0; (listener = listeners[i]); ++i) {\n\t\t\tapply.call(listener, this, args);\n\t\t}\n\t} else {\n\t\tswitch (arguments.length) {\n\t\tcase 1:\n\t\t\tcall.call(listeners, this);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tcall.call(listeners, this, arguments[1]);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tcall.call(listeners, this, arguments[1], arguments[2]);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tl = arguments.length;\n\t\t\targs = new Array(l - 1);\n\t\t\tfor (i = 1; i < l; ++i) {\n\t\t\t\targs[i - 1] = arguments[i];\n\t\t\t}\n\t\t\tapply.call(listeners, this, args);\n\t\t}\n\t}\n};\n\nmethods = {\n\ton: on,\n\tonce: once,\n\toff: off,\n\temit: emit\n};\n\ndescriptors = {\n\ton: d(on),\n\tonce: d(once),\n\toff: d(off),\n\temit: d(emit)\n};\n\nbase = defineProperties({}, descriptors);\n\nmodule.exports = exports = function (o) {\n\treturn (o == null) ? create(base) : defineProperties(Object(o), descriptors);\n};\nexports.methods = methods;\n","\"use strict\";\n\nvar isPrototype = require(\"../prototype/is\");\n\nmodule.exports = function (value) {\n\tif (typeof value !== \"function\") return false;\n\n\tif (!hasOwnProperty.call(value, \"length\")) return false;\n\n\ttry {\n\t\tif (typeof value.length !== \"number\") return false;\n\t\tif (typeof value.call !== \"function\") return false;\n\t\tif (typeof value.apply !== \"function\") return false;\n\t} catch (error) {\n\t\treturn false;\n\t}\n\n\treturn !isPrototype(value);\n};\n","\"use strict\";\n\nvar isValue = require(\"../value/is\");\n\n// prettier-ignore\nvar possibleTypes = { \"object\": true, \"function\": true, \"undefined\": true /* document.all */ };\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) return false;\n\treturn hasOwnProperty.call(possibleTypes, typeof value);\n};\n","\"use strict\";\n\nvar isFunction = require(\"../function/is\");\n\nvar classRe = /^\\s*class[\\s{/}]/, functionToString = Function.prototype.toString;\n\nmodule.exports = function (value) {\n\tif (!isFunction(value)) return false;\n\tif (classRe.test(functionToString.call(value))) return false;\n\treturn true;\n};\n","\"use strict\";\n\nvar isObject = require(\"../object/is\");\n\nmodule.exports = function (value) {\n\tif (!isObject(value)) return false;\n\ttry {\n\t\tif (!value.constructor) return false;\n\t\treturn value.constructor.prototype === value;\n\t} catch (error) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\n// ES3 safe\nvar _undefined = void 0;\n\nmodule.exports = function (value) { return value !== _undefined && value !== null; };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const d = (obj, prop) => obj ? obj[prop] : undefined\n\nconst q = (src, dst, ext, prop) => {\n let val\n if (typeof dst[prop] === \"boolean\") {\n switch (prop) {\n case \"annotations\":\n case \"bookmarks\":\n val = dst[prop] ? src[prop] : dst[prop]\n break;\n default:\n val = dst[prop]\n break;\n }\n } else if (prop === \"arrows\") {\n val = dst[prop]\n } else {\n val = d(ext, prop) === undefined ? src[prop] : dst[prop]\n }\n return val\n}\n\nexport const extend = (src, dst, ext) => {\n for (let prop in src) {\n if (prop === \"bookPath\") {\n continue\n } else if (dst[prop] instanceof Array) {\n dst[prop] = ext ? (src[prop] ? src[prop] : dst[prop]) : src[prop]\n } else if (dst[prop] instanceof Object) {\n extend(src[prop], dst[prop], d(ext, prop)) // recursive call\n } else {\n dst[prop] = ext ? q(src, dst, ext, prop) : src[prop]\n }\n }\n}\n\nexport const uuid = () => {\n let d = new Date().getTime()\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n let r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === \"x\" ? r : (r & 0x7 | 0x8)).toString(16)\n })\n return uuid\n}\n\nexport const detectMobile = () => {\n const matches = [\n /Android/i,\n /BlackBerry/i,\n /iPhone/i,\n /iPad/i,\n /iPod/i,\n /Windows Phone/i,\n /webOS/i\n ]\n return matches.some((i) => navigator.userAgent.match(i))\n}","export class Storage {\n\n\tconstructor() {\n\n\t\tthis.name = \"epubreader-js\";\n\t\tthis.version = 1.0;\n\t\tthis.db;\n\t\tthis.indexedDB = window.indexedDB ||\n\t\t\twindow.webkitIndexedDB ||\n\t\t\twindow.mozIndexedDB ||\n\t\t\twindow.OIndexedDB ||\n\t\t\twindow.msIndexedDB;\n\n\t\tif (this.indexedDB === undefined) {\n\n\t\t\tconsole.error(\"The IndexedDB API not available in your browser.\");\n\t\t}\n\t}\n\n\tinit(callback) {\n\n\t\tif (this.indexedDB === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst onerror = (e) => console.error(\"IndexedDB\", e);\n\t\tconst request = indexedDB.open(this.name, this.version);\n\t\trequest.onupgradeneeded = (e) => {\n\n\t\t\tconst db = e.target.result;\n\t\t\tif (db.objectStoreNames.contains(\"entries\") === false) {\n\t\t\t\tdb.createObjectStore(\"entries\");\n\t\t\t}\n\t\t}\n\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tthis.db = e.target.result;\n\t\t\tthis.db.onerror = onerror;\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.init: ${Date.now() - time} ms`);\n\t\t}\n\n\t\trequest.onerror = onerror;\n\t}\n\n\tget(callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.get(0);\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tcallback(e.target.result);\n\t\t\tconsole.log(`storage.get: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tset(data, callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.put(data, 0);\n\t\trequest.onsuccess = () => {\n\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.set: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tclear() {\n\n\t\tif (this.db === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.clear();\n\t\trequest.onsuccess = () => {\n\n\t\t\tconsole.log(`storage.clear: ${Date.now() - time} ms`);\n\t\t}\n\t}\n}","export class Strings {\n\n\tconstructor(reader) {\n\n\t\tthis.language = reader.settings.language || \"en\";\n\t\tthis.values = {\n\t\t\ten: {\n\t\t\t\t\"toolbar/sidebar\": \"Sidebar\",\n\t\t\t\t\"toolbar/prev\": \"Previous page\",\n\t\t\t\t\"toolbar/next\": \"Next page\",\n\t\t\t\t\"toolbar/openbook\": \"Open book\",\n\t\t\t\t\"toolbar/openbook/error\": \"Your browser does not support the required features.\\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Add this page to bookmarks\",\n\t\t\t\t\"toolbar/fullscreen\": \"Fullscreen\",\n\n\t\t\t\t\"sidebar/close\": \"Close Sidebar\",\n\t\t\t\t\"sidebar/contents\": \"Contents\",\n\t\t\t\t\"sidebar/bookmarks\": \"Bookmarks\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Add\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Remove\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Add\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Remove\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Anchor\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Cancel\",\n\t\t\t\t\"sidebar/search\": \"Search\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Search\",\n\t\t\t\t\"sidebar/settings\": \"Settings\",\n\t\t\t\t\"sidebar/settings/language\": \"Language\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Font size (%)\",\n\t\t\t\t\"sidebar/settings/flow\": \"Flow\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Generate pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Spread\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Minimum spread width\",\n\t\t\t\t\"sidebar/metadata\": \"Metadata\",\n\t\t\t\t\"sidebar/metadata/title\": \"Title\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Creator\",\n\t\t\t\t\"sidebar/metadata/description\": \"Description\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Pubdate\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Publisher\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Identifier\",\n\t\t\t\t\"sidebar/metadata/language\": \"Language\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Rights\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Modified date\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Layout\", // rendition:layout\n\t\t\t\t\"sidebar/metadata/flow\": \"Flow\", // rendition:flow\n\t\t\t\t\"sidebar/metadata/spread\": \"Spread\", // rendition:spread\n\t\t\t\t\"sidebar/metadata/direction\": \"Direction\", // page-progression-direction\n\n\t\t\t\t\"notedlg/label\": \"Note\",\n\t\t\t\t\"notedlg/add\": \"Add\"\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\t\"toolbar/sidebar\": \"Barre latérale\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"Ouvrir un livre local\",\n\t\t\t\t\"toolbar/openbook/error\": \"Votre navigateur ne prend pas en charge les fonctions nécessaires.\\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Insérer un marque page ici\",\n\t\t\t\t\"toolbar/fullscreen\": \"Plein écran\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"Sommaire\",\n\t\t\t\t\"sidebar/bookmarks\": \"Marque-pages\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Ancre\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Annuler\",\n\t\t\t\t\"sidebar/search\": \"Rechercher\",\n\t\t\t\t\"sidebar/search/placeholder\": \"rechercher\",\n\t\t\t\t\"sidebar/settings\": \"Réglages\",\n\t\t\t\t\"sidebar/settings/language\": \"Langue\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Établir une pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"Langue\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"Ajouter\"\n\t\t\t},\n\t\t\tja: {\n\t\t\t\t\"toolbar/sidebar\": \"サイドバー\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"本を開く\",\n\t\t\t\t\"toolbar/openbook/error\": \"ご利用のブラウザは必要な機能をサポートしていません。\\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。\",\n\t\t\t\t\"toolbar/bookmark\": \"このページに栞を設定する\",\n\t\t\t\t\"toolbar/fullscreen\": \"フルスクリーン\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"目次\",\n\t\t\t\t\"sidebar/bookmarks\": \"栞\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations\": \"注釈\",\n\t\t\t\t\"sidebar/annotations/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/annotations/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"アンカー\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"キャンセル\",\n\t\t\t\t\"sidebar/search\": \"検索\",\n\t\t\t\t\"sidebar/search/placeholder\": \"検索\",\n\t\t\t\t\"sidebar/settings\": \"設定\",\n\t\t\t\t\"sidebar/settings/language\": \"表示言語\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"ページネーション\", \"ページネーションを生成します。\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"表示言語\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"追加\"\n\t\t\t},\n\t\t\tru: {\n\t\t\t\t\"toolbar/sidebar\": \"Боковая панель\",\n\t\t\t\t\"toolbar/prev\": \"Предыдущая страница\",\n\t\t\t\t\"toolbar/next\": \"Следущая страница\",\n\t\t\t\t\"toolbar/openbook\": \"Открыть книгу\",\n\t\t\t\t\"toolbar/openbook/error\": \"Ваш браузер не поддерживает необходимые функции.\\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Добавить эту страницу в закладки\",\n\t\t\t\t\"toolbar/fullscreen\": \"Полноэкранный режим\",\n\n\t\t\t\t\"sidebar/close\": \"Закрыть боковую панель\",\n\t\t\t\t\"sidebar/contents\": \"Содержание\",\n\t\t\t\t\"sidebar/bookmarks\": \"Закладки\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Добавить\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations\": \"Аннотации\",\n\t\t\t\t\"sidebar/annotations/add\": \"Добавить\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Метка\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Отмена\",\n\t\t\t\t\"sidebar/search\": \"Поиск\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Поиск\",\n\t\t\t\t\"sidebar/settings\": \"Настройки\",\n\t\t\t\t\"sidebar/settings/language\": \"Язык\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Размер шрифта\",\n\t\t\t\t\"sidebar/settings/flow\": \"Поток\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Нумерация страниц\", \"Генерировать нумерацию страниц\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Мин. ширина колонки\",\n\t\t\t\t\"sidebar/metadata\": \"Метаданные\",\n\t\t\t\t\"sidebar/metadata/title\": \"Заголовок\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Автор\",\n\t\t\t\t\"sidebar/metadata/description\": \"Описание\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Дата публикации\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Издатель\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Идентификатор\",\n\t\t\t\t\"sidebar/metadata/language\": \"Язык\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Лицензия\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Дата изменения\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Макет\",\n\t\t\t\t\"sidebar/metadata/flow\": \"Поток\",\n\t\t\t\t\"sidebar/metadata/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/metadata/direction\": \"Направление\",\n\n\t\t\t\t\"notedlg/label\": \"Заметка\",\n\t\t\t\t\"notedlg/add\": \"Добавить\"\n\t\t\t}\n\t\t};\n\n\t\treader.on(\"languagechanged\", (value) => {\n\t\t\tthis.language = value;\n\t\t});\n\t}\n\n\tget(key) { return this.values[this.language][key] || \"???\"; }\n}","/**\n * @author mrdoob https://github.com/mrdoob/ui.js\n */\n\nconst ERROR_MSG = \"is not an instance of UIElement.\";\n\n/**\n * UIElement\n * @param {string} tag\n */\nexport class UIElement {\n\t\n\tconstructor(tag) {\n\n\t\tthis.dom = document.createElement(tag); \n\t}\n\n\tadd() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.appendChild(argument.dom);\n\n\t\t\t} else if (Array.isArray(argument)) {\n\n\t\t\t\tfor (let j = 0; j < argument.length; j++) {\n\n\t\t\t\t\tconst element = argument[j];\n\n\t\t\t\t\tif (element instanceof UIElement) {\n\n\t\t\t\t\t\tthis.dom.appendChild(element.dom);\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error(\"UIElement:\", element, ERROR_MSG);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tremove() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.removeChild(argument.dom);\n\n\t\t\t} else if (Number.isInteger(argument)) {\n\n\t\t\t\tthis.dom.removeChild(this.dom.childNodes[argument]);\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tclear() {\n\n\t\twhile (this.dom.children.length) {\n\n\t\t\tthis.dom.removeChild(this.dom.lastChild);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetId(id) {\n\n\t\tthis.dom.id = id;\n\t\treturn this;\n\t}\n\n\tgetId() {\n\n\t\treturn this.dom.id;\n\t}\n\n\tremoveAttribute(name) {\n\n\t\tthis.dom.removeAttribute(name);\n\t\treturn this;\n\t}\n\n\tsetClass(name) {\n\n\t\tthis.dom.className = name;\n\t\treturn this;\n\t}\n\n\taddClass(name) {\n\n\t\tthis.dom.classList.add(name);\n\t\treturn this;\n\t}\n\n\tremoveClass(name) {\n\n\t\tthis.dom.classList.remove(name);\n\t\treturn this;\n\t}\n\n\tsetStyle(key, value) {\n\n\t\tthis.dom.style[key] = value;\n\t\treturn this;\n\t}\n\n\tgetTitle() {\n\n\t\treturn this.dom.title;\n\t}\n\n\tsetTitle(title) {\n\n\t\tif (this.dom.title !== title && title)\n\t\t\tthis.dom.title = title;\n\t\treturn this;\n\t}\n\n\tgetTextContent() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetTextContent(text) {\n\n\t\tif (this.dom.textContent !== text && text)\n\t\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n\n\tgetBoundingClientRect() {\n\n\t\treturn this.dom.getBoundingClientRect();\n\t}\n}\n\n/**\n * UISpan\n * @param {string} text\n */\nexport class UISpan extends UIElement {\n\n\tconstructor(text) {\n\n\t\tsuper(\"span\");\n\t\tthis.setTextContent(text);\n\t}\n}\n\n/**\n * UIDiv\n */\nexport class UIDiv extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"div\");\n\t}\n}\n\n/**\n * UIRow\n */\nexport class UIRow extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"row\";\n\t}\n}\n\n/**\n * UIPanel\n */\nexport class UIPanel extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"panel\";\n\t}\n}\n\n/**\n * UILabel\n * @param {string} text\n * @param {string} id\n */\nexport class UILabel extends UIElement {\n\n\tconstructor(text, id) {\n\n\t\tsuper(\"label\");\n\n\t\tthis.dom.textContent = text;\n\t\tif (id) this.dom.htmlFor = id;\n\t}\n}\n\n/**\n * UILink\n * @param {string} href\n * @param {string} text\n */\nexport class UILink extends UIElement {\n\n\tconstructor(href, text) {\n\n\t\tsuper(\"a\");\n\n\t\tthis.dom.href = href || \"#\";\n\t\tthis.dom.textContent = text || \"\";\n\t}\n\n\tsetHref(url) {\n\n\t\tthis.dom.href = url;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIText\n * @param {string} text\n */\nexport class UIText extends UISpan {\n\n\tconstructor(text) {\n\n\t\tsuper();\n\n\t\tthis.dom.textContent = text;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetValue(text) {\n\n\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITextArea\n */\nexport class UITextArea extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"textarea\");\n\n\t\tthis.dom.spellcheck = false;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UISelect\n */\nexport class UISelect extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"select\");\n\t}\n\n\tsetMultiple(boolean) {\n\n\t\tthis.dom.multiple = boolean || false;\n\t\treturn this;\n\t}\n\n\tsetOptions(options) {\n\n\t\tconst selected = this.dom.value;\n\t\tthis.clear();\n\n\t\tfor (const key in options) {\n\n\t\t\tconst option = document.createElement(\"option\");\n\t\t\toption.value = key;\n\t\t\toption.text = options[key];\n\t\t\tthis.dom.appendChild(option);\n\t\t}\n\t\tthis.dom.value = selected;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tvalue = String(value);\n\n\t\tif (this.dom.value !== value)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIInput\n * @param {*} type\n * @param {*} value\n * @param {*} title\n */\nexport class UIInput extends UIElement {\n\n\tconstructor(type, value, title) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = type;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.setValue(value);\n\t\tthis.setTitle(title);\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tgetType() {\n\n\t\treturn this.dom.type;\n\t}\n\n\tsetType(type) {\n\n\t\tthis.dom.type = type;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tif (this.dom.value !== value && value !== undefined)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIColor\n */\nexport class UIColor extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"input\");\n\n\t\ttry {\n\n\t\t\tthis.dom.type = \"color\";\n\t\t\tthis.dom.value = \"#ffffff\";\n\n\t\t} catch (e) {\n\n\t\t\tconsole.exception(e);\n\t\t}\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tgetHexValue() {\n\n\t\treturn parseInt(this.dom.value.substr(1), 16);\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n\n\tsetHexValue(hex) {\n\n\t\tthis.dom.value = \"#\" + (\"000000\" + hex.toString(16)).slice(-6);\n\t\treturn this;\n\t}\n}\n\n/**\n * UINumber\n * @param {number} value\n * @param {number} step\n * @param {number} min\n * @param {number} max\n * @param {number} precision\n */\nexport class UINumber extends UIElement {\n\n\tconstructor(value, step, min, max, precision) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = \"number\";\n\t\tthis.dom.step = step || 1;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.value = value || 0;\n\t\tthis.min = min || -Infinity;\n\t\tthis.max = max || +Infinity;\n\t\tthis.precision = precision || 0;\n\t\tthis.setValue(value);\n\t\tthis.dom.onchange = (e) => {\n\n\t\t\tthis.setValue(this.value);\n\t\t};\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision) {\n\n\t\tthis.precision = precision;\n\t\tthis.setValue(this.value);\n\t\treturn this;\n\t}\n\n\tsetRange(min, max) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\t\tthis.dom.min = min;\n\t\tthis.dom.max = max;\n\t\treturn this;\n\t}\n\n\tsetStep(step) {\n\n\t\tthis.dom.step = step;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn parseFloat(this.dom.value);\n\t}\n\n\tsetValue(value) {\n\n\t\tif (value !== undefined) {\n\t\t\tvalue = parseFloat(value);\n\n\t\t\tif (value < this.min)\n\t\t\t\tvalue = this.min;\n\t\t\tif (value > this.max)\n\t\t\t\tvalue = this.max;\n\n\t\t\tthis.value = value;\n\t\t\tthis.dom.value = value.toFixed(this.precision);\n\t\t}\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBreak\n */\nexport class UIBreak extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"br\");\n\t}\n}\n\n/**\n * UIHorizontalRule\n */\nexport class UIHorizontalRule extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"hr\");\n\t}\n}\n\n/**\n * UIProgress\n * @param {*} value\n */\nexport class UIProgress extends UIElement {\n\n\tconstructor(value) {\n\n\t\tsuper(\"progress\");\n\n\t\tthis.dom.value = value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITabbedPanel\n * @param {string} align (horizontal | vertical)\n */\nexport class UITabbedPanel extends UIDiv {\n\n\tconstructor(align) {\n\n\t\tsuper();\n\n\t\tthis.align = align || \"horizontal\";\n\t\tthis.tabs = [];\n\t\tthis.panels = [];\n\t\tthis.selector = new UISpan().setClass(\"tab-selector\");\n\t\tthis.menuDiv = new UIDiv().setClass(\"menu\");\n\t\tthis.tabsDiv = new UIDiv().setClass(\"tabs\");\n\t\tthis.tabsDiv.add(this.selector);\n\t\tthis.panelsDiv = new UIDiv().setClass(\"panels\");\n\t\tthis.selected = \"\";\n\t\tthis.add(this.menuDiv);\n\t\tthis.add(this.tabsDiv);\n\t\tthis.add(this.panelsDiv);\n\t}\n\n\taddMenu(items) {\n\t\tthis.menuDiv.add(items);\n\t}\n\n\taddTab(id, label, items) {\n\n\t\tconst tab = new UITab(label, this);\n\t\ttab.setId(id);\n\t\ttab.setClass(\"box\");\n\t\tthis.tabs.push(tab);\n\t\tthis.tabsDiv.add(tab);\n\n\t\tconst panel = new UIDiv();\n\t\tpanel.setId(id);\n\t\tpanel.add(items);\n\t\tthis.panels.push(panel);\n\t\tthis.panelsDiv.add(panel);\n\t\tthis.select(id);\n\t}\n\n\tselect(id) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.addClass(\"selected\");\n\t\t\t\tthis.transformSelector(tab);\n\t\t\t} else if (tab.dom.id === this.selected) {\n\t\t\t\ttab.removeClass(\"selected\");\n\t\t\t}\n\t\t}\n\n\t\tfor (let panel of this.panels) {\n\t\t\tif (panel.dom.id === id) {\n\t\t\t\tpanel.dom.style.display = \"block\";\n\t\t\t} else if (panel.dom.id === this.selected) {\n\t\t\t\tpanel.dom.style.display = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tthis.selected = id;\n\t\treturn this;\n\t}\n\n\tsetLabel(id, text) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.setTitle(text);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\ttransformSelector(tab) {\n\n\t\tlet size;\n\t\tconst rect = tab.getBoundingClientRect();\n\t\tif (this.align === \"horizontal\") {\n\t\t\tsize = rect.width * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateX(${size}px)`;\n\t\t} else {\n\t\t\tsize = rect.height * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateY(${size}px)`;\n\t\t}\n\t}\n}\n\n/**\n * UITab\n * @param {string} text\n * @param {UITabbedPanel} parent\n */\nexport class UITab extends UIDiv {\n\n\tconstructor(text, parent) {\n\n\t\tsuper();\n\t\tthis.button = new UIInput(\"button\");\n\t\tthis.button.dom.title = text;\n\t\tthis.dom.onclick = (e) => {\n\n\t\t\tparent.select(this.dom.id);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(this.button);\n\t}\n}\n\n/**\n * UIList\n * @param {UIItem} parent\n */\nexport class UIList extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"ul\");\n\t\tthis.parent = parent && parent.parent; // LI->UL\n\t\tthis.expanded = false;\n\t}\n\n\texpand() {\n\n\t\tthis.expanded = true;\n\t\tthis.dom.style.display = \"block\";\n\t\tif (this.parent)\n\t\t\tthis.parent.expand();\n\t\treturn this;\n\t}\n\n\tcollaps() {\n\n\t\tthis.expanded = false;\n\t\tthis.dom.style.display = \"none\";\n\t\treturn this;\n\t}\n}\n\n/**\n * UIItem\n * @param {UIList} parent\n */\nexport class UIItem extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"li\");\n\t\tthis.parent = parent; // UL\n\t\tthis.selected = false;\n\t}\n\n\tadd() {\n\t\tlet len = 0;\n\t\tconst box = new UIDiv().setId(\"item-box\");\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\t\t\tconst argument = arguments[i];\n\t\t\tif (argument instanceof UIList) {\n\t\t\t\tsuper.add(argument);\n\t\t\t} else {\n\t\t\t\tbox.add(argument);\n\t\t\t\tlen++;\n\t\t\t}\n\t\t}\n\t\tif (len) super.add(box);\n\t\treturn this;\n\t}\n\n\tselect() {\n\n\t\tthis.selected = true;\n\t\tthis.setClass(\"selected\");\n\t\treturn this;\n\t}\n\n\tunselect() {\n\n\t\tthis.selected = false;\n\t\tthis.removeAttribute(\"class\");\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBox\n * @param {UIElement} items\n */\nexport class UIBox extends UIElement {\n\n\tconstructor(items) {\n\n\t\tsuper(\"div\");\n\t\tthis.setClass(\"box\");\n\t\tthis.add(items);\n\t}\n}","import { UIDiv, UIInput } from \"./ui.js\";\n\nexport class Toolbar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst settings = reader.settings;\n\n\t\tconst container = new UIDiv().setId(\"toolbar\");\n\t\tconst keys = [\n\t\t\t\"toolbar/sidebar\",\n\t\t\t\"toolbar/prev\",\n\t\t\t\"toolbar/next\",\n\t\t\t\"toolbar/openbook\",\n\t\t\t\"toolbar/openbook/error\",\n\t\t\t\"toolbar/bookmark\",\n\t\t\t\"toolbar/fullscreen\"\n\t\t];\n\t\tconst menu1 = new UIDiv().setClass(\"menu-1\");\n\t\tconst openerBox = new UIDiv().setId(\"btn-m\").setClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.dom.title = strings.get(keys[0]);\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", true);\n\t\t\topenerBtn.dom.blur();\n\t\t\te.preventDefault();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tmenu1.add(openerBox);\n\n\t\tlet prevBox, prevBtn;\n\t\tlet nextBox, nextBtn;\n\t\tif (settings.arrows === \"toolbar\") {\n\t\t\tprevBox = new UIDiv().setId(\"btn-p\").setClass(\"box\");\n\t\t\tprevBtn = new UIInput(\"button\");\n\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\tprevBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t\tprevBtn.dom.blur();\n\t\t\t};\n\t\t\tprevBox.add(prevBtn);\n\t\t\tmenu1.add(prevBox);\n\n\t\t\tnextBox = new UIDiv().setId(\"btn-n\").setClass(\"box\");\n\t\t\tnextBtn = new UIInput(\"button\");\n\t\t\tnextBtn.dom.title = strings.get(keys[2]);\n\t\t\tnextBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t\tnextBtn.dom.blur();\n\t\t\t};\n\t\t\tnextBox.add(nextBtn);\n\t\t\tmenu1.add(nextBox);\n\t\t}\n\n\t\tconst menu2 = new UIDiv().setClass(\"menu-2\");\n\t\tlet openbookBtn;\n\t\tif (settings.openbook) {\n\t\t\tconst onload = (e) => {\n\n\t\t\t\treader.storage.clear();\n\t\t\t\treader.storage.set(e.target.result, () => {\n\t\t\t\t\treader.unload();\n\t\t\t\t\treader.init(e.target.result);\n\t\t\t\t\tconst url = new URL(window.location.origin);\n\t\t\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\t\t});\n\t\t\t};\n\t\t\tconst onerror = (e) => {\n\t\t\t\tconsole.error(e);\n\t\t\t};\n\t\t\tconst openbookBox = new UIDiv().setId(\"btn-o\").setClass(\"box\");\n\t\t\topenbookBtn = new UIInput(\"file\");\n\t\t\topenbookBtn.dom.title = strings.get(keys[3]);\n\t\t\topenbookBtn.dom.accept = \"application/epub+zip\";\n\t\t\topenbookBtn.dom.onchange = (e) => {\n\n\t\t\t\tif (e.target.files.length === 0)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (window.FileReader) {\n\n\t\t\t\t\tconst fr = new FileReader();\n\t\t\t\t\tfr.onload = onload;\n\t\t\t\t\tfr.readAsArrayBuffer(e.target.files[0]);\n\t\t\t\t\tfr.onerror = onerror;\n\t\t\t\t} else {\n\t\t\t\t\talert(strings.get(keys[4]));\n\t\t\t\t}\n\n\t\t\t};\n\t\t\topenbookBtn.dom.onclick = (e) => {\n\n\t\t\t\topenbookBtn.dom.blur();\n\t\t\t};\n\t\t\topenbookBox.add(openbookBtn);\n\t\t\tmenu2.add(openbookBox);\n\t\t}\n\n\t\tlet bookmarkBox, bookmarkBtn;\n\t\tif (settings.bookmarks) {\n\t\t\tbookmarkBox = new UIDiv().setId(\"btn-b\").setClass(\"box\");\n\t\t\tbookmarkBtn = new UIInput(\"button\");\n\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\tbookmarkBtn.dom.onclick = (e) => {\n\n\t\t\t\tconst cfi = this.locationCfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\treader.emit(\"bookmarked\", val);\n\t\t\t\te.preventDefault();\n\t\t\t\tbookmarkBtn.dom.blur();\n\t\t\t};\n\t\t\tbookmarkBox.add(bookmarkBtn);\n\t\t\tmenu2.add(bookmarkBox);\n\t\t}\n\n\t\tlet fullscreenBtn;\n\t\tif (settings.fullscreen) {\n\n\t\t\tconst fullscreenBox = new UIDiv().setId(\"btn-f\").setClass(\"box\");\n\t\t\tfullscreenBtn = new UIInput(\"button\");\n\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\tfullscreenBtn.dom.onclick = (e) => {\n\n\t\t\t\tthis.toggleFullScreen();\n\t\t\t\te.preventDefault();\n\t\t\t};\n\n\t\t\tdocument.onkeydown = (e) => {\n\n\t\t\t\tif (e.key === \"F11\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.toggleFullScreen();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.onfullscreenchange = (e) => {\n\n\t\t\t\tconst w = window.screen.width === e.target.clientWidth;\n\t\t\t\tconst h = window.screen.height === e.target.clientHeight;\n\n\t\t\t\tif (w && h) {\n\t\t\t\t\tfullscreenBox.addClass(\"resize-small\");\n\t\t\t\t} else {\n\t\t\t\t\tfullscreenBox.removeClass(\"resize-small\");\n\t\t\t\t}\n\t\t\t};\n\t\t\tfullscreenBox.add(fullscreenBtn);\n\t\t\tmenu2.add(fullscreenBox);\n\t\t}\n\n\t\tcontainer.add([menu1, menu2]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tconst cfi = location.start.cfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\tif (val) {\n\t\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t\t} else {\n\t\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t\t}\n\t\t\t\tthis.locationCfi = cfi; // save location cfi\n\t\t\t}\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBox.dom.style.display = location.atStart ? \"none\" : \"block\";\n\t\t\t\tnextBox.dom.style.display = location.atEnd ? \"none\" : \"block\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean) => {\n\n\t\t\tif (boolean) {\n\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t} else {\n\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\t\tnextBtn.setTitle(strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (settings.openbook) {\n\t\t\t\topenbookBtn.setTitle(strings.get(keys[3]));\n\t\t\t}\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\t}\n\t\t\tif (settings.fullscreen) {\n\t\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\t}\n\t\t});\n\t}\n\n\ttoggleFullScreen() {\n\n\t\tdocument.activeElement.blur();\n\n\t\tif (document.fullscreenElement === null) {\n\t\t\tdocument.documentElement.requestFullscreen();\n\t\t} else if (document.exitFullscreen) {\n\t\t\tdocument.exitFullscreen();\n\t\t}\n\t}\n}","import { UIDiv, UISpan } from \"./ui.js\";\n\nexport class Content {\n\n\tconstructor(reader) {\n\n\t\tconst settings = reader.settings;\n\t\tconst container = new UIDiv().setId(\"content\");\n\n\t\tlet prev;\n\t\tif (settings.arrows === \"content\") {\n\n\t\t\tprev = new UIDiv().setId(\"prev\").setClass(\"arrow\");\n\t\t\tprev.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tprev.add(new UISpan(\"<\"));\n\t\t\tcontainer.add(prev);\n\t\t}\n\n\t\tconst viewer = new UIDiv().setId(\"viewer\");\n\t\tcontainer.add(viewer);\n\n\t\tlet next;\n\t\tif (settings.arrows === \"content\") {\n\t\t\tnext = new UIDiv().setId(\"next\").setClass(\"arrow\");\n\t\t\tnext.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tnext.add(new UISpan(\">\"));\n\t\t\tcontainer.add(next);\n\t\t}\n\n\t\tconst loader = new UIDiv().setId(\"loader\");\n\t\tconst divider = new UIDiv().setId(\"divider\");\n\t\tconst overlay = new UIDiv().setId(\"overlay\");\n\t\toverlay.dom.onclick = (e) => {\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tcontainer.add([loader, divider, overlay]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tviewer.setClass(cfg.flow);\n\t\t\tloader.dom.style.display = \"block\";\n\t\t});\n\n\t\treader.on(\"bookloaded\", () => {\n\n\t\t\tloader.dom.style.display = \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.spread && props.width > props.spreadWidth) {\n\t\t\t\tdivider.dom.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tdivider.dom.style.display = \"none\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"flowchanged\", (value) => {\n\t\t\t\n\t\t\tviewer.setClass(value);\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tif (location.atStart) {\n\t\t\t\t\tprev.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tprev.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t\tif (location.atEnd) {\n\t\t\t\t\tnext.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tnext.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"prev\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tprev.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { prev.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"next\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tnext.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { next.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\toverlay.dom.style.display = value ? \"block\" : \"none\";\n\t\t});\n\n\t\treader.on(\"viewercleanup\", () => {\n\n\t\t\tviewer.clear();\n\t\t});\n\t}\n}","import { UIPanel, UIDiv, UIItem, UIList, UILink, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class TocPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/contents\"\n\t\t];\n\t\tconst label = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined; // save reference to selected tree item\n\t\tthis.setId(\"contents\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\n\t\t//-- events --//\n\n\t\treader.on(\"navigation\", (toc) => {\n\n\t\t\tcontainer.clear();\n\t\t\tcontainer.add(this.generateToc(toc));\n\t\t\tthis.add(container);\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tlabel.setValue(strings.get(keys[0]));\n\t\t});\n\t}\n\n\tgenerateToc(toc, parent) {\n\n\t\tconst list = new UIList(parent);\n\n\t\ttoc.forEach((chapter) => {\n\n\t\t\tconst link = new UILink(chapter.href, chapter.label);\n\t\t\tconst item = new UIItem(list).setId(chapter.id);\n\t\t\tconst ibtn = new UISpan();\n\n\t\t\tlink.dom.onclick = (e) => {\n\n\t\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\t\tthis.selector.unselect();\n\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t\tthis.reader.settings.sectionId = chapter.id;\n\t\t\t\tthis.reader.rendition.display(chapter.href);\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\titem.add([ibtn, link]);\n\t\t\tthis.reader.navItems[chapter.href] = {\n\t\t\t\tid: chapter.id,\n\t\t\t\tlabel: chapter.label\n\t\t\t};\n\n\t\t\tif (this.reader.settings.sectionId === chapter.id) {\n\t\t\t\tlist.expand();\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t}\n\n\t\t\tif (chapter.subitems && chapter.subitems.length > 0) {\n\n\t\t\t\tconst subItems = this.generateToc(chapter.subitems, item);\n\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\tibtn.dom.onclick = () => {\n\n\t\t\t\t\tif (subItems.expanded) {\n\t\t\t\t\t\tsubItems.collaps();\n\t\t\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubItems.expand();\n\t\t\t\t\t\tibtn.setClass(\"toggle-expanded\");\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t\titem.add(subItems);\n\t\t\t}\n\n\t\t\tlist.add(item);\n\t\t});\n\n\t\treturn list;\n\t}\n}","import { UIPanel, UIDiv, UIRow, UIInput, UILink, UIList, UIItem, UIText, UIBox, UISpan } from \"../ui.js\";\n\nexport class BookmarksPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/bookmarks/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearBookmarks();\n\t\t\treader.emit(\"bookmarked\", false);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.bookmarks = new UIList();\n\t\tcontainer.add(this.bookmarks);\n\t\tthis.setId(\"bookmarks\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\n\t\tconst update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.bookmarks.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"displayed\", (renderer, cfg) => {\n\n\t\t\tcfg.bookmarks.forEach((cfi) => {\n\n\t\t\t\tthis.setBookmark(cfi);\n\t\t\t});\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tthis.locationCfi = location.start.cfi; // save location cfi\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean, cfi) => {\n\n\t\t\tif (boolean) {\n\t\t\t\tthis.appendBookmark();\n\t\t\t} else {\n\t\t\t\tthis.removeBookmark(cfi);\n\t\t\t}\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tappendBookmark() {\n\n\t\tconst cfi = this.locationCfi;\n\t\tif (this.reader.isBookmarked(cfi) > -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setBookmark(cfi);\n\t\tthis.reader.settings.bookmarks.push(cfi);\n\t}\n\n\tremoveBookmark(cfi) {\n\n\t\tconst _cfi = cfi || this.locationCfi;\n\t\tconst index = this.reader.isBookmarked(_cfi);\n\t\tif (index === -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.bookmarks.remove(index);\n\t\tthis.reader.settings.bookmarks.splice(index, 1);\n\t}\n\n\tclearBookmarks() {\n\n\t\tthis.bookmarks.clear();\n\t\tthis.reader.settings.bookmarks = [];\n\t}\n\n\tsetBookmark(cfi) {\n\n\t\tconst link = new UILink();\n\t\tconst item = new UIItem();\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst navItem = this.reader.navItemFromCfi(cfi);\n\t\tlet idref;\n\t\tlet label;\n\n\t\tif (navItem === undefined) {\n\t\t\tconst spineItem = this.reader.book.spine.get(cfi);\n\t\t\tidref = spineItem.idref;\n\t\t\tlabel = spineItem.idref\n\t\t} else {\n\t\t\tidref = navItem.id;\n\t\t\tlabel = navItem.label;\n\t\t}\n\n\t\tlink.setHref(\"#\" + cfi);\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(cfi);\n\t\t\te.preventDefault();\n\t\t};\n\t\tlink.setTextContent(label);\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.reader.emit(\"bookmarked\", false, cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\titem.setId(idref);\n\t\tthis.bookmarks.add(item);\n\t}\n}","import { UIPanel, UIDiv, UITextArea, UIInput, UILink, UIList, UIItem, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class AnnotationsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/annotations/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearNotes();\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.notes = new UIList();\n\t\tcontainer.add(this.notes);\n\t\tthis.setId(\"annotations\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\t\tthis.update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.annotations.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tcfg.annotations.forEach((note) => {\n\n\t\t\t\tthis.set(note);\n\t\t\t});\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"noteadded\", (note) => {\n\n\t\t\tthis.set(note);\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tset(note) {\n\n\t\tconst link = new UILink(\"#\" + note.cfi, note.text);\n\t\tconst item = new UIItem().setId(\"note-\" + note.uuid);\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst call = () => { };\n\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(note.cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.removeNote(note);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\tthis.notes.add(item);\n\t\tthis.reader.rendition.annotations.add(\n\t\t\t\"highlight\", note.cfi, {}, call, \"note-highlight\", {});\n\t\tthis.update();\n\t}\n\n\tremoveNote(note) {\n\n\t\tconst index = this.reader.settings.annotations.indexOf(note);\n\t\tif (index === -1)\n\t\t\treturn;\n\n\t\tthis.notes.remove(index);\n\t\tthis.reader.settings.annotations.splice(index, 1);\n\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\tthis.update();\n\t}\n\n\tclearNotes() {\n\n\t\tthis.reader.settings.annotations.forEach(note => {\n\t\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\t});\n\t\tthis.notes.clear();\n\t\tthis.reader.settings.annotations = [];\n\t\tthis.update();\n\t}\n}","import { UIPanel, UIDiv, UIInput, UILink, UIList, UIItem, UIBox } from \"../ui.js\";\n\nexport class SearchPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\n\t\tlet searchQuery = undefined;\n\t\tconst search = new UIInput(\"search\").setId(\"nav-q\");\n\t\tsearch.dom.placeholder = strings.get(\"sidebar/search/placeholder\");\n\t\tsearch.dom.onsearch = () => {\n\n\t\t\tconst value = search.getValue();\n\n\t\t\tif (value.length === 0) {\n\t\t\t\tthis.items.clear();\n\t\t\t} else if (searchQuery !== value) {\n\t\t\t\tthis.items.clear();\n\t\t\t\tthis.doSearch(value).then(results => {\n\n\t\t\t\t\tresults.forEach(data => {\n\t\t\t\t\t\tthis.set(data);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tsearchQuery = value;\n\t\t};\n\n\t\tthis.setId(\"search\");\n\t\tthis.items = new UIList();\n\t\tcontainer.add(this.items);\n\t\tthis.add([new UIBox(search), container]);\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined;\n\t\t//\n\t\t// improvement of the highlighting of keywords is required...\n\t\t//\n\t}\n\n\t/**\n\t * Searching the entire book\n\t * @param {*} q Query keyword\n\t * @returns The search result array.\n\t */\n\tasync doSearch(q) {\n\n\t\tconst book = this.reader.book;\n\t\tconst results = await Promise.all(\n\t\t\tbook.spine.spineItems.map(item => item.load(book.load.bind(book))\n\t\t\t\t.then(item.find.bind(item, q)).finally(item.unload.bind(item))));\n\t\treturn await Promise.resolve([].concat.apply([], results));\n\t}\n\n\tset(data) {\n\n\t\tconst link = new UILink(\"#\" + data.cfi, data.excerpt);\n\t\tconst item = new UIItem();\n\t\tlink.dom.onclick = () => {\n\n\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\tthis.selector.unselect();\n\t\t\t\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(data.cfi);\n\t\t\treturn false;\n\t\t};\n\t\titem.add(link);\n\t\tthis.items.add(item);\n\t}\n}","import { UIPanel, UIRow, UISelect, UIInput, UILabel, UINumber, UIText, UIBox, UIDiv } from \"../ui.js\";\n\nexport class SettingsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tsuper.setId(\"settings\");\n\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/settings/language\",\n\t\t\t\"sidebar/settings/fontsize\",\n\t\t\t\"sidebar/settings/flow\",\n\t\t\t\"sidebar/settings/spread\",\n\t\t\t\"sidebar/settings/spread/minwidth\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.add(new UIBox(headerLabel).addClass(\"header\"));\n\n\t\tconst languageLabel = new UILabel(strings.get(keys[1]), \"language-ui\");\n\t\tconst languageRow = new UIRow();\n\t\tconst language = new UISelect().setOptions({\n\t\t\ten: \"English\",\n\t\t\tfr: \"French\",\n\t\t\tja: \"Japanese\",\n\t\t\tru: \"Russian\"\n\t\t});\n\t\tlanguage.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"languagechanged\", e.target.value);\n\t\t};\n\t\tlanguage.setId(\"language-ui\");\n\t\tlanguageRow.add(languageLabel);\n\t\tlanguageRow.add(language);\n\n\t\tconst fontSizeLabel = new UILabel(strings.get(keys[2]), \"fontsize\");\n\t\tconst fontSizeRow = new UIRow();\n\t\tconst fontSize = new UINumber(100, 1);\n\t\tfontSize.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"styleschanged\", {\n\t\t\t\tfontSize: parseInt(e.target.value)\n\t\t\t});\n\t\t};\n\t\tfontSize.setId(\"fontsize\")\n\t\tfontSizeRow.add(fontSizeLabel);\n\t\tfontSizeRow.add(fontSize);\n\n\t\t//-- flow configure --//\n\n\t\tconst flowLabel = new UILabel(strings.get(keys[3]), \"flow\");\n\t\tconst flowRow = new UIRow();\n\t\tconst flow = new UISelect().setOptions({\n\t\t\tpaginated: \"Paginated\",\n\t\t\tscrolled: \"Scrolled\"\n\t\t});\n\t\tflow.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"flowchanged\", e.target.value);\n\n\t\t\tif (e.target.value === \"scrolled\") {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: \"none\",\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: undefined,\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tflow.setId(\"flow\");\n\t\tflowRow.add(flowLabel);\n\t\tflowRow.add(flow);\n\n\t\t//-- spdead configure --//\n\n\t\tconst minSpreadWidth = new UINumber(800, 1);\n\t\tconst spreadLabel = new UILabel(strings.get(keys[4]), \"spread\");\n\t\tconst spreadRow = new UIRow();\n\t\tconst spread = new UISelect().setOptions({\n\t\t\tnone: \"None\",\n\t\t\tauto: \"Auto\"\n\t\t});\n\t\tspread.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: e.target.value,\n\t\t\t\tmin: undefined\n\t\t\t});\n\t\t\tminSpreadWidth.dom.disabled = e.target.value === \"none\";\n\t\t};\n\t\tspread.setId(\"spread\");\n\n\t\tspreadRow.add(spreadLabel);\n\t\tspreadRow.add(spread);\n\n\t\tconst minSpreadWidthLabel = new UILabel(strings.get(keys[5]), \"min-spread-width\");\n\t\tconst minSpreadWidthRow = new UIRow();\n\t\tminSpreadWidth.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: undefined,\n\t\t\t\tmin: parseInt(e.target.value)\n\t\t\t});\n\t\t};\n\t\tminSpreadWidth.setId(\"min-spread-width\");\n\t\tminSpreadWidthRow.add(minSpreadWidthLabel);\n\t\tminSpreadWidthRow.add(minSpreadWidth);\n\n\t\t//-- pagination --//\n\n\t\tconst paginationStr = strings.get(\"sidebar/settings/pagination\");\n\t\tconst paginationRow = new UIRow();\n\t\tconst pagination = new UIInput(\"checkbox\", false, paginationStr[1]);\n\t\tpagination.setId(\"pagination\");\n\t\tpagination.dom.onclick = (e) => {\n\n\t\t\t// not implemented\n\t\t};\n\n\t\tpaginationRow.add(new UILabel(paginationStr[0], \"pagination\"));\n\t\tpaginationRow.add(pagination);\n\n\t\tthis.add(new UIBox([\n\t\t\tlanguageRow,\n\t\t\tfontSizeRow,\n\t\t\tflowRow,\n\t\t\tspreadRow,\n\t\t\tminSpreadWidthRow,\n\t\t\t//paginationRow\n\t\t]));\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tlanguage.setValue(cfg.language);\n\t\t\tfontSize.setValue(cfg.styles.fontSize);\n\t\t\tflow.setValue(cfg.flow);\n\t\t\tspread.setValue(cfg.spread.mod);\n\t\t\tminSpreadWidth.setValue(cfg.spread.min);\n\t\t\tminSpreadWidth.dom.disabled = cfg.spread.mod === \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.flow === \"scrolled\") {\n\t\t\t\tspread.setValue(\"none\");\n\t\t\t\tspread.dom.disabled = true;\n\t\t\t\tminSpreadWidth.dom.disabled = true;\n\t\t\t} else {\n\t\t\t\tspread.dom.disabled = false;\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setTextContent(strings.get(keys[0]));\n\t\t\tlanguageLabel.setTextContent(strings.get(keys[1]));\n\t\t\tfontSizeLabel.setTextContent(strings.get(keys[2]));\n\t\t\tflowLabel.setTextContent(strings.get(keys[3]));\n\t\t\tspreadLabel.setTextContent(strings.get(keys[4]));\n\t\t\tminSpreadWidthLabel.setTextContent(strings.get(keys[5]));\n\t\t});\n\t}\n}","import { UIBox, UIDiv, UIItem, UIList, UIPanel, UIText } from \"../ui.js\";\n\nexport class MetadataPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst labels = {};\n\t\tconst key = \"sidebar/metadata\";\n\t\tconst label = new UIText(strings.get(key)).setClass(\"label\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\t\tlabels[key] = label;\n\n\t\tthis.items = new UIList();\n\t\tthis.setId(\"metadata\");\n\t\tthis.add(container);\n\n\t\tconst init = (prop, meta) => {\n\t\t\tif (meta[prop] === undefined ||\n\t\t\t\tmeta[prop] === null || (typeof meta[prop] === \"string\" && meta[prop].length === 0)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst item = new UIItem();\n\t\t\tconst label = new UIText().setClass(\"label\");\n\t\t\tconst value = new UIText().setClass(\"value\");\n\t\t\tlabel.setValue(strings.get(key + \"/\" + prop).toUpperCase());\n\t\t\tif (prop === \"description\") {\n\t\t\t\tvalue.dom.innerHTML = meta[prop];\n\t\t\t} else {\n\t\t\t\tvalue.setValue(meta[prop]);\n\t\t\t}\n\t\t\tlabels[key + \"/\" + prop] = label;\n\t\t\titem.add([label, value]);\n\t\t\tthis.items.add(item);\n\t\t}\n\n\t\t//-- events --//\n\n\t\treader.on(\"metadata\", (meta) => {\n\n\t\t\tthis.items.clear();\n\t\t\tcontainer.clear();\n\t\t\tcontainer.add(this.items);\n\t\t\tdocument.title = meta.title;\n\t\t\tfor (const prop in meta) {\n\t\t\t\tinit(prop, meta);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tfor (const prop in labels) {\n\t\t\t\tlet text;\n\t\t\t\tif (prop === key) {\n\t\t\t\t\ttext = strings.get(prop);\n\t\t\t\t} else {\n\t\t\t\t\ttext = strings.get(prop).toUpperCase();\n\t\t\t\t}\n\t\t\t\tlabels[prop].setValue(text);\n\t\t\t}\n\t\t});\n\t}\n}","import { UITabbedPanel, UIInput, UIDiv } from \"./ui.js\";\nimport { TocPanel } from \"./sidebar/toc.js\";\nimport { BookmarksPanel } from \"./sidebar/bookmarks.js\";\nimport { AnnotationsPanel } from \"./sidebar/annotations.js\";\nimport { SearchPanel } from \"./sidebar/search.js\";\nimport { SettingsPanel } from \"./sidebar/settings.js\";\nimport { MetadataPanel } from \"./sidebar/metadata.js\";\n\nexport class Sidebar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst controls = reader.settings;\n\t\tconst keys = [\n\t\t\t\"sidebar/close\",\n\t\t\t\"sidebar/contents\",\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/search\",\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/metadata\"\n\t\t];\n\n\t\tconst container = new UITabbedPanel(\"vertical\").setId(\"sidebar\");\n\n\t\tconst openerBox = new UIDiv().setId(\"btn-p\").addClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t\topenerBtn.dom.blur();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tcontainer.addMenu(openerBox);\n\n\t\tcontainer.addTab(\"btn-t\", strings.get(keys[1]), new TocPanel(reader));\n\t\tif (controls.bookmarks) {\n\t\t\tcontainer.addTab(\"btn-d\", strings.get(keys[2]), new BookmarksPanel(reader));\n\t\t}\n\t\tif (controls.annotations) {\n\t\t\tcontainer.addTab(\"btn-a\", strings.get(keys[3]), new AnnotationsPanel(reader));\n\t\t}\n\t\tcontainer.addTab(\"btn-s\", strings.get(keys[4]), new SearchPanel(reader));\n\t\tcontainer.addTab(\"btn-c\", strings.get(keys[5]), new SettingsPanel(reader));\n\t\tcontainer.addTab(\"btn-i\", strings.get(keys[6]), new MetadataPanel(reader));\n\t\tcontainer.select(\"btn-t\");\n\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\tif (value) {\n\t\t\t\tcontainer.setClass(\"open\");\n\t\t\t} else {\n\t\t\t\tcontainer.removeAttribute(\"class\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\t\tcontainer.setLabel(\"btn-t\", strings.get(keys[1]));\n\t\t\tif (controls.bookmarks) {\n\t\t\t\tcontainer.setLabel(\"btn-d\", strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (controls.annotations) {\n\t\t\t\tcontainer.setLabel(\"btn-a\", strings.get(keys[3]));\n\t\t\t}\n\t\t\tcontainer.setLabel(\"btn-s\", strings.get(keys[4]));\n\t\t\tcontainer.setLabel(\"btn-c\", strings.get(keys[5]));\n\t\t\tcontainer.setLabel(\"btn-i\", strings.get(keys[6]));\n\t\t});\n\t}\n}","import { uuid } from \"./utils.js\";\nimport { UIBox, UIDiv, UIInput, UILabel } from \"./ui.js\";\n\nexport class NoteDlg {\n\n constructor(reader) {\n\n const container = new UIDiv().setId(\"notedlg\");\n const strings = reader.strings;\n const keys = [\n \"notedlg/label\",\n \"notedlg/add\"\n ];\n const label = new UILabel(strings.get(keys[0]), \"note-input\");\n const textBox = new UIInput(\"text\", \"\").setId(\"note-input\");\n textBox.dom.oninput = (e) => {\n\n this.update();\n e.preventDefault();\n };\n\n const addBtn = new UIInput(\"button\", strings.get(keys[1]));\n addBtn.dom.disabled = true;\n addBtn.dom.onclick = (e) => {\n\n const note = {\n cfi: this.cfi,\n date: new Date(),\n text: textBox.getValue(),\n uuid: uuid()\n };\n this.range = undefined;\n reader.settings.annotations.push(note);\n reader.emit(\"noteadded\", note);\n container.removeAttribute(\"class\");\n e.preventDefault();\n addBtn.dom.blur();\n };\n\n this.update = () => {\n\n addBtn.dom.disabled = !(this.range && textBox.getValue().length > 0);\n };\n\n container.add(new UIBox([label, textBox, addBtn]).addClass(\"control\"));\n document.body.appendChild(container.dom);\n\n //-- events --//\n\n reader.on(\"selected\", (cfi, contents) => {\n\n this.cfi = cfi;\n this.range = contents.range(cfi);\n this.update();\n container.setClass(\"open\");\n textBox.setValue(\"\");\n });\n\n reader.on(\"unselected\", () => {\n\n this.range = undefined;\n this.update();\n container.removeAttribute(\"class\");\n });\n\n reader.on(\"languagechanged\", (value) => {\n\n label.setTextContent(strings.get(keys[0]));\n addBtn.setValue(strings.get(keys[1]));\n });\n }\n}","import EventEmitter from \"event-emitter\";\n\nimport { extend, detectMobile } from \"./utils.js\";\nimport { Storage } from \"./storage.js\";\nimport { Strings } from \"./strings.js\";\nimport { Toolbar } from \"./toolbar.js\";\nimport { Content } from \"./content.js\";\nimport { Sidebar } from \"./sidebar.js\";\nimport { NoteDlg } from \"./notedlg.js\";\n\nexport class Reader {\n\n\tconstructor(bookPath, settings) {\n\n\t\tconst preinit = (data) => {\n\t\t\tconst url = new URL(window.location);\n\t\t\tlet path = bookPath;\n\t\t\tif (settings && !settings.openbook) {\n\t\t\t\tpath = bookPath;\n\t\t\t\tif (data) this.storage.clear();\n\t\t\t} else if (data && url.search.length === 0) {\n\t\t\t\tpath = data;\n\t\t\t}\n\t\t\tthis.cfgInit(path, settings);\n\t\t\tthis.strings = new Strings(this);\n\t\t\tthis.toolbar = new Toolbar(this);\n\t\t\tthis.content = new Content(this);\n\t\t\tthis.sidebar = new Sidebar(this);\n\t\t\tif (this.settings.annotations) {\n\t\t\t\tthis.notedlg = new NoteDlg(this);\n\t\t\t}\n\t\t\tthis.init();\n\t\t}\n\n\t\tthis.settings = undefined;\n\t\tthis.isMobile = detectMobile();\n\t\tthis.storage = new Storage();\n\t\tconst openbook = settings && settings.openbook;\n\n\t\tif (this.storage.indexedDB && (!settings || openbook)) {\n\t\t\tthis.storage.init(() => this.storage.get((data) => preinit(data)));\n\t\t} else {\n\t\t\tpreinit();\n\t\t}\n\n\t\twindow.onbeforeunload = this.unload.bind(this);\n\t\twindow.onhashchange = this.hashChanged.bind(this);\n\t\twindow.onkeydown = this.keyboardHandler.bind(this);\n\t\twindow.onwheel = (e) => {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Initialize book.\n\t * @param {*} bookPath\n\t * @param {*} settings\n\t */\n\tinit(bookPath, settings) {\n\n\t\tthis.emit(\"viewercleanup\");\n\t\tthis.navItems = {};\n\n\t\tif (arguments.length > 0) {\n\n\t\t\tthis.cfgInit(bookPath, settings);\n\t\t}\n\n\t\tthis.book = ePub(this.settings.bookPath);\n\t\tthis.rendition = this.book.renderTo(\"viewer\", {\n\t\t\tmanager: this.settings.manager,\n\t\t\tflow: this.settings.flow,\n\t\t\tspread: this.settings.spread.mod,\n\t\t\tminSpreadWidth: this.settings.spread.min,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tsnap: true\n\t\t});\n\n\t\tconst cfi = this.settings.previousLocationCfi;\n\t\tif (cfi) {\n\t\t\tthis.displayed = this.rendition.display(cfi);\n\t\t} else {\n\t\t\tthis.displayed = this.rendition.display();\n\t\t}\n\n\t\tthis.displayed.then((renderer) => {\n\t\t\tthis.emit(\"displayed\", renderer, this.settings);\n\t\t});\n\n\t\tthis.book.ready.then(() => {\n\t\t\tthis.emit(\"bookready\", this.settings);\n\t\t}).then(() => {\n\t\t\tthis.emit(\"bookloaded\");\n\t\t});\n\n\t\tthis.book.loaded.metadata.then((meta) => {\n\t\t\tthis.emit(\"metadata\", meta);\n\t\t});\n\n\t\tthis.book.loaded.navigation.then((toc) => {\n\t\t\tthis.emit(\"navigation\", toc);\n\t\t});\n\n\t\tthis.rendition.on(\"click\", (e) => {\n\t\t\tconst selection = e.view.document.getSelection();\n\t\t\tif (selection.type !== \"Range\") {\n\t\t\t\tthis.emit(\"unselected\");\n\t\t\t}\n\t\t});\n\n\t\tthis.rendition.on(\"layout\", (props) => {\n\t\t\tthis.emit(\"layout\", props);\n\t\t});\n\n\t\tthis.rendition.on(\"selected\", (cfiRange, contents) => {\n\t\t\tthis.setLocation(cfiRange);\n\t\t\tthis.emit(\"selected\", cfiRange, contents);\n\t\t});\n\n\t\tthis.rendition.on(\"relocated\", (location) => {\n\t\t\tthis.setLocation(location.start.cfi);\n\t\t\tthis.emit(\"relocated\", location);\n\t\t});\n\n\t\tthis.rendition.on(\"keydown\", this.keyboardHandler.bind(this));\n\n\t\tthis.on(\"prev\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.next();\n\t\t\t} else {\n\t\t\t\tthis.rendition.prev();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"next\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.prev();\n\t\t\t} else {\n\t\t\t\tthis.rendition.next();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"languagechanged\", (value) => {\n\t\t\tthis.settings.language = value;\n\t\t});\n\n\t\tthis.on(\"flowchanged\", (value) => {\n\t\t\tthis.settings.flow = value;\n\t\t\tthis.rendition.flow(value);\n\t\t});\n\n\t\tthis.on(\"spreadchanged\", (value) => {\n\t\t\tconst mod = value.mod || this.settings.spread.mod;\n\t\t\tconst min = value.min || this.settings.spread.min;\n\t\t\tthis.settings.spread.mod = mod;\n\t\t\tthis.settings.spread.min = min;\n\t\t\tthis.rendition.spread(mod, min);\n\t\t});\n\n\t\tthis.on(\"styleschanged\", (value) => {\n\t\t\tconst fontSize = value.fontSize;\n\t\t\tthis.settings.styles.fontSize = fontSize;\n\t\t\tthis.rendition.themes.fontSize(fontSize + \"%\");\n\t\t});\n\t}\n\n\t/* ------------------------------- Common ------------------------------- */\n\n\tnavItemFromCfi(cfi) {\n\n\t\t// This feature was added to solve the problem of duplicate titles in \n\t\t// bookmarks. But this still has no solution because when reloading the \n\t\t// reader, rendition cannot get the range from the previously saved CFI.\n\t\tconst range = this.rendition.getRange(cfi);\n\t\tconst idref = range ? range.startContainer.parentNode.id : undefined;\n\t\tconst location = this.rendition.currentLocation();\n\t\tconst href = location.start.href;\n\t\treturn this.navItems[href + \"#\" + idref] || this.navItems[href];\n\t}\n\n\t/* ------------------------------ Bookmarks ----------------------------- */\n\n\t/**\n\t * Verifying the current page in bookmarks.\n\t * @param {*} cfi\n\t * @returns The index of the bookmark if it exists, or -1 otherwise.\n\t */\n\tisBookmarked(cfi) {\n\n\t\treturn this.settings.bookmarks.indexOf(cfi);\n\t}\n\n\t/* ----------------------------- Annotations ---------------------------- */\n\n\tisAnnotated(note) {\n\n\t\treturn this.settings.annotations.indexOf(note);\n\t}\n\n\t/* ------------------------------ Settings ------------------------------ */\n\n\t/**\n\t * Initialize book settings.\n\t * @param {any} bookPath\n\t * @param {any} settings\n\t */\n\tcfgInit(bookPath, settings) {\n\n\t\tthis.entryKey = md5(bookPath).toString();\n\t\tthis.settings = {\n\t\t\tbookPath: bookPath,\n\t\t\tarrows: this.isMobile ? \"none\" : \"content\", // none | content | toolbar\n\t\t\tmanager: this.isMobile ? \"continuous\" : \"default\",\n\t\t\trestore: true,\n\t\t\thistory: true,\n\t\t\topenbook: this.storage.indexedDB ? true : false,\n\t\t\tlanguage: \"en\",\n\t\t\tsectionId: undefined,\n\t\t\tbookmarks: [], // array | false\n\t\t\tannotations: [], // array | false\n\t\t\tflow: \"paginated\", // paginated | scrolled\n\t\t\tspread: {\n\t\t\t\tmod: \"auto\", // auto | none\n\t\t\t\tmin: 800\n\t\t\t},\n\t\t\tstyles: {\n\t\t\t\tfontSize: 100\n\t\t\t},\n\t\t\tpagination: undefined, // not implemented\n\t\t\tfullscreen: document.fullscreenEnabled\n\t\t};\n\n\t\textend(settings || {}, this.settings);\n\n\t\tif (this.settings.restore) {\n\t\t\tthis.applySavedSettings(settings || {});\n\t\t} else {\n\t\t\tthis.removeSavedSettings();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the book setting can be retrieved from localStorage.\n\t * @returns true if the book key exists, or false otherwise.\n\t */\n\tisSaved() {\n\n\t\treturn localStorage && localStorage.getItem(this.entryKey) !== null;\n\t}\n\n\t/**\n\t * Removing the current book settings from local storage.\n\t * @returns true if the book settings were deleted successfully, or false\n\t * otherwise.\n\t */\n\tremoveSavedSettings() {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlocalStorage.removeItem(this.entryKey);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Applies saved settings from local storage.\n\t * @param {*} external External settings\n\t * @returns True if the settings were applied successfully, false otherwise.\n\t */\n\tapplySavedSettings(external) {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlet stored;\n\t\ttry {\n\t\t\tstored = JSON.parse(localStorage.getItem(this.entryKey));\n\t\t} catch (e) {\n\t\t\tconsole.exception(e);\n\t\t}\n\n\t\tif (stored) {\n\t\t\textend(stored, this.settings, external);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Saving the current book settings in local storage.\n\t */\n\tsaveSettings() {\n\n\t\tthis.settings.previousLocationCfi = this.rendition.location.start.cfi;\n\t\tconst cfg = Object.assign({}, this.settings);\n\t\tdelete cfg.arrows;\n\t\tdelete cfg.manager;\n\t\tdelete cfg.history;\n\t\tdelete cfg.restore;\n\t\tdelete cfg.openbook;\n\t\tdelete cfg.pagination;\n\t\tdelete cfg.fullscreen;\n\t\tlocalStorage.setItem(this.entryKey, JSON.stringify(cfg));\n\t}\n\n\tsetLocation(cfi) {\n\n\t\tconst baseUrl = this.book.archived ? undefined : this.book.url;\n\t\tconst url = new URL(window.location, baseUrl);\n\t\turl.hash = \"#\" + cfi;\n\n\t\t// Update the History Location\n\t\tif (this.settings.history && window.location.hash !== url.hash) {\n\t\t\t// Add CFI fragment to the history\n\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\tthis.currentLocationCfi = cfi;\n\t\t}\n\t}\n\n\t//-- event handlers --//\n\n\tunload() {\n\n\t\tif (this.settings.restore && localStorage) {\n\t\t\tthis.saveSettings();\n\t\t}\n\t}\n\n\thashChanged() {\n\n\t\tconst hash = window.location.hash.slice(1);\n\t\tthis.rendition.display(hash);\n\t}\n\n\tkeyboardHandler(e) {\n\n\t\tconst step = 2;\n\t\tlet value = this.settings.styles.fontSize;\n\n\t\tswitch (e.key) {\n\n\t\t\tcase \"=\":\n\t\t\tcase \"+\":\n\t\t\t\tvalue += step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"-\":\n\t\t\t\tvalue -= step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"0\":\n\t\t\t\tvalue = 100;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tthis.emit(\"prev\");\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tthis.emit(\"next\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nEventEmitter(Reader.prototype);"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/epubreader.js","mappings":";;;;;AAAa;;AAEb,sBAAsB,mBAAO,CAAC,GAAe;AAC7C,sBAAsB,mBAAO,CAAC,GAAwB;AACtD,sBAAsB,mBAAO,CAAC,GAAuB;AACrD,sBAAsB,mBAAO,CAAC,GAAkC;AAChE,sBAAsB,mBAAO,CAAC,GAA2B;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,UAAU;AACV;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,UAAU;AACV;AACA;;;;;;;;AC7Da;;AAEb;AACA;;;;;;;;ACHa;;AAEb,iBAAiB,mBAAO,CAAC,GAAkB,sBAAsB,mBAAO,CAAC,GAAQ;;;;;;;;ACFpE;;AAEb;AACA;AACA;AACA,SAAS;AACT,eAAe,YAAY,IAAI,cAAc;AAC7C;AACA;;;;;;;;ACRa;;AAEb,YAAY,mBAAO,CAAC,EAAS;AAC7B,YAAY,mBAAO,CAAC,GAAgB;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBa;;AAEb,iBAAiB,mBAAO,CAAC,EAAkB,KAAK;;AAEhD,kCAAkC;;;;;;;;ACJrB;;AAEb,iBAAiB,mBAAO,CAAC,GAAkB,oBAAoB,mBAAO,CAAC,GAAQ;;;;;;;;ACFlE;;AAEb;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;ACTa;;AAEb,cAAc,mBAAO,CAAC,GAAa;;AAEnC;;AAEA,qCAAqC;;;;;;;;ACNxB;;AAEb,cAAc,mBAAO,CAAC,GAAY;;AAElC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;;;;;;;;ACnBa;;AAEb;AACA;AACA;AACA;;;;;;;;ACLa;;AAEb,cAAc,mBAAO,CAAC,GAAY;;AAElC;AACA;AACA;AACA;;;;;;;;ACPa;;AAEb,iBAAiB,mBAAO,CAAC,GAAkB,kCAAkC,mBAAO,CAAC,GAAQ;;;;;;;;ACFhF;;AAEb;;AAEA;AACA;AACA;AACA;;;;;;;;ACPa;;AAEb;;AAEA;AACA;AACA;;;;;;;;ACNa;;AAEb,eAAe,mBAAO,CAAC,GAAG;AAC1B,eAAe,mBAAO,CAAC,GAA+B;;AAEtD;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,4BAA4B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;;AAErB;AACA,cAAc,2BAA2B;AACzC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B;;AAE1B;AACA;AACA;AACA,eAAe;;;;;;;;ACnIF;;AAEb,kBAAkB,mBAAO,CAAC,GAAiB;;AAE3C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;;;;;;;AClBa;;AAEb,cAAc,mBAAO,CAAC,GAAa;;AAEnC;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;;;;;;;;ACVa;;AAEb,iBAAiB,mBAAO,CAAC,EAAgB;;AAEzC,4BAA4B,EAAE;;AAE9B;AACA;AACA;AACA;AACA;;;;;;;;ACVa;;AAEb,eAAe,mBAAO,CAAC,GAAc;;AAErC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;ACZa;;AAEb;AACA;;AAEA,oCAAoC;;;;;;;SCLpC;SACA;;SAEA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;SACA;;SAEA;SACA;;SAEA;SACA;SACA;;;;;UCtBA;UACA;UACA;UACA;UACA,yCAAyC,wCAAwC;UACjF;UACA;UACA;;;;;UCPA;;;;;UCAA;UACA;UACA;UACA,uDAAuD,iBAAiB;UACxE;UACA,gDAAgD,aAAa;UAC7D;;;;;;;;;;;;;;;;ACNA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,gCAAgC,mBAAmB;AACnD;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,mBAAmB;AACpD;AACA;AACA;;ACnGO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA,YAAY;AACZ;;AClRA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA;;AAEA;;AAEA,kBAAkB,sBAAsB;;AAExC;;AAEA;;AAEA;;AAEA,KAAK;;AAEL,oBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,sBAAsB;;AAExC;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,GAAG;AACd;AACO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,KAAK;AAC1D,IAAI;AACJ;AACA,qDAAqD,KAAK;AAC1D;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,eAAe;AAC1B;AACO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA,yCAAyC;AACzC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACO;;AAEP;;AAEA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,WAAW;AACtB;AACO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB;AACO;AACP;AACA;AACA;AACA;;AC/wBkF;;AAE3E,0BAA0B,OAAO;;AAExC;;AAEA;AACA,wBAAwB,KAAK;AAC7B;;AAEA;AACA,qBAAqB,OAAO;AAC5B;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA;AACA;;AAEA;AACA,mBAAmB,MAAM;AACzB;AACA,gBAAgB,KAAK;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEoF;AAClC;;AAE3C;;AAEP;;AAEA;AACA;;AAEA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,KAAK;AACzB,wBAAwB,KAAK;AAC7B,wBAAwB,OAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,KAAK;AACtB,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,KAAK;AAC3B,uBAAuB,MAAM;;AAE7B;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB,eAAe,OAAO;;AAEtB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA,qBAAqB,KAAK;AAC1B,qBAAqB,OAAO;;AAE5B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,UAAU;;AAErD;AACA;;AAEA;AACA;AACA,MAAM;;AAEN;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA,uBAAuB,KAAK;AAC5B,uBAAuB,OAAO;;AAE9B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA,8BAA8B,KAAK;;AAEnC,0BAA0B,OAAO;AACjC;;AAEA,yBAAyB,KAAK;AAC9B,2BAA2B,MAAM;AACjC,wBAAwB,MAAM;AAC9B,wBAAwB,MAAM;;AAE9B;AACA;AACA;;AAEA;AACA;;;;AAIA;AACA,oBAAoB,KAAK;AACzB;AACA;AACA;AACA;AACA,uBAAuB,KAAK;AAC5B,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA,sBAAsB,OAAO;AAC7B,wBAAwB,KAAK;AAC7B,4BAA4B,OAAO;AACnC,4BAA4B,OAAO;AACnC,0BAA0B,OAAO;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAkC,oBAAoB;AACtD;;AAEA;AACA;AACA;AACA;;AAEA,kCAAkC,oBAAoB;AACtD;;AAEA;AACA;AACA;AACA;;AAEA,mCAAmC,oBAAoB;AACvD,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,KAAK;AACL;AACA;AACA;AACA;AACA,2BAA2B,KAAK;AAChC,qBAAqB,OAAO;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,kBAAkB,KAAK;AACvB,kBAAkB,OAAO;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,qBAAqB,KAAK;AAC1B,qBAAqB,OAAO;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,6BAA6B,KAAK;AAClC,uBAAuB,OAAO;AAC9B;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB,KAAK;AACtB,iBAAiB,OAAO;AACxB;;;;AAIA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;ACvqBwC;;AAEjC;;AAEP;;AAEA;AACA,wBAAwB,KAAK;;AAE7B;AACA;;AAEA,cAAc,KAAK;AACnB;;AAEA;AACA;AACA;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;;AAEA,qBAAqB,KAAK;AAC1B;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,cAAc,KAAK;AACnB;;AAEA;AACA;AACA;AACA,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;;AAEA,qBAAqB,KAAK;AAC1B,sBAAsB,KAAK;AAC3B,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;;AAEH;;AAEA;AACA,GAAG;AACH;AACA;;AC9HyF;;AAElF,uBAAuB,OAAO;;AAErC;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B;AACA,6BAA6B;AAC7B;AACA,eAAe,KAAK;;AAEpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;;AAEA;AACA,GAAG;AACH;;AAEA;;AAEA,mBAAmB,MAAM;;AAEzB;;AAEA,oBAAoB,MAAM;AAC1B,oBAAoB,MAAM;AAC1B,oBAAoB,MAAM;;AAE1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AC5FyG;;AAElG,6BAA6B,OAAO;;AAE3C;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC,uBAAuB,OAAO;AAC9B;;AAEA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA,uBAAuB,MAAM;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;;AAEA,0CAA0C;AAC1C,GAAG;;AAEH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;ACtI8G;;AAEvG,+BAA+B,OAAO;;AAE7C;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC,uBAAuB,OAAO;AAC9B;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,IAAI;AACJ;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB,mBAAmB,MAAM;AACzB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AC5IsG;;AAE/F,4BAA4B,OAAO;;AAE1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC,eAAe,KAAK;;AAEpB,4BAA4B,OAAO;AACnC,0BAA0B,KAAK;AAC/B,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,OAAO;AACnC,0BAA0B,KAAK;AAC/B,uBAAuB,QAAQ;;AAE/B;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,OAAO;AAC/B,sBAAsB,KAAK;AAC3B,mBAAmB,QAAQ;AAC3B;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6BAA6B,QAAQ;AACrC,0BAA0B,OAAO;AACjC,wBAAwB,KAAK;AAC7B,qBAAqB,QAAQ;AAC7B;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA,kCAAkC,OAAO;AACzC,gCAAgC,KAAK;AACrC;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA,4BAA4B,KAAK;AACjC,yBAAyB,OAAO;AAChC;AACA;;AAEA;AACA;;AAEA,wBAAwB,OAAO;AAC/B;;AAEA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AChLyE;;AAElE,4BAA4B,OAAO;;AAE1C;;AAEA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,eAAe,KAAK;AACpB;;AAEA,mBAAmB,MAAM;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,qBAAqB,MAAM;AAC3B,qBAAqB,MAAM;AAC3B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AChEwD;AACZ;AACY;AACI;AACV;AACI;AACA;;AAE/C;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,aAAa;;AAErC,wBAAwB,KAAK;AAC7B,wBAAwB,OAAO;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sDAAsD,QAAQ;AAC9D;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;;AAEA,sDAAsD,WAAW;AACjE,sDAAsD,aAAa;AACnE,sDAAsD,aAAa;AACnE;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;ACnFkC;AACuB;;AAElD;;AAEP;;AAEA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC,4BAA4B,OAAO;AACnC;;AAEA;AACA;AACA;;AAEA,2BAA2B,OAAO;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,0BAA0B,KAAK;AAC/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA,SAAS;AACT;AACA;;ACvEkD;AAClD;AACO;AACP;AACA;AACA;AACA;AACA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,KAAK;AAClC,gCAAgC,KAAK;AACrC;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA;AACA,8BAA8B,KAAK;AACnC,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,4DAA4D;AAC9E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E,kBAAkB,6DAA6D;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,WAAW;AAC/D,qDAAqD,YAAY;AACjE;AACA,kDAAkD,UAAU;AAC5D;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,KAAK;AAC3C,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;ACzJyC;;AAES;AACX;AACA;AACA;AACA;AACA;AACA;AACF;;AAE9B;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B,sBAAsB,OAAO;AAC7B,qBAAqB,MAAM;AAC3B,sBAAsB,OAAO;AAC7B;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;;AAEA;AACA,kBAAkB,YAAY;AAC9B,qBAAqB,OAAO;AAC5B;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf,YAAY,GAAG;AACf;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,GAAG;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAY,KAAK;AACjB,YAAY,KAAK;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,EAAE,MAAM,eAAe;;AAEvB;AACA,yCAAyC;AACzC,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY,GAAG;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,GAAG,MAAM;AACT;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAY,mB","sources":["webpack://epubreader-js/./node_modules/d/index.js","webpack://epubreader-js/./node_modules/es5-ext/function/noop.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/is-value.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/normalize-options.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-callable.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-value.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/index.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/shim.js","webpack://epubreader-js/./node_modules/event-emitter/index.js","webpack://epubreader-js/./node_modules/type/function/is.js","webpack://epubreader-js/./node_modules/type/object/is.js","webpack://epubreader-js/./node_modules/type/plain-function/is.js","webpack://epubreader-js/./node_modules/type/prototype/is.js","webpack://epubreader-js/./node_modules/type/value/is.js","webpack://epubreader-js/webpack/bootstrap","webpack://epubreader-js/webpack/runtime/define property getters","webpack://epubreader-js/webpack/runtime/hasOwnProperty shorthand","webpack://epubreader-js/webpack/runtime/make namespace object","webpack://epubreader-js/./src/utils.js","webpack://epubreader-js/./src/storage.js","webpack://epubreader-js/./src/strings.js","webpack://epubreader-js/./src/ui.js","webpack://epubreader-js/./src/sidebar/search.js","webpack://epubreader-js/./src/toolbar.js","webpack://epubreader-js/./src/content.js","webpack://epubreader-js/./src/sidebar/toc.js","webpack://epubreader-js/./src/sidebar/bookmarks.js","webpack://epubreader-js/./src/sidebar/annotations.js","webpack://epubreader-js/./src/sidebar/settings.js","webpack://epubreader-js/./src/sidebar/metadata.js","webpack://epubreader-js/./src/sidebar.js","webpack://epubreader-js/./src/notedlg.js","webpack://epubreader-js/./src/status.js","webpack://epubreader-js/./src/reader.js"],"sourcesContent":["\"use strict\";\n\nvar isValue = require(\"type/value/is\")\n , isPlainFunction = require(\"type/plain-function/is\")\n , assign = require(\"es5-ext/object/assign\")\n , normalizeOpts = require(\"es5-ext/object/normalize-options\")\n , contains = require(\"es5-ext/string/#/contains\");\n\nvar d = (module.exports = function (dscr, value/*, options*/) {\n\tvar c, e, w, options, desc;\n\tif (arguments.length < 2 || typeof dscr !== \"string\") {\n\t\toptions = value;\n\t\tvalue = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[2];\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t\tw = contains.call(dscr, \"w\");\n\t} else {\n\t\tc = w = true;\n\t\te = false;\n\t}\n\n\tdesc = { value: value, configurable: c, enumerable: e, writable: w };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n});\n\nd.gs = function (dscr, get, set/*, options*/) {\n\tvar c, e, options, desc;\n\tif (typeof dscr !== \"string\") {\n\t\toptions = set;\n\t\tset = get;\n\t\tget = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[3];\n\t}\n\tif (!isValue(get)) {\n\t\tget = undefined;\n\t} else if (!isPlainFunction(get)) {\n\t\toptions = get;\n\t\tget = set = undefined;\n\t} else if (!isValue(set)) {\n\t\tset = undefined;\n\t} else if (!isPlainFunction(set)) {\n\t\toptions = set;\n\t\tset = undefined;\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t} else {\n\t\tc = true;\n\t\te = false;\n\t}\n\n\tdesc = { get: get, set: set, configurable: c, enumerable: e };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n};\n","\"use strict\";\n\n// eslint-disable-next-line no-empty-function\nmodule.exports = function () {};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.assign : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\tvar assign = Object.assign, obj;\n\tif (typeof assign !== \"function\") return false;\n\tobj = { foo: \"raz\" };\n\tassign(obj, { bar: \"dwa\" }, { trzy: \"trzy\" });\n\treturn obj.foo + obj.bar + obj.trzy === \"razdwatrzy\";\n};\n","\"use strict\";\n\nvar keys = require(\"../keys\")\n , value = require(\"../valid-value\")\n , max = Math.max;\n\nmodule.exports = function (dest, src /*, …srcn*/) {\n\tvar error, i, length = max(arguments.length, 2), assign;\n\tdest = Object(value(dest));\n\tassign = function (key) {\n\t\ttry {\n\t\t\tdest[key] = src[key];\n\t\t} catch (e) {\n\t\t\tif (!error) error = e;\n\t\t}\n\t};\n\tfor (i = 1; i < length; ++i) {\n\t\tsrc = arguments[i];\n\t\tkeys(src).forEach(assign);\n\t}\n\tif (error !== undefined) throw error;\n\treturn dest;\n};\n","\"use strict\";\n\nvar _undefined = require(\"../function/noop\")(); // Support ES3 engines\n\nmodule.exports = function (val) { return val !== _undefined && val !== null; };\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.keys : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\ttry {\n\t\tObject.keys(\"primitive\");\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\nvar isValue = require(\"../is-value\");\n\nvar keys = Object.keys;\n\nmodule.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nvar forEach = Array.prototype.forEach, create = Object.create;\n\nvar process = function (src, obj) {\n\tvar key;\n\tfor (key in src) obj[key] = src[key];\n};\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = function (opts1 /*, …options*/) {\n\tvar result = create(null);\n\tforEach.call(arguments, function (options) {\n\t\tif (!isValue(options)) return;\n\t\tprocess(Object(options), result);\n\t});\n\treturn result;\n};\n","\"use strict\";\n\nmodule.exports = function (fn) {\n\tif (typeof fn !== \"function\") throw new TypeError(fn + \" is not a function\");\n\treturn fn;\n};\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) throw new TypeError(\"Cannot use null or undefined\");\n\treturn value;\n};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? String.prototype.contains : require(\"./shim\");\n","\"use strict\";\n\nvar str = \"razdwatrzy\";\n\nmodule.exports = function () {\n\tif (typeof str.contains !== \"function\") return false;\n\treturn str.contains(\"dwa\") === true && str.contains(\"foo\") === false;\n};\n","\"use strict\";\n\nvar indexOf = String.prototype.indexOf;\n\nmodule.exports = function (searchString /*, position*/) {\n\treturn indexOf.call(this, searchString, arguments[1]) > -1;\n};\n","'use strict';\n\nvar d = require('d')\n , callable = require('es5-ext/object/valid-callable')\n\n , apply = Function.prototype.apply, call = Function.prototype.call\n , create = Object.create, defineProperty = Object.defineProperty\n , defineProperties = Object.defineProperties\n , hasOwnProperty = Object.prototype.hasOwnProperty\n , descriptor = { configurable: true, enumerable: false, writable: true }\n\n , on, once, off, emit, methods, descriptors, base;\n\non = function (type, listener) {\n\tvar data;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) {\n\t\tdata = descriptor.value = create(null);\n\t\tdefineProperty(this, '__ee__', descriptor);\n\t\tdescriptor.value = null;\n\t} else {\n\t\tdata = this.__ee__;\n\t}\n\tif (!data[type]) data[type] = listener;\n\telse if (typeof data[type] === 'object') data[type].push(listener);\n\telse data[type] = [data[type], listener];\n\n\treturn this;\n};\n\nonce = function (type, listener) {\n\tvar once, self;\n\n\tcallable(listener);\n\tself = this;\n\ton.call(this, type, once = function () {\n\t\toff.call(self, type, once);\n\t\tapply.call(listener, this, arguments);\n\t});\n\n\tonce.__eeOnceListener__ = listener;\n\treturn this;\n};\n\noff = function (type, listener) {\n\tvar data, listeners, candidate, i;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return this;\n\tdata = this.__ee__;\n\tif (!data[type]) return this;\n\tlisteners = data[type];\n\n\tif (typeof listeners === 'object') {\n\t\tfor (i = 0; (candidate = listeners[i]); ++i) {\n\t\t\tif ((candidate === listener) ||\n\t\t\t\t\t(candidate.__eeOnceListener__ === listener)) {\n\t\t\t\tif (listeners.length === 2) data[type] = listeners[i ? 0 : 1];\n\t\t\t\telse listeners.splice(i, 1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ((listeners === listener) ||\n\t\t\t\t(listeners.__eeOnceListener__ === listener)) {\n\t\t\tdelete data[type];\n\t\t}\n\t}\n\n\treturn this;\n};\n\nemit = function (type) {\n\tvar i, l, listener, listeners, args;\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return;\n\tlisteners = this.__ee__[type];\n\tif (!listeners) return;\n\n\tif (typeof listeners === 'object') {\n\t\tl = arguments.length;\n\t\targs = new Array(l - 1);\n\t\tfor (i = 1; i < l; ++i) args[i - 1] = arguments[i];\n\n\t\tlisteners = listeners.slice();\n\t\tfor (i = 0; (listener = listeners[i]); ++i) {\n\t\t\tapply.call(listener, this, args);\n\t\t}\n\t} else {\n\t\tswitch (arguments.length) {\n\t\tcase 1:\n\t\t\tcall.call(listeners, this);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tcall.call(listeners, this, arguments[1]);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tcall.call(listeners, this, arguments[1], arguments[2]);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tl = arguments.length;\n\t\t\targs = new Array(l - 1);\n\t\t\tfor (i = 1; i < l; ++i) {\n\t\t\t\targs[i - 1] = arguments[i];\n\t\t\t}\n\t\t\tapply.call(listeners, this, args);\n\t\t}\n\t}\n};\n\nmethods = {\n\ton: on,\n\tonce: once,\n\toff: off,\n\temit: emit\n};\n\ndescriptors = {\n\ton: d(on),\n\tonce: d(once),\n\toff: d(off),\n\temit: d(emit)\n};\n\nbase = defineProperties({}, descriptors);\n\nmodule.exports = exports = function (o) {\n\treturn (o == null) ? create(base) : defineProperties(Object(o), descriptors);\n};\nexports.methods = methods;\n","\"use strict\";\n\nvar isPrototype = require(\"../prototype/is\");\n\nmodule.exports = function (value) {\n\tif (typeof value !== \"function\") return false;\n\n\tif (!hasOwnProperty.call(value, \"length\")) return false;\n\n\ttry {\n\t\tif (typeof value.length !== \"number\") return false;\n\t\tif (typeof value.call !== \"function\") return false;\n\t\tif (typeof value.apply !== \"function\") return false;\n\t} catch (error) {\n\t\treturn false;\n\t}\n\n\treturn !isPrototype(value);\n};\n","\"use strict\";\n\nvar isValue = require(\"../value/is\");\n\n// prettier-ignore\nvar possibleTypes = { \"object\": true, \"function\": true, \"undefined\": true /* document.all */ };\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) return false;\n\treturn hasOwnProperty.call(possibleTypes, typeof value);\n};\n","\"use strict\";\n\nvar isFunction = require(\"../function/is\");\n\nvar classRe = /^\\s*class[\\s{/}]/, functionToString = Function.prototype.toString;\n\nmodule.exports = function (value) {\n\tif (!isFunction(value)) return false;\n\tif (classRe.test(functionToString.call(value))) return false;\n\treturn true;\n};\n","\"use strict\";\n\nvar isObject = require(\"../object/is\");\n\nmodule.exports = function (value) {\n\tif (!isObject(value)) return false;\n\ttry {\n\t\tif (!value.constructor) return false;\n\t\treturn value.constructor.prototype === value;\n\t} catch (error) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\n// ES3 safe\nvar _undefined = void 0;\n\nmodule.exports = function (value) { return value !== _undefined && value !== null; };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const d = (obj, prop) => obj ? obj[prop] : undefined\n\nconst q = (src, dst, ext, prop) => {\n let val\n if (typeof dst[prop] === \"boolean\") {\n switch (prop) {\n case \"annotations\":\n case \"bookmarks\":\n val = dst[prop] ? src[prop] : dst[prop]\n break;\n default:\n val = dst[prop]\n break;\n }\n } else if (prop === \"arrows\") {\n val = dst[prop]\n } else {\n val = d(ext, prop) === undefined ? src[prop] : dst[prop]\n }\n return val\n}\n\nexport const extend = (src, dst, ext) => {\n for (let prop in src) {\n if (prop === \"bookPath\") {\n continue\n } else if (dst[prop] instanceof Array) {\n dst[prop] = ext ? (src[prop] ? src[prop] : dst[prop]) : src[prop]\n } else if (dst[prop] instanceof Object) {\n extend(src[prop], dst[prop], d(ext, prop)) // recursive call\n } else {\n dst[prop] = ext ? q(src, dst, ext, prop) : src[prop]\n }\n }\n}\n\nexport const uuid = () => {\n let d = new Date().getTime()\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n let r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === \"x\" ? r : (r & 0x7 | 0x8)).toString(16)\n })\n return uuid\n}\n\nexport const detectMobile = () => {\n const matches = [\n /Android/i,\n /BlackBerry/i,\n /iPhone/i,\n /iPad/i,\n /iPod/i,\n /Windows Phone/i,\n /webOS/i\n ]\n return matches.some((i) => navigator.userAgent.match(i))\n}","export class Storage {\n\n\tconstructor() {\n\n\t\tthis.name = \"epubreader-js\";\n\t\tthis.version = 1.0;\n\t\tthis.db;\n\t\tthis.indexedDB = window.indexedDB ||\n\t\t\twindow.webkitIndexedDB ||\n\t\t\twindow.mozIndexedDB ||\n\t\t\twindow.OIndexedDB ||\n\t\t\twindow.msIndexedDB;\n\n\t\tif (this.indexedDB === undefined) {\n\n\t\t\tconsole.error(\"The IndexedDB API not available in your browser.\");\n\t\t}\n\t}\n\n\tinit(callback) {\n\n\t\tif (this.indexedDB === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst onerror = (e) => console.error(\"IndexedDB\", e);\n\t\tconst request = indexedDB.open(this.name, this.version);\n\t\trequest.onupgradeneeded = (e) => {\n\n\t\t\tconst db = e.target.result;\n\t\t\tif (db.objectStoreNames.contains(\"entries\") === false) {\n\t\t\t\tdb.createObjectStore(\"entries\");\n\t\t\t}\n\t\t}\n\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tthis.db = e.target.result;\n\t\t\tthis.db.onerror = onerror;\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.init: ${Date.now() - time} ms`);\n\t\t}\n\n\t\trequest.onerror = onerror;\n\t}\n\n\tget(callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.get(0);\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tcallback(e.target.result);\n\t\t\tconsole.log(`storage.get: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tset(data, callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.put(data, 0);\n\t\trequest.onsuccess = () => {\n\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.set: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tclear() {\n\n\t\tif (this.db === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.clear();\n\t\trequest.onsuccess = () => {\n\n\t\t\tconsole.log(`storage.clear: ${Date.now() - time} ms`);\n\t\t}\n\t}\n}","export class Strings {\n\n\tconstructor(reader) {\n\n\t\tthis.language = reader.settings.language || \"en\";\n\t\tthis.values = {\n\t\t\ten: {\n\t\t\t\t\"toolbar/sidebar\": \"Sidebar\",\n\t\t\t\t\"toolbar/prev\": \"Previous page\",\n\t\t\t\t\"toolbar/next\": \"Next page\",\n\t\t\t\t\"toolbar/openbook\": \"Open book\",\n\t\t\t\t\"toolbar/openbook/error\": \"Your browser does not support the required features.\\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Add this page to bookmarks\",\n\t\t\t\t\"toolbar/fullscreen\": \"Fullscreen\",\n\t\t\t\t\"toolbar/background\": \"Change background\",\n\n\t\t\t\t\"sidebar/close\": \"Close Sidebar\",\n\t\t\t\t\"sidebar/contents\": \"Contents\",\n\t\t\t\t\"sidebar/bookmarks\": \"Bookmarks\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Add\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Remove\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Add\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Remove\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Anchor\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Cancel\",\n\t\t\t\t\"sidebar/search\": \"Search\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Search\",\n\t\t\t\t\"sidebar/settings\": \"Settings\",\n\t\t\t\t\"sidebar/settings/language\": \"Language\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Font size (%)\",\n\t\t\t\t\"sidebar/settings/flow\": \"Flow\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Generate pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Spread\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Minimum spread width\",\n\t\t\t\t\"sidebar/metadata\": \"Metadata\",\n\t\t\t\t\"sidebar/metadata/title\": \"Title\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Creator\",\n\t\t\t\t\"sidebar/metadata/description\": \"Description\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Pubdate\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Publisher\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Identifier\",\n\t\t\t\t\"sidebar/metadata/language\": \"Language\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Rights\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Modified date\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Layout\", // rendition:layout\n\t\t\t\t\"sidebar/metadata/flow\": \"Flow\", // rendition:flow\n\t\t\t\t\"sidebar/metadata/spread\": \"Spread\", // rendition:spread\n\t\t\t\t\"sidebar/metadata/direction\": \"Direction\", // page-progression-direction\n\n\t\t\t\t\"notedlg/label\": \"Note\",\n\t\t\t\t\"notedlg/add\": \"Add\",\n\n\t\t\t\t\"status/fullscreen\": \"Fullscreen\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\t\"toolbar/sidebar\": \"Barre latérale\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"Ouvrir un livre local\",\n\t\t\t\t\"toolbar/openbook/error\": \"Votre navigateur ne prend pas en charge les fonctions nécessaires.\\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Insérer un marque page ici\",\n\t\t\t\t\"toolbar/fullscreen\": \"Plein écran\",\n\t\t\t\t\"toolbar/background\": \"Changer l'arrière-plan\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"Sommaire\",\n\t\t\t\t\"sidebar/bookmarks\": \"Marque-pages\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Ancre\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Annuler\",\n\t\t\t\t\"sidebar/search\": \"Rechercher\",\n\t\t\t\t\"sidebar/search/placeholder\": \"rechercher\",\n\t\t\t\t\"sidebar/settings\": \"Réglages\",\n\t\t\t\t\"sidebar/settings/language\": \"Langue\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Établir une pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"Langue\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"Ajouter\",\n\n\t\t\t\t\"status/fullscreen\": \"\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tja: {\n\t\t\t\t\"toolbar/sidebar\": \"サイドバー\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"本を開く\",\n\t\t\t\t\"toolbar/openbook/error\": \"ご利用のブラウザは必要な機能をサポートしていません。\\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。\",\n\t\t\t\t\"toolbar/bookmark\": \"このページに栞を設定する\",\n\t\t\t\t\"toolbar/fullscreen\": \"フルスクリーン\",\n\t\t\t\t\"toolbar/background\": \"背景を変更する\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"目次\",\n\t\t\t\t\"sidebar/bookmarks\": \"栞\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations\": \"注釈\",\n\t\t\t\t\"sidebar/annotations/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/annotations/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"アンカー\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"キャンセル\",\n\t\t\t\t\"sidebar/search\": \"検索\",\n\t\t\t\t\"sidebar/search/placeholder\": \"検索\",\n\t\t\t\t\"sidebar/settings\": \"設定\",\n\t\t\t\t\"sidebar/settings/language\": \"表示言語\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"ページネーション\", \"ページネーションを生成します。\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"表示言語\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"追加\",\n\n\t\t\t\t\"status/fullscreen\": \"\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tru: {\n\t\t\t\t\"toolbar/sidebar\": \"Боковая панель\",\n\t\t\t\t\"toolbar/prev\": \"Предыдущая страница\",\n\t\t\t\t\"toolbar/next\": \"Следущая страница\",\n\t\t\t\t\"toolbar/openbook\": \"Открыть книгу\",\n\t\t\t\t\"toolbar/openbook/error\": \"Ваш браузер не поддерживает необходимые функции.\\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Добавить эту страницу в закладки\",\n\t\t\t\t\"toolbar/fullscreen\": \"Полноэкранный режим\",\n\t\t\t\t\"toolbar/background\": \"изменить фон\",\n\n\t\t\t\t\"sidebar/close\": \"Закрыть боковую панель\",\n\t\t\t\t\"sidebar/contents\": \"Содержание\",\n\t\t\t\t\"sidebar/bookmarks\": \"Закладки\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Добавить\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations\": \"Аннотации\",\n\t\t\t\t\"sidebar/annotations/add\": \"Добавить\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Метка\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Отмена\",\n\t\t\t\t\"sidebar/search\": \"Поиск\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Поиск\",\n\t\t\t\t\"sidebar/settings\": \"Настройки\",\n\t\t\t\t\"sidebar/settings/language\": \"Язык\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Размер шрифта\",\n\t\t\t\t\"sidebar/settings/flow\": \"Поток\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Нумерация страниц\", \"Генерировать нумерацию страниц\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Мин. ширина колонки\",\n\t\t\t\t\"sidebar/metadata\": \"Метаданные\",\n\t\t\t\t\"sidebar/metadata/title\": \"Заголовок\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Автор\",\n\t\t\t\t\"sidebar/metadata/description\": \"Описание\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Дата публикации\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Издатель\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Идентификатор\",\n\t\t\t\t\"sidebar/metadata/language\": \"Язык\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Лицензия\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Дата изменения\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Макет\",\n\t\t\t\t\"sidebar/metadata/flow\": \"Поток\",\n\t\t\t\t\"sidebar/metadata/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/metadata/direction\": \"Направление\",\n\n\t\t\t\t\"notedlg/label\": \"Заметка\",\n\t\t\t\t\"notedlg/add\": \"Добавить\",\n\n\t\t\t\t\"status/fullscreen\": \"\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tvi: {\n\t\t\t\t\"toolbar/sidebar\": \"Thanh bên\",\n\t\t\t\t\"toolbar/prev\": \"Trang trước\",\n\t\t\t\t\"toolbar/next\": \"Trang kế tiếp\",\n\t\t\t\t\"toolbar/openbook\": \"Mở sách\",\n\t\t\t\t\"toolbar/openbook/error\": \"Trình duyệt của bạn không hỗ trợ các tính năng cần thiết. Vui lòng sử dụng trình duyệt hiện đại như Google Chrome hoặc Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Thêm trang này vào dấu trang\",\n\t\t\t\t\"toolbar/fullscreen\": \"Toàn màn hình\",\n\t\t\t\t\"toolbar/background\": \"Đổi màu nền\",\n\n\t\t\t\t\"sidebar/close\": \"Đóng thanh bên\",\n\t\t\t\t\"sidebar/contents\": \"Nội dung\",\n\t\t\t\t\"sidebar/bookmarks\": \"Dấu trang\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Thêm dấu trang\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Xóa dấu trang\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"???\",\n\t\t\t\t\"sidebar/annotations\": \"Chú thích\",\n\t\t\t\t\"sidebar/annotations/add\": \"Thêm chú thích\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Xóa chú thích\",\n\t\t\t\t\"sidebar/annotations/clear\": \"???\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"???\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"???\",\n\t\t\t\t\"sidebar/search\": \"Tìm kiếm\",\n\t\t\t\t\"sidebar/search/placeholder\": \"???\",\n\t\t\t\t\"sidebar/settings\": \"Cài đặt\",\n\t\t\t\t\"sidebar/settings/language\": \"Ngôn ngữ\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Cỡ chữ (%)\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"???\", \"???\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"????\",\n\t\t\t\t\"sidebar/metadata\": \"Metadata\",\n\t\t\t\t\"sidebar/metadata/title\": \"Chủ đề\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Người sáng tạo\",\n\t\t\t\t\"sidebar/metadata/description\": \"Mô tả\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Ngày tạo\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Nhà xuất bản\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Định dạng\",\n\t\t\t\t\"sidebar/metadata/language\": \"Ngôn ngữ\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Quyền\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Ngày sửa đổi\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\", // rendition:layout\n\t\t\t\t\"sidebar/metadata/flow\": \"???\", // rendition:flow\n\t\t\t\t\"sidebar/metadata/spread\": \"???\", // rendition:spread\n\t\t\t\t\"sidebar/metadata/direction\": \"???\", // page-progression-direction\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"???\",\n\n\t\t\t\t\"status/fullscreen\": \"Toàn màn hình\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t}\n\t\t};\n\n\t\treader.on(\"languagechanged\", (value) => {\n\t\t\tthis.language = value;\n\t\t});\n\t}\n\n\tget(key) { return this.values[this.language][key] || \"???\"; }\n}","/**\n * @author mrdoob https://github.com/mrdoob/ui.js\n */\n\nconst ERROR_MSG = \"is not an instance of UIElement.\";\n\n/**\n * UIElement\n * @param {string} tag\n */\nexport class UIElement {\n\n\tconstructor(tag) {\n\n\t\tthis.dom = document.createElement(tag);\n\t}\n\n\tadd() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.appendChild(argument.dom);\n\n\t\t\t} else if (Array.isArray(argument)) {\n\n\t\t\t\tfor (let j = 0; j < argument.length; j++) {\n\n\t\t\t\t\tconst element = argument[j];\n\n\t\t\t\t\tif (element instanceof UIElement) {\n\n\t\t\t\t\t\tthis.dom.appendChild(element.dom);\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error(\"UIElement:\", element, ERROR_MSG);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tremove() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.removeChild(argument.dom);\n\n\t\t\t} else if (Number.isInteger(argument)) {\n\n\t\t\t\tthis.dom.removeChild(this.dom.childNodes[argument]);\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tclear() {\n\n\t\twhile (this.dom.children.length) {\n\n\t\t\tthis.dom.removeChild(this.dom.lastChild);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetId(id) {\n\n\t\tthis.dom.id = id;\n\t\treturn this;\n\t}\n\n\tgetId() {\n\n\t\treturn this.dom.id;\n\t}\n\n\tremoveAttribute(name) {\n\n\t\tthis.dom.removeAttribute(name);\n\t\treturn this;\n\t}\n\n\tsetClass(name) {\n\n\t\tthis.dom.className = name;\n\t\treturn this;\n\t}\n\n\taddClass(name) {\n\n\t\tthis.dom.classList.add(name);\n\t\treturn this;\n\t}\n\n\tremoveClass(name) {\n\n\t\tthis.dom.classList.remove(name);\n\t\treturn this;\n\t}\n\n\tsetStyle(key, value) {\n\n\t\tthis.dom.style[key] = value;\n\t\treturn this;\n\t}\n\n\tgetTitle() {\n\n\t\treturn this.dom.title;\n\t}\n\n\tsetTitle(title) {\n\n\t\tif (this.dom.title !== title && title)\n\t\t\tthis.dom.title = title;\n\t\treturn this;\n\t}\n\n\tgetTextContent() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetTextContent(text) {\n\n\t\tif (this.dom.textContent !== text && text)\n\t\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n\n\tgetBoundingClientRect() {\n\n\t\treturn this.dom.getBoundingClientRect();\n\t}\n}\n\n/**\n * UISpan\n * @param {string} text\n */\nexport class UISpan extends UIElement {\n\n\tconstructor(text) {\n\n\t\tsuper(\"span\");\n\t\tthis.setTextContent(text);\n\t}\n}\n\n/**\n * UIDiv\n */\nexport class UIDiv extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"div\");\n\t}\n\n\tsetClass(className) {\n\t\tthis.dom.className = className;\n\t\treturn this;\n\t}\n\n\taddClass(className) {\n\t\tthis.dom.classList.add(className);\n\t\treturn this;\n\t}\n}\n\n/**\n * UIRow\n */\nexport class UIRow extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"row\";\n\t}\n}\n\n/**\n * UIPanel\n */\nexport class UIPanel extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"panel\";\n\t}\n}\n\n/**\n * UILabel\n * @param {string} text\n * @param {string} id\n */\nexport class UILabel extends UIElement {\n\n\tconstructor(text, id) {\n\n\t\tsuper(\"label\");\n\n\t\tthis.dom.textContent = text;\n\t\tif (id) this.dom.htmlFor = id;\n\t}\n}\n\n/**\n * UILink\n * @param {string} href\n * @param {string} text\n */\nexport class UILink extends UIElement {\n\n\tconstructor(href, text) {\n\n\t\tsuper(\"a\");\n\n\t\tthis.dom.href = href || \"#\";\n\t\tthis.dom.textContent = text || \"\";\n\t}\n\n\tsetHref(url) {\n\n\t\tthis.dom.href = url;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIText\n * @param {string} text\n */\nexport class UIText extends UISpan {\n\n\tconstructor(text) {\n\n\t\tsuper();\n\n\t\tthis.dom.textContent = text;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetValue(text) {\n\n\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITextArea\n */\nexport class UITextArea extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"textarea\");\n\n\t\tthis.dom.spellcheck = false;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UISelect\n */\nexport class UISelect extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"select\");\n\t}\n\n\tsetMultiple(boolean) {\n\n\t\tthis.dom.multiple = boolean || false;\n\t\treturn this;\n\t}\n\n\tsetOptions(options) {\n\n\t\tconst selected = this.dom.value;\n\t\tthis.clear();\n\n\t\tfor (const key in options) {\n\n\t\t\tconst option = document.createElement(\"option\");\n\t\t\toption.value = key;\n\t\t\toption.text = options[key];\n\t\t\tthis.dom.appendChild(option);\n\t\t}\n\t\tthis.dom.value = selected;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tvalue = String(value);\n\n\t\tif (this.dom.value !== value)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIInput\n * @param {*} type\n * @param {*} value\n * @param {*} title\n */\nexport class UIInput extends UIElement {\n\n\tconstructor(type, value, title) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = type;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.setValue(value);\n\t\tthis.setTitle(title);\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tgetType() {\n\n\t\treturn this.dom.type;\n\t}\n\n\tsetType(type) {\n\n\t\tthis.dom.type = type;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tif (this.dom.value !== value && value !== undefined)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIColor\n */\nexport class UIColor extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"input\");\n\n\t\ttry {\n\n\t\t\tthis.dom.type = \"color\";\n\t\t\tthis.dom.value = \"#ffffff\";\n\n\t\t} catch (e) {\n\n\t\t\tconsole.exception(e);\n\t\t}\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tgetHexValue() {\n\n\t\treturn parseInt(this.dom.value.substr(1), 16);\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n\n\tsetHexValue(hex) {\n\n\t\tthis.dom.value = \"#\" + (\"000000\" + hex.toString(16)).slice(-6);\n\t\treturn this;\n\t}\n}\n\n/**\n * UINumber\n * @param {number} value\n * @param {number} step\n * @param {number} min\n * @param {number} max\n * @param {number} precision\n */\nexport class UINumber extends UIElement {\n\n\tconstructor(value, step, min, max, precision) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = \"number\";\n\t\tthis.dom.step = step || 1;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.value = value || 0;\n\t\tthis.min = min || -Infinity;\n\t\tthis.max = max || +Infinity;\n\t\tthis.precision = precision || 0;\n\t\tthis.setValue(value);\n\t\tthis.dom.onchange = (e) => {\n\n\t\t\tthis.setValue(this.value);\n\t\t};\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision) {\n\n\t\tthis.precision = precision;\n\t\tthis.setValue(this.value);\n\t\treturn this;\n\t}\n\n\tsetRange(min, max) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\t\tthis.dom.min = min;\n\t\tthis.dom.max = max;\n\t\treturn this;\n\t}\n\n\tsetStep(step) {\n\n\t\tthis.dom.step = step;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn parseFloat(this.dom.value);\n\t}\n\n\tsetValue(value) {\n\n\t\tif (value !== undefined) {\n\t\t\tvalue = parseFloat(value);\n\n\t\t\tif (value < this.min)\n\t\t\t\tvalue = this.min;\n\t\t\tif (value > this.max)\n\t\t\t\tvalue = this.max;\n\n\t\t\tthis.value = value;\n\t\t\tthis.dom.value = value.toFixed(this.precision);\n\t\t}\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBreak\n */\nexport class UIBreak extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"br\");\n\t}\n}\n\n/**\n * UIHorizontalRule\n */\nexport class UIHorizontalRule extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"hr\");\n\t}\n}\n\n/**\n * UIProgress\n * @param {*} value\n */\nexport class UIProgress extends UIElement {\n\n\tconstructor(value) {\n\n\t\tsuper(\"progress\");\n\n\t\tthis.dom.value = value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITabbedPanel\n * @param {string} align (horizontal | vertical)\n */\nexport class UITabbedPanel extends UIDiv {\n\n\tconstructor(align) {\n\n\t\tsuper();\n\n\t\tthis.align = align || \"horizontal\";\n\t\tthis.tabs = [];\n\t\tthis.panels = [];\n\t\tthis.selector = new UISpan().setClass(\"tab-selector\");\n\t\tthis.menuDiv = new UIDiv().setClass(\"menu\");\n\t\tthis.tabsDiv = new UIDiv().setClass(\"tabs\");\n\t\tthis.tabsDiv.add(this.selector);\n\t\tthis.panelsDiv = new UIDiv().setClass(\"panels\");\n\t\tthis.selected = \"\";\n\t\tthis.add(this.menuDiv);\n\t\tthis.add(this.tabsDiv);\n\t\tthis.add(this.panelsDiv);\n\t}\n\n\taddMenu(items) {\n\t\tthis.menuDiv.add(items);\n\t}\n\n\taddTab(id, label, items) {\n\n\t\tconst tab = new UITab(label, this);\n\t\ttab.setId(id);\n\t\ttab.setClass(\"box\");\n\t\tthis.tabs.push(tab);\n\t\tthis.tabsDiv.add(tab);\n\n\t\tconst panel = new UIDiv();\n\t\tpanel.setId(id);\n\t\tpanel.add(items);\n\t\tthis.panels.push(panel);\n\t\tthis.panelsDiv.add(panel);\n\t\tthis.select(id);\n\t}\n\n\tselect(id) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.addClass(\"selected\");\n\t\t\t\tthis.transformSelector(tab);\n\t\t\t} else if (tab.dom.id === this.selected) {\n\t\t\t\ttab.removeClass(\"selected\");\n\t\t\t}\n\t\t}\n\n\t\tfor (let panel of this.panels) {\n\t\t\tif (panel.dom.id === id) {\n\t\t\t\tpanel.dom.style.display = \"block\";\n\t\t\t} else if (panel.dom.id === this.selected) {\n\t\t\t\tpanel.dom.style.display = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tthis.selected = id;\n\t\treturn this;\n\t}\n\n\tsetLabel(id, text) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.setTitle(text);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\ttransformSelector(tab) {\n\n\t\tlet size;\n\t\tconst rect = tab.getBoundingClientRect();\n\t\tif (this.align === \"horizontal\") {\n\t\t\tsize = rect.width * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateX(${size}px)`;\n\t\t} else {\n\t\t\tsize = rect.height * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateY(${size}px)`;\n\t\t}\n\t}\n}\n\n/**\n * UITab\n * @param {string} text\n * @param {UITabbedPanel} parent\n */\nexport class UITab extends UIDiv {\n\n\tconstructor(text, parent) {\n\n\t\tsuper();\n\t\tthis.button = new UIInput(\"button\");\n\t\tthis.button.dom.title = text;\n\t\tthis.dom.onclick = (e) => {\n\n\t\t\tparent.select(this.dom.id);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(this.button);\n\t}\n}\n\n/**\n * UIList\n * @param {UIItem} parent\n */\nexport class UIList extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"ul\");\n\t\tthis.parent = parent && parent.parent; // LI->UL\n\t\tthis.expanded = false;\n\t}\n\n\texpand() {\n\n\t\tthis.expanded = true;\n\t\tthis.dom.style.display = \"block\";\n\t\tif (this.parent)\n\t\t\tthis.parent.expand();\n\t\treturn this;\n\t}\n\n\tcollaps() {\n\n\t\tthis.expanded = false;\n\t\tthis.dom.style.display = \"none\";\n\t\treturn this;\n\t}\n}\n\n/**\n * UIItem\n * @param {UIList} parent\n */\nexport class UIItem extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"li\");\n\t\tthis.parent = parent; // UL\n\t\tthis.selected = false;\n\t}\n\n\tadd() {\n\t\tlet len = 0;\n\t\tconst box = new UIDiv().setId(\"item-box\");\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\t\t\tconst argument = arguments[i];\n\t\t\tif (argument instanceof UIList) {\n\t\t\t\tsuper.add(argument);\n\t\t\t} else {\n\t\t\t\tbox.add(argument);\n\t\t\t\tlen++;\n\t\t\t}\n\t\t}\n\t\tif (len) super.add(box);\n\t\treturn this;\n\t}\n\n\tselect() {\n\n\t\tthis.selected = true;\n\t\tthis.setClass(\"selected\");\n\t\treturn this;\n\t}\n\n\tunselect() {\n\n\t\tthis.selected = false;\n\t\tthis.removeAttribute(\"class\");\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBox\n * @param {UIElement} items\n */\nexport class UIBox extends UIElement {\n\n\tconstructor(items) {\n\n\t\tsuper(\"div\");\n\t\tthis.setClass(\"box\");\n\t\tthis.add(items);\n\t}\n}\n\n/**\n * UIButton\n * @param {UIButton} items\n */\nexport class UIButton extends UIElement {\n\tconstructor(items) {\n\t\tsuper(\"button\");\n\t}\n}","import { UIPanel, UIDiv, UIInput, UILink, UIList, UIItem, UIBox } from \"../ui.js\";\n\nexport class SearchPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\n\t\tlet searchQuery = undefined;\n\t\tconst search = new UIInput(\"search\").setId(\"nav-q\");\n\t\tsearch.dom.placeholder = strings.get(\"sidebar/search/placeholder\");\n\t\tsearch.dom.onsearch = () => {\n\n\t\t\tconst value = search.getValue();\n\n\t\t\tif (value.length === 0) {\n\t\t\t\tthis.items.clear();\n\t\t\t} else if (searchQuery !== value) {\n\t\t\t\tthis.items.clear();\n\t\t\t\tthis.doSearch(value).then(results => {\n\n\t\t\t\t\tresults.forEach(data => {\n\t\t\t\t\t\tthis.set(data);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tsearchQuery = value;\n\t\t};\n\n\t\tthis.setId(\"search\");\n\t\tthis.items = new UIList();\n\t\tcontainer.add(this.items);\n\t\tthis.add([new UIBox(search), container]);\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined;\n\t\t//\n\t\t// improvement of the highlighting of keywords is required...\n\t\t//\n\t}\n\n\t/**\n\t * Searching the entire book\n\t * @param {*} q Query keyword\n\t * @returns The search result array.\n\t */\n\tasync doSearch(q) {\n\n\t\tconst book = this.reader.book;\n\t\tconst results = await Promise.all(\n\t\t\tbook.spine.spineItems.map(item => item.load(book.load.bind(book))\n\t\t\t\t.then(item.find.bind(item, q)).finally(item.unload.bind(item))));\n\t\treturn await Promise.resolve([].concat.apply([], results));\n\t}\n\n\tset(data) {\n\n\t\tconst link = new UILink(\"#\" + data.cfi, data.excerpt);\n\t\tconst item = new UIItem();\n\t\tlink.dom.onclick = () => {\n\n\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\tthis.selector.unselect();\n\t\t\t\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(data.cfi);\n\t\t\treturn false;\n\t\t};\n\t\titem.add(link);\n\t\tthis.items.add(item);\n\t}\n}","import { UIButton, UIDiv, UIInput, UILabel, UILink, UISpan, UIText } from \"./ui.js\";\nimport { SearchPanel } from \"./sidebar/search.js\";\n\nexport class Toolbar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst settings = reader.settings;\n\n\t\tconst container = new UIDiv().setId(\"toolbar\");\n\t\tconst keys = [\n\t\t\t\"toolbar/sidebar\",\n\t\t\t\"toolbar/prev\",\n\t\t\t\"toolbar/next\",\n\t\t\t\"toolbar/openbook\",\n\t\t\t\"toolbar/openbook/error\",\n\t\t\t\"toolbar/bookmark\",\n\t\t\t\"toolbar/fullscreen\",\n\t\t\t\"toolbar/background\",\n\t\t\t\"toolbar/search\",\n\t\t\t\"toolbar/close\",\n\t\t];\n\n\t\t/*------------------------ Toolbar Menu 1 --------------------------*/\n\t\tconst menu1 = new UIDiv().setClass(\"menu-1\");\n\t\tconst openerBox = new UIDiv().setId(\"btn-m\").setClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.dom.title = strings.get(keys[0]);\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", true);\n\t\t\topenerBtn.dom.blur();\n\t\t\te.preventDefault();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tmenu1.add(openerBox);\n\n\t\tlet prevBox, prevBtn;\n\t\tlet nextBox, nextBtn;\n\t\tif (settings.arrows === \"toolbar\") {\n\t\t\tprevBox = new UIDiv().setId(\"btn-p\").setClass(\"box\");\n\t\t\tprevBtn = new UIInput(\"button\");\n\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\tprevBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t\tprevBtn.dom.blur();\n\t\t\t};\n\t\t\tprevBox.add(prevBtn);\n\t\t\tmenu1.add(prevBox);\n\n\t\t\tnextBox = new UIDiv().setId(\"btn-n\").setClass(\"box\");\n\t\t\tnextBtn = new UIInput(\"button\");\n\t\t\tnextBtn.dom.title = strings.get(keys[2]);\n\t\t\tnextBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t\tnextBtn.dom.blur();\n\t\t\t};\n\t\t\tnextBox.add(nextBtn);\n\t\t\tmenu1.add(nextBox);\n\t\t}\n\n\t\t/* ------------------------ Button Logo ------------------------- */\n\t\tconst logoBox = new UIDiv().setId(\"btn-logo\").setClass(\"logo\");\n\t\tconst logoLink = new UILink().setId(\"logo-link\").setHref(\"#\").setTextContent(\"LOGO\");\n\n\t\tlogoBox.add(logoLink);\n\t\tmenu1.add(logoBox);\n\n\t\t/* ------------------------ Button Index List (muc luc) -------------------------- */\n\t\tlet tocBox, tocBtn;\n\t\ttocBox = new UIDiv().setId(\"btn-t\").setClass(\"box\");\n\t\ttocBtn = new UIInput(\"button\");\n\n\t\t// load toc content title for toc list\n\t\ttocBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\treader.book.loaded.navigation.then((toc) => {\n\t\t\t\tshowToc(toc);\n\t\t\t})\n\t\t}\n\n\t\ttocBox.add(tocBtn);\n\t\tmenu1.add(tocBox);\n\n\t\t// Function to show the toc list\n\t\tfunction showToc(toc) {\n\t\t\tlet existingToc = document.getElementById(\"toolbar-toc-list\");\n\n\t\t\tif (existingToc) {\n\t\t\t\texistingToc.remove();\n\t\t\t} else {\n\t\t\t\tlet tocList = document.createElement(\"ul\");\n\t\t\t\ttocList.setAttribute(\"id\", \"toolbar-toc-list\");\n\n\t\t\t\tlet tocTitle = document.createElement(\"h3\");\n\t\t\t\ttocTitle.textContent = \"Mục lục\";\n\n\t\t\t\ttocList.appendChild(tocTitle);\n\n\t\t\t\ttoc.forEach((chapter) => {\n\t\t\t\t\tlet tocItem = document.createElement(\"li\");\n\t\t\t\t\tlet tocLink = document.createElement(\"a\");\n\n\t\t\t\t\ttocLink.href = \"#\";\n\t\t\t\t\ttocLink.textContent = chapter.label;\n\n\t\t\t\t\ttocLink.onclick = (e) => {\n\t\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t\tdocument.querySelectorAll(\"#toolbar-toc-list li a\").forEach((link) => {\n\t\t\t\t\t\t\tlink.classList.remove(\"active\");\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\ttocLink.classList.add(\"active\");\n\n\t\t\t\t\t\t// show the chapter with the title chosed in toc list\n\t\t\t\t\t\treader.rendition.display(chapter.href);\n\t\t\t\t\t};\n\n\t\t\t\t\ttocItem.appendChild(tocLink);\n\t\t\t\t\ttocList.appendChild(tocItem);\n\t\t\t\t});\n\n\t\t\t\ttocBox.dom.appendChild(tocList);\n\t\t\t}\n\n\t\t\tlet tocList = document.getElementById(\"toolbar-toc-list\");\n\t\t\ttocList.classList.toggle(\"active\");\n\t\t}\n\n\n\n\t\t/* ------------------------ Button My Bookmark (bookmark cua toi) --------------------------*/\n\t\tlet bookmarksBox, bookmarksBtn;\n\t\tbookmarksBox = new UIDiv().setId(\"btn-d\").setClass(\"box\");\n\t\tbookmarksBtn = new UIInput(\"button\");\n\n\t\tbookmarksBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\tshowBookmarks();\n\t\t}\n\n\t\tbookmarksBox.add(bookmarksBtn);\n\t\tmenu1.add(bookmarksBox);\n\n\t\tfunction showBookmarks() {\n\t\t\tlet bookmarksList = document.getElementById(\"toolbar-bookmarks-list\");\n\n\t\t\tif (!bookmarksList) {\n\t\t\t\tbookmarksList = document.createElement(\"ul\");\n\t\t\t\tbookmarksList.setAttribute(\"id\", \"toolbar-bookmarks-list\");\n\t\t\t\tbookmarkBox.dom.appendChild(bookmarksList);\n\t\t\t}\n\n\t\t\tupdateBookmarksList();\n\t\t\tbookmarksList.classList.toggle(\"active\");\n\t\t}\n\n\t\treader.on(\"bookmarked\", (boolean, cfi) => {\n\t\t\tupdateBookmarksList();\n\t\t})\n\n\t\tfunction updateBookmarksList() {\n\t\t\tlet bookmarksList = document.getElementById(\"toolbar-bookmarks-list\");\n\n\t\t\tif (!bookmarksList) return;\n\n\t\t\tbookmarksList.innerHTML = \"\";\n\n\t\t\tlet title = document.createElement(\"h3\");\n\t\t\ttitle.textContent = \"Bookmarks của tui\";\n\t\t\tbookmarksList.appendChild(title);\n\n\t\t\treader.settings.bookmarks.forEach((cfi, index) => {\n\t\t\t\tlet bookmarkItem = document.createElement(\"li\");\n\t\t\t\tlet bookmarkLink = document.createElement(\"a\");\n\t\t\t\tlet deleteBtn = document.createElement(\"span\");\n\n\t\t\t\tbookmarkLink.href = \"#\";\n\t\t\t\tbookmarkLink.textContent = `Bookmark ${index + 1}`;\n\n\t\t\t\tbookmarkLink.onclick = (e) => {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tdocument.querySelectorAll(\"#toolbar-bookmarks-list li a\").forEach((link) => {\n\t\t\t\t\t\tlink.classList.remove(\"active\");\n\t\t\t\t\t});\n\n\t\t\t\t\tbookmarkLink.classList.add(\"active\");\n\n\t\t\t\t\treader.rendition.display(cfi);\n\t\t\t\t};\n\n\t\t\t\tdeleteBtn.innerHTML = '';\n\t\t\t\tdeleteBtn.onclick = (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treader.removeBookmarkFromToolbar(cfi);\n\t\t\t\t};\n\n\t\t\t\tbookmarkItem.appendChild(bookmarkLink);\n\t\t\t\tbookmarkItem.appendChild(deleteBtn);\n\t\t\t\tbookmarksList.appendChild(bookmarkItem);\n\t\t\t})\n\t\t}\n\n\t\t// Hàm xóa bookmark từ toolbar\n\t\treader.removeBookmarkFromToolbar = function (cfi) {\n\n\t\t\tlet bookmarksList = document.getElementById(\"toolbar-bookmarks-list\");\n\t\t\tif (!bookmarksList) return;\n\n\t\t\tlet bookmarkItems = bookmarksList.querySelectorAll(\"li\");\n\t\t\tlet targetItem = Array.from(bookmarkItems).find(item => {\n\t\t\t\treturn item.querySelector(\"a\").textContent.includes(cfi);\n\t\t\t});\n\n\t\t\tif (targetItem) {\n\t\t\t\ttargetItem.remove();\n\t\t\t}\n\n\t\t\tconst index = reader.settings.bookmarks.indexOf(cfi);\n\t\t\tif (index !== -1) {\n\t\t\t\treader.settings.bookmarks.splice(index, 1);\n\t\t\t}\n\n\t\t\treader.emit(\"bookmarked\", false, cfi);\n\t\t\treader.bookmarksPanel.removeBookmark(cfi);\n\t\t};\n\n\n\n\t\t/* ------------------------ Button Highlight And Note ---------------------------- */\n\t\tlet annotationsBox, annotationsBtn;\n\t\tannotationsBox = new UIDiv().setId(\"btn-a\").setClass(\"box\");\n\t\tannotationsBtn = new UIInput(\"button\");\n\n\t\t// show annotations list when click icon on toolbar\n\t\tannotationsBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\tshowAnnotations();\n\t\t}\n\n\t\tannotationsBox.add(annotationsBtn);\n\t\tmenu1.add(annotationsBox);\n\n\t\t// Function to show the annotations list\n\t\tfunction showAnnotations() {\n\t\t\tlet existingList = document.getElementById(\"toolbar-annotations-list\");\n\n\t\t\tif (!existingList) {\n\t\t\t\tlet annotationsList = document.createElement(\"ul\");\n\t\t\t\tannotationsList.setAttribute(\"id\", \"toolbar-annotations-list\");\n\n\t\t\t\tlet title = document.createElement(\"h3\");\n\t\t\t\ttitle.textContent = \"Highlights & Ghi chú\";\n\n\t\t\t\tannotationsList.appendChild(title);\n\n\t\t\t\treader.settings.annotations.forEach((note) => {\n\t\t\t\t\tlet noteItem = document.createElement(\"li\");\n\t\t\t\t\tlet noteLink = document.createElement(\"a\");\n\t\t\t\t\tlet deleteBtn = document.createElement(\"span\");\n\n\t\t\t\t\tnoteLink.href = \"#\";\n\t\t\t\t\tnoteLink.textContent = note.text;\n\n\t\t\t\t\tnoteLink.onclick = (e) => {\n\t\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t\tdocument.querySelectorAll(\"#toolbar-annotations-list li a\").forEach((link) => {\n\t\t\t\t\t\t\tlink.classList.remove(\"active\");\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tnoteLink.classList.add(\"active\");\n\n\t\t\t\t\t\treader.rendition.display(note.cfi);\n\t\t\t\t\t}\n\n\t\t\t\t\tdeleteBtn.innerHTML = '';\n\t\t\t\t\t// emit event to delete annotation items\n\t\t\t\t\tdeleteBtn.onclick = (e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treader.removeNoteFromToolbar(note);\n\t\t\t\t\t}\n\n\t\t\t\t\tnoteItem.appendChild(noteLink);\n\t\t\t\t\tnoteItem.appendChild(deleteBtn);\n\t\t\t\t\tannotationsList.appendChild(noteItem);\n\t\t\t\t})\n\n\t\t\t\tannotationsBox.dom.appendChild(annotationsList);\n\t\t\t}\n\n\t\t\tlet annotationsList = document.getElementById(\"toolbar-annotations-list\");\n\t\t\tannotationsList.classList.toggle(\"active\");\n\t\t}\n\n\t\treader.removeNoteFromToolbar = function (note) {\n\t\t\tlet annotationsList = document.getElementById(\"toolbar-annotations-list\");\n\t\t\tif (!annotationsList) return;\n\n\t\t\tlet noteItems = annotationsList.querySelectorAll(\"li\");\n\t\t\tlet targetItem = Array.from(noteItems).find(item => {\n\t\t\t\titem.querySelector('a').textContent === note.text;\n\t\t\t})\n\n\t\t\tif (targetItem) {\n\t\t\t\ttargetItem.remove();\n\t\t\t}\n\n\t\t\tconst annotationsPanel = reader.annotationsPanel;\n\t\t\tif (annotationsPanel) {\n\t\t\t\tannotationsPanel.removeNote(note);\n\t\t\t\tannotationsPanel.update();\n\t\t\t}\n\n\t\t\tconst index = reader.settings.annotations.findIndex((n) => n.cfi === note.cfi);\n\t\t\tif (index !== -1) {\n\t\t\t\treader.settings.annotations.splice(index, 1);\n\t\t\t}\n\n\t\t\treader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\t}\n\n\n\n\n\t\t/* ----------------------------- Current Page -------------------------------- */\n\t\tconst centerPageCount = new UIDiv().setClass(\"menu-center\");\n\n\t\tconst centerLabel = new UILabel().setClass(\"toolbar-center-label\");\n\t\tcenterLabel.setTextContent(\"Determined\");\n\n\t\tconst curOfTotal = new UIDiv().setClass(\"page-map\");\n\t\tconst curPageIndex = new UISpan().setClass(\"current-page-index\").setTextContent(\"1\");\n\t\tconst separator = new UIText().setTextContent(\" của \");\n\t\tconst totalPage = new UISpan().setClass(\"total-pages\").setTextContent(\"200\");\n\n\t\tcurOfTotal.add(curPageIndex);\n\t\tcurOfTotal.add(separator);\n\t\tcurOfTotal.add(totalPage);\n\n\t\tcenterPageCount.add(centerLabel);\n\t\tcenterPageCount.add(curOfTotal);\n\n\n\n\t\t/*------------------------ Toolbar Menu 2 --------------------------*/\n\t\tconst menu2 = new UIDiv().setClass(\"menu-2\");\n\t\t// Button change background\n\t\tlet backgroundBox, colorPicker;\n\t\tif (settings.background) {\n\t\t\t// Init elements: background box div, input color picker\n\t\t\tbackgroundBox = new UIDiv().setId(\"btn-bg\").setClass(\"box\");\n\t\t\tcolorPicker = new UIInput(\"color\").setClass(\"color-picker\");\n\t\t\tcolorPicker.dom.title = strings.get(keys[7]);\n\n\t\t\t// Handle event get color from color table of input color\n\t\t\tcolorPicker.dom.oninput = (e) => {\n\t\t\t\tconst selectedColor = e.target.value;\n\n\t\t\t\t// Emit 'colorchanged' event with selected color\n\t\t\t\treader.emit(\"colorchanged\", selectedColor);\n\t\t\t}\n\n\t\t\tbackgroundBox.add(colorPicker);\n\t\t\tmenu2.add(backgroundBox);\n\t\t}\n\n\n\t\t// Button \"A-\", \"A+\" and input (hidden) for font-size\n\t\tlet fontLabel = new UILabel().setClass(\"font-size-px\").setTextContent(\"Fontsize (px):\")\n\t\tlet fontSizeBox = new UIDiv().setId(\"btn-fontsize\").setClass(\"box\");\n\t\tlet decreaseFontBtn = new UIInput(\"button\").setClass(\"btn-font-decrease\");\n\t\tlet increaseFontBtn = new UIInput(\"button\").setClass(\"btn-font-increase\");\n\t\tlet fontSizeInput = new UIInput(\"text\").setClass(\"input-font-size\");\n\n\t\tlet fontSize = settings.fontSize || 16;\n\t\tfontSizeInput.dom.value = fontSize;\n\n\t\tdecreaseFontBtn.dom.textContent = \"-\";\n\t\tdecreaseFontBtn.dom.onclick = () => {\n\t\t\tfontSize = Math.max(8, fontSize - 1);\n\t\t\tfontSizeInput.dom.value = fontSize;\n\n\t\t\treader.emit(\"styleschanged\", { fontSize: fontSize });\n\t\t};\n\n\t\tincreaseFontBtn.dom.textContent = \"+\";\n\t\tincreaseFontBtn.dom.onclick = () => {\n\t\t\tfontSize = Math.min(72, fontSize + 1);\n\t\t\tfontSizeInput.dom.value = fontSize;\n\n\t\t\treader.emit(\"styleschanged\", { fontSize: fontSize });\n\t\t};\n\n\t\tfontSizeInput.dom.onchange = () => {\n\t\t\tlet newSize = parseInt(fontSizeInput.dom.value, 10);\n\t\t\tif (!isNaN(newSize) && newSize >= 8 && newSize <= 72) {\n\t\t\t\tfontSize = newSize;\n\n\t\t\t\treader.emit(\"styleschanged\", { fontSize: fontSize });\n\t\t\t} else {\n\t\t\t\tfontSizeInput.dom.value = fontSize;\n\t\t\t}\n\t\t};\n\n\t\tfontSizeBox.add(fontLabel);\n\t\tfontSizeBox.add(decreaseFontBtn);\n\t\tfontSizeBox.add(fontSizeInput);\n\t\tfontSizeBox.add(increaseFontBtn);\n\t\tmenu2.add(fontSizeBox);\n\n\n\t\t// Button open file\n\t\tlet openbookBtn;\n\t\tif (settings.openbook) {\n\t\t\tconst onload = (e) => {\n\n\t\t\t\treader.storage.clear();\n\t\t\t\treader.storage.set(e.target.result, () => {\n\t\t\t\t\treader.unload();\n\t\t\t\t\treader.init(e.target.result);\n\t\t\t\t\tconst url = new URL(window.location.origin);\n\t\t\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\t\t});\n\t\t\t};\n\t\t\tconst onerror = (e) => {\n\t\t\t\tconsole.error(e);\n\t\t\t};\n\t\t\tconst openbookBox = new UIDiv().setId(\"btn-o\").setClass(\"box\");\n\t\t\topenbookBtn = new UIInput(\"file\");\n\t\t\topenbookBtn.dom.title = strings.get(keys[3]);\n\t\t\topenbookBtn.dom.accept = \"application/epub+zip\";\n\t\t\topenbookBtn.dom.onchange = (e) => {\n\n\t\t\t\tif (e.target.files.length === 0)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (window.FileReader) {\n\n\t\t\t\t\tconst fr = new FileReader();\n\t\t\t\t\tfr.onload = onload;\n\t\t\t\t\tfr.readAsArrayBuffer(e.target.files[0]);\n\t\t\t\t\tfr.onerror = onerror;\n\t\t\t\t} else {\n\t\t\t\t\talert(strings.get(keys[4]));\n\t\t\t\t}\n\n\t\t\t};\n\t\t\topenbookBtn.dom.onclick = (e) => {\n\n\t\t\t\topenbookBtn.dom.blur();\n\t\t\t};\n\t\t\topenbookBox.add(openbookBtn);\n\t\t\tmenu2.add(openbookBox);\n\t\t}\n\n\n\t\t// Button search \n\t\tlet searchBox, searchBtn;\n\t\tlet searchInput, searchResults;\n\t\tsearchBox = new UIDiv().setId(\"btn-s\").setClass(\"box\");\n\t\tsearchBtn = new UIInput(\"button\");\n\t\tsearchBtn.setTitle(strings.get(keys[8]));\n\n\t\tsearchBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\tshowSearchPopup();\n\t\t}\n\n\t\tsearchBox.add(searchBtn);\n\t\tmenu2.add(searchBox);\n\n\t\tfunction showSearchPopup() {\n\t\t\tlet existingPopup = document.getElementById(\"toolbar-search-list\");\n\t\t\tif (!existingPopup) {\n\t\t\t\tlet searchPopup = document.createElement(\"div\");\n\t\t\t\tsearchPopup.setAttribute(\"id\", \"toolbar-search-list\");\n\t\t\t\tsearchPopup.classList.add(\"search-popup\");\n\n\t\t\t\tlet searchContainer = document.createElement(\"div\");\n\t\t\t\tsearchContainer.classList.add(\"search-container\");\n\n\t\t\t\tlet searchIcon = document.createElement(\"span\");\n\t\t\t\tsearchIcon.classList.add(\"search-icon\");\n\t\t\t\tsearchIcon.innerHTML = '';\n\n\t\t\t\tlet searchInput = document.createElement(\"input\");\n\t\t\t\tsearchInput.setAttribute(\"type\", \"search\");\n\t\t\t\tsearchInput.setAttribute(\"placeholder\", \"Search\");\n\t\t\t\tsearchInput.setAttribute(\"id\", \"nav-q\");\n\t\t\t\tsearchInput.setAttribute(\"class\", \"toolbar-search-input\");\n\n\t\t\t\tsearchContainer.appendChild(searchIcon);\n\t\t\t\tsearchContainer.appendChild(searchInput);\n\n\t\t\t\tlet resultContainer = document.createElement(\"ul\");\n\t\t\t\tresultContainer.setAttribute('id', 'toolbar-search-results');\n\n\t\t\t\tlet searchPanel = new SearchPanel(reader);\n\t\t\t\tsearchInput.oninput = async () => {\n\t\t\t\t\tlet query = searchInput.value.trim();\n\t\t\t\t\tif (query.length > 0) {\n\t\t\t\t\t\tlet results = await searchPanel.doSearch(query);\n\t\t\t\t\t\tresultContainer.innerHTML = \"\";\n\n\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\tlet noResultItem = document.createElement(\"li\");\n\t\t\t\t\t\t\tnoResultItem.innerText = \"Không tìm thấy kết quả trùng khớp\";\n\t\t\t\t\t\t\tnoResultItem.style.color = \"gray\";\n\t\t\t\t\t\t\tnoResultItem.style.padding = \"8px\";\n\t\t\t\t\t\t\tresultContainer.appendChild(noResultItem);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresults.forEach((data) => {\n\t\t\t\t\t\t\tlet item = document.createElement(\"li\");\n\t\t\t\t\t\t\tlet link = document.createElement(\"a\");\n\t\t\t\t\t\t\tlink.href = \"#\" + data.cfi;\n\t\t\t\t\t\t\tlink.textContent = data.excerpt;\n\t\t\t\t\t\t\tlink.onclick = (e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsearchPanel.reader.rendition.display(data.cfi);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem.appendChild(link);\n\t\t\t\t\t\t\tresultContainer.appendChild(item);\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresultContainer.innerHTML = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsearchPopup.appendChild(searchContainer);\n\t\t\t\tsearchPopup.appendChild(resultContainer);\n\t\t\t\tsearchBox.dom.appendChild(searchPopup);\n\t\t\t}\n\n\t\t\tlet searchPopup = document.getElementById(\"toolbar-search-list\");\n\t\t\tsearchPopup.classList.toggle(\"active\");\n\t\t}\n\n\n\t\t// Button Bookmark\n\t\tlet bookmarkBox, bookmarkBtn;\n\t\tif (settings.bookmarks) {\n\t\t\tbookmarkBox = new UIDiv().setId(\"btn-b\").setClass(\"box\");\n\t\t\tbookmarkBtn = new UIInput(\"button\");\n\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\tbookmarkBtn.dom.onclick = (e) => {\n\n\t\t\t\tconst cfi = this.locationCfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\treader.emit(\"bookmarked\", val);\n\t\t\t\te.preventDefault();\n\t\t\t\tbookmarkBtn.dom.blur();\n\t\t\t};\n\t\t\tbookmarkBox.add(bookmarkBtn);\n\t\t\tmenu2.add(bookmarkBox);\n\t\t}\n\n\t\t// Button Full Screen\n\t\tlet fullscreenBtn;\n\t\tif (settings.fullscreen) {\n\n\t\t\tconst fullscreenBox = new UIDiv().setId(\"btn-f\").setClass(\"box\");\n\t\t\tfullscreenBtn = new UIInput(\"button\");\n\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\tfullscreenBtn.dom.onclick = (e) => {\n\n\t\t\t\tthis.toggleFullScreen();\n\t\t\t\te.preventDefault();\n\t\t\t};\n\n\t\t\tdocument.onkeydown = (e) => {\n\n\t\t\t\tif (e.key === \"F11\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.toggleFullScreen();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.onfullscreenchange = (e) => {\n\n\t\t\t\tconst w = window.screen.width === e.target.clientWidth;\n\t\t\t\tconst h = window.screen.height === e.target.clientHeight;\n\n\t\t\t\tif (w && h) {\n\t\t\t\t\tfullscreenBox.addClass(\"resize-small\");\n\t\t\t\t} else {\n\t\t\t\t\tfullscreenBox.removeClass(\"resize-small\");\n\t\t\t\t}\n\t\t\t};\n\t\t\tfullscreenBox.add(fullscreenBtn);\n\t\t\tmenu2.add(fullscreenBox);\n\t\t}\n\n\t\tcontainer.add([menu1, centerPageCount, menu2]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t// Button Close\n\t\tlet closeBox, closeBtn;\n\t\tcloseBox = new UIDiv().setId(\"btn-close\").setClass(\"box\");\n\t\tcloseBtn = new UIInput(\"button\").setClass(\"active\");\n\t\tcloseBtn.setTitle(strings.get(keys[9]));\n\n\n\n\t\tcloseBox.add(closeBtn);\n\t\tmenu2.add(closeBox);\n\n\n\t\t//-- events --//\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tconst cfi = location.start.cfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\tif (val) {\n\t\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t\t} else {\n\t\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t\t}\n\t\t\t\tthis.locationCfi = cfi; // save location cfi\n\t\t\t}\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBox.dom.style.display = location.atStart ? \"none\" : \"block\";\n\t\t\t\tnextBox.dom.style.display = location.atEnd ? \"none\" : \"block\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean) => {\n\n\t\t\tif (boolean) {\n\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t} else {\n\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\t\tnextBtn.setTitle(strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (settings.openbook) {\n\t\t\t\topenbookBtn.setTitle(strings.get(keys[3]));\n\t\t\t}\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\t}\n\t\t\tif (settings.fullscreen) {\n\t\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\t}\n\t\t\tif (settings.background) {\n\t\t\t\tbackgroundBtn.setTitle(strings.get(keys[7]));\n\t\t\t}\n\n\t\t});\n\t}\n\n\ttoggleFullScreen() {\n\n\t\tdocument.activeElement.blur();\n\n\t\tif (document.fullscreenElement === null) {\n\t\t\tdocument.documentElement.requestFullscreen();\n\t\t} else if (document.exitFullscreen) {\n\t\t\tdocument.exitFullscreen();\n\t\t}\n\t}\n}","import { UIDiv, UISpan } from \"./ui.js\";\n\nexport class Content {\n\n\tconstructor(reader) {\n\n\t\tconst settings = reader.settings;\n\t\tconst container = new UIDiv().setId(\"content\");\n\n\t\tlet prev;\n\t\tif (settings.arrows === \"content\") {\n\n\t\t\tprev = new UIDiv().setId(\"prev\").setClass(\"arrow\");\n\t\t\tprev.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tconst iconLeft = new UISpan();\n\t\t\ticonLeft.dom.innerHTML = '';\n\t\t\tprev.add(iconLeft);\n\t\t\tcontainer.add(prev);\n\t\t}\n\n\t\tconst viewer = new UIDiv().setId(\"viewer\");\n\t\tcontainer.add(viewer);\n\n\t\t// Handle the 'colorchanged' event to change background of 'viewer'\n\t\treader.on(\"colorchanged\", (color) => {\n\t\t\tviewer.dom.style.backgroundColor = color;\n\t\t});\n\n\t\tlet next;\n\t\tif (settings.arrows === \"content\") {\n\t\t\tnext = new UIDiv().setId(\"next\").setClass(\"arrow\");\n\t\t\tnext.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tconst iconRight = new UISpan();\n\t\t\ticonRight.dom.innerHTML = '';\n\t\t\tnext.add(iconRight);\n\t\t\tcontainer.add(next);\n\t\t}\n\n\t\tconst loader = new UIDiv().setId(\"loader\");\n\t\tconst divider = new UIDiv().setId(\"divider\");\n\t\tconst overlay = new UIDiv().setId(\"overlay\");\n\t\toverlay.dom.onclick = (e) => {\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tcontainer.add([loader, divider, overlay]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tviewer.setClass(cfg.flow);\n\t\t\tloader.dom.style.display = \"block\";\n\t\t});\n\n\t\treader.on(\"bookloaded\", () => {\n\n\t\t\tloader.dom.style.display = \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.spread && props.width > props.spreadWidth) {\n\t\t\t\tdivider.dom.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tdivider.dom.style.display = \"none\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"flowchanged\", (value) => {\n\n\t\t\tviewer.setClass(value);\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tif (location.atStart) {\n\t\t\t\t\tprev.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tprev.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t\tif (location.atEnd) {\n\t\t\t\t\tnext.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tnext.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"prev\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tprev.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { prev.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"next\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tnext.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { next.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\toverlay.dom.style.display = value ? \"block\" : \"none\";\n\t\t});\n\n\t\treader.on(\"viewercleanup\", () => {\n\n\t\t\tviewer.clear();\n\t\t});\n\t}\n}","import { UIPanel, UIDiv, UIItem, UIList, UILink, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class TocPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/contents\"\n\t\t];\n\t\tconst label = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined; // save reference to selected tree item\n\t\tthis.setId(\"contents\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", () => {\n\t\t\treader.book.loaded.navigation.then((toc) => {\n\t\t\t\tcontainer.clear();\n\t\t\t\tcontainer.add(this.generateToc(toc));\n\t\t\t\tthis.add(container);\n\t\t\t\tconsole.log(toc);\n\t\t\t\t\n\t\t\t})\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tlabel.setValue(strings.get(keys[0]));\n\t\t});\n\t}\n\n\tgenerateToc(toc, parent) {\n\n\t\tconst list = new UIList(parent);\n\n\t\ttoc.forEach((chapter) => {\n\n\t\t\tconst link = new UILink(chapter.href, chapter.label);\n\t\t\tconst item = new UIItem(list).setId(chapter.id);\n\t\t\tconst ibtn = new UISpan();\n\n\t\t\tlink.dom.onclick = (e) => {\n\n\t\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\t\tthis.selector.unselect();\n\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t\tthis.reader.settings.sectionId = chapter.id;\n\t\t\t\tthis.reader.rendition.display(chapter.href);\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\titem.add([ibtn, link]);\n\t\t\tthis.reader.navItems[chapter.href] = {\n\t\t\t\tid: chapter.id,\n\t\t\t\tlabel: chapter.label\n\t\t\t};\n\n\t\t\tif (this.reader.settings.sectionId === chapter.id) {\n\t\t\t\tlist.expand();\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t}\n\n\t\t\tif (chapter.subitems && chapter.subitems.length > 0) {\n\n\t\t\t\tconst subItems = this.generateToc(chapter.subitems, item);\n\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\tibtn.dom.onclick = () => {\n\n\t\t\t\t\tif (subItems.expanded) {\n\t\t\t\t\t\tsubItems.collaps();\n\t\t\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubItems.expand();\n\t\t\t\t\t\tibtn.setClass(\"toggle-expanded\");\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t\titem.add(subItems);\n\t\t\t}\n\n\t\t\tlist.add(item);\n\t\t});\n\n\t\treturn list;\n\t}\n}","import { UIPanel, UIDiv, UIRow, UIInput, UILink, UIList, UIItem, UIText, UIBox, UISpan } from \"../ui.js\";\n\nexport class BookmarksPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/bookmarks/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearBookmarks();\n\t\t\treader.emit(\"bookmarked\", false);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.bookmarks = new UIList();\n\t\tcontainer.add(this.bookmarks);\n\t\tthis.setId(\"bookmarks\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\n\t\tconst update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.bookmarks.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"displayed\", (renderer, cfg) => {\n\n\t\t\tcfg.bookmarks.forEach((cfi) => {\n\n\t\t\t\tthis.setBookmark(cfi);\n\t\t\t});\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tthis.locationCfi = location.start.cfi; // save location cfi\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean, cfi) => {\n\t\t\tif (boolean) {\n\t\t\t\tthis.appendBookmark();\n\t\t\t} else {\n\t\t\t\tthis.removeBookmark(cfi);\n\t\t\t}\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tappendBookmark() {\n\n\t\tconst cfi = this.locationCfi;\n\n\t\tif (this.reader.isBookmarked(cfi) > -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setBookmark(cfi);\n\t\tthis.reader.settings.bookmarks.push(cfi);\n\n\t}\n\n\tremoveBookmark(cfi) {\n\t\tconst _cfi = cfi || this.locationCfi;\n\t\tconst index = this.reader.isBookmarked(_cfi);\n\t\tif (index === -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.bookmarks.remove(index);\n\t\tthis.reader.settings.bookmarks.splice(index, 1);\n\t}\n\n\tclearBookmarks() {\n\n\t\tthis.bookmarks.clear();\n\t\tthis.reader.settings.bookmarks = [];\n\t}\n\n\tsetBookmark(cfi) {\n\t\tconst link = new UILink();\n\t\tconst item = new UIItem();\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst navItem = this.reader.navItemFromCfi(cfi);\n\t\tlet idref;\n\t\tlet label;\n\n\t\tif (navItem === undefined) {\n\t\t\tconst spineItem = this.reader.book.spine.get(cfi);\n\t\t\tidref = spineItem.idref;\n\t\t\tlabel = spineItem.idref\n\t\t} else {\n\t\t\tidref = navItem.id;\n\t\t\tlabel = navItem.label;\n\t\t}\n\n\t\tlink.setHref(\"#\" + cfi);\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(cfi);\n\t\t\te.preventDefault();\n\t\t};\n\t\tlink.setTextContent(label);\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.reader.emit(\"bookmarked\", false, cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\titem.setId(idref);\n\t\tthis.bookmarks.add(item);\n\t}\n}","import { UIPanel, UIDiv, UITextArea, UIInput, UILink, UIList, UIItem, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class AnnotationsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/annotations/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearNotes();\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.notes = new UIList();\n\t\tcontainer.add(this.notes);\n\t\tthis.setId(\"annotations\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\t\tthis.update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.annotations.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"navigation\", (cfg) => {\n\n\t\t\tcfg.annotations.forEach((note) => {\n\n\t\t\t\tthis.set(note);\n\t\t\t});\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"noteadded\", (note) => {\n\t\t\tthis.set(note);\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tset(note) {\n\n\t\tconst link = new UILink(\"#\" + note.cfi, note.text);\n\t\tconst item = new UIItem().setId(\"note-\" + note.uuid);\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst call = () => { };\n\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(note.cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.removeNote(note);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\tthis.notes.add(item);\n\t\tthis.reader.rendition.annotations.add(\n\t\t\t\"highlight\", note.cfi, {}, call, \"note-highlight\", {});\n\t\tthis.update();\n\n\t\tconst toolbarList = document.getElementById(\"toolbar-annotations-list\");\n\t\tif (toolbarList) {\n\t\t\tconst toolbarNoteItem = document.createElement(\"li\");\n\t\t\tconst toolbarNoteLink = document.createElement(\"a\");\n\t\t\ttoolbarNoteLink.href = \"#\";\n\t\t\ttoolbarNoteLink.textContent = note.text; // sửa lại nếu cần\n\t\t\ttoolbarNoteLink.onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.reader.rendition.display(note.cfi);\n\t\t\t};\n\t\t\ttoolbarNoteItem.appendChild(toolbarNoteLink);\n\n\t\t\tconst deleteBtn = document.createElement(\"span\");\n\t\t\tdeleteBtn.innerHTML = '';\n\n\t\t\tdeleteBtn.onclick = (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.reader.removeNoteFromToolbar(note);\n\t\t\t}\n\t\t\ttoolbarNoteItem.appendChild(deleteBtn);\n\t\t\ttoolbarList.appendChild(toolbarNoteItem);\n\t\t}\n\t}\n\n\tremoveNote(note) {\n\n\t\tconst index = this.reader.settings.annotations.indexOf(note);\n\t\tif (index === -1)\n\t\t\treturn;\n\n\t\tthis.notes.remove(index);\n\t\tthis.reader.settings.annotations.splice(index, 1);\n\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\tthis.update();\n\n\t\tconst toolbarList = document.getElementById(\"toolbar-annotations-list\");\n\t\tif (toolbarList) {\n\t\t\tconst toolbarItems = toolbarList.querySelectorAll(\"li\");\n\t\t\ttoolbarItems.forEach(item => {\n\t\t\t\tif (item.querySelector(\"a\").textContent === note.text) {\n\t\t\t\t\titem.remove();\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tclearNotes() {\n\n\t\tthis.reader.settings.annotations.forEach(note => {\n\t\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\t});\n\t\tthis.notes.clear();\n\t\tthis.reader.settings.annotations = [];\n\t\tthis.update();\n\t}\n}","import { UIPanel, UIRow, UISelect, UIInput, UILabel, UINumber, UIText, UIBox, UIDiv } from \"../ui.js\";\n\nexport class SettingsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tsuper.setId(\"settings\");\n\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/settings/language\",\n\t\t\t\"sidebar/settings/fontsize\",\n\t\t\t\"sidebar/settings/flow\",\n\t\t\t\"sidebar/settings/spread\",\n\t\t\t\"sidebar/settings/spread/minwidth\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.add(new UIBox(headerLabel).addClass(\"header\"));\n\n\t\tconst languageLabel = new UILabel(strings.get(keys[1]), \"language-ui\");\n\t\tconst languageRow = new UIRow();\n\t\tconst language = new UISelect().setOptions({\n\t\t\ten: \"English\",\n\t\t\tfr: \"French\",\n\t\t\tja: \"Japanese\",\n\t\t\tru: \"Russian\",\n\t\t\tvi: \"Vietnamese\"\n\t\t});\n\t\tlanguage.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"languagechanged\", e.target.value);\n\t\t};\n\t\tlanguage.setId(\"language-ui\");\n\t\tlanguageRow.add(languageLabel);\n\t\tlanguageRow.add(language);\n\n\t\tconst fontSizeLabel = new UILabel(strings.get(keys[2]), \"fontsize\");\n\t\tconst fontSizeRow = new UIRow();\n\t\tconst fontSize = new UINumber(16, 1);\n\n\t\tfontSize.dom.onchange = (e) => {\n\t\t\tconst newSize = parseInt(e.target.value);\n\n\t\t\tif (newSize >= 8 && newSize <= 72) {\n\t\t\t\treader.emit(\"styleschanged\", {\n\t\t\t\t\tfontSize: newSize\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tfontSize.setId(\"fontsize\");\n\t\tfontSizeRow.add(fontSizeLabel);\n\t\tfontSizeRow.add(fontSize);\n\t\tfontSize.dom.disabled = true;\n\n\t\t//-- flow configure --//\n\n\t\tconst flowLabel = new UILabel(strings.get(keys[3]), \"flow\");\n\t\tconst flowRow = new UIRow();\n\t\tconst flow = new UISelect().setOptions({\n\t\t\tpaginated: \"Paginated\",\n\t\t\tscrolled: \"Scrolled\"\n\t\t});\n\t\tflow.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"flowchanged\", e.target.value);\n\n\t\t\tif (e.target.value === \"scrolled\") {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: \"none\",\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: undefined,\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tflow.setId(\"flow\");\n\t\tflowRow.add(flowLabel);\n\t\tflowRow.add(flow);\n\n\t\t//-- spdead configure --//\n\n\t\tconst minSpreadWidth = new UINumber(800, 1);\n\t\tconst spreadLabel = new UILabel(strings.get(keys[4]), \"spread\");\n\t\tconst spreadRow = new UIRow();\n\t\tconst spread = new UISelect().setOptions({\n\t\t\tnone: \"None\",\n\t\t\tauto: \"Auto\"\n\t\t});\n\t\tspread.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: e.target.value,\n\t\t\t\tmin: undefined\n\t\t\t});\n\t\t\tminSpreadWidth.dom.disabled = e.target.value === \"none\";\n\t\t};\n\t\tspread.setId(\"spread\");\n\n\t\tspreadRow.add(spreadLabel);\n\t\tspreadRow.add(spread);\n\n\t\tconst minSpreadWidthLabel = new UILabel(strings.get(keys[5]), \"min-spread-width\");\n\t\tconst minSpreadWidthRow = new UIRow();\n\t\tminSpreadWidth.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: undefined,\n\t\t\t\tmin: parseInt(e.target.value)\n\t\t\t});\n\t\t};\n\t\tminSpreadWidth.setId(\"min-spread-width\");\n\t\tminSpreadWidthRow.add(minSpreadWidthLabel);\n\t\tminSpreadWidthRow.add(minSpreadWidth);\n\n\t\t//-- pagination --//\n\n\t\tconst paginationStr = strings.get(\"sidebar/settings/pagination\");\n\t\tconst paginationRow = new UIRow();\n\t\tconst pagination = new UIInput(\"checkbox\", false, paginationStr[1]);\n\t\tpagination.setId(\"pagination\");\n\t\tpagination.dom.onclick = (e) => {\n\n\t\t\t// not implemented\n\t\t};\n\n\t\tpaginationRow.add(new UILabel(paginationStr[0], \"pagination\"));\n\t\tpaginationRow.add(pagination);\n\n\t\tthis.add(new UIBox([\n\t\t\tlanguageRow,\n\t\t\tfontSizeRow,\n\t\t\tflowRow,\n\t\t\tspreadRow,\n\t\t\tminSpreadWidthRow,\n\t\t\t//paginationRow\n\t\t]));\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tlanguage.setValue(cfg.language);\n\t\t\tfontSize.setValue(cfg.styles.fontSize);\n\t\t\tflow.setValue(cfg.flow);\n\t\t\tspread.setValue(cfg.spread.mod);\n\t\t\tminSpreadWidth.setValue(cfg.spread.min);\n\t\t\tminSpreadWidth.dom.disabled = cfg.spread.mod === \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.flow === \"scrolled\") {\n\t\t\t\tspread.setValue(\"none\");\n\t\t\t\tspread.dom.disabled = true;\n\t\t\t\tminSpreadWidth.dom.disabled = true;\n\t\t\t} else {\n\t\t\t\tspread.dom.disabled = false;\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setTextContent(strings.get(keys[0]));\n\t\t\tlanguageLabel.setTextContent(strings.get(keys[1]));\n\t\t\tfontSizeLabel.setTextContent(strings.get(keys[2]));\n\t\t\tflowLabel.setTextContent(strings.get(keys[3]));\n\t\t\tspreadLabel.setTextContent(strings.get(keys[4]));\n\t\t\tminSpreadWidthLabel.setTextContent(strings.get(keys[5]));\n\t\t});\n\t}\n}","import { UIBox, UIDiv, UIItem, UIList, UIPanel, UIText } from \"../ui.js\";\n\nexport class MetadataPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst labels = {};\n\t\tconst key = \"sidebar/metadata\";\n\t\tconst label = new UIText(strings.get(key)).setClass(\"label\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\t\tlabels[key] = label;\n\n\t\tthis.items = new UIList();\n\t\tthis.setId(\"metadata\");\n\t\tthis.add(container);\n\n\t\tconst init = (prop, meta) => {\n\t\t\tif (meta[prop] === undefined ||\n\t\t\t\tmeta[prop] === null || (typeof meta[prop] === \"string\" && meta[prop].length === 0)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst item = new UIItem();\n\t\t\tconst label = new UIText().setClass(\"label\");\n\t\t\tconst value = new UIText().setClass(\"value\");\n\t\t\tlabel.setValue(strings.get(key + \"/\" + prop).toUpperCase());\n\t\t\tif (prop === \"description\") {\n\t\t\t\tvalue.dom.innerHTML = meta[prop];\n\t\t\t} else {\n\t\t\t\tvalue.setValue(meta[prop]);\n\t\t\t}\n\t\t\tlabels[key + \"/\" + prop] = label;\n\t\t\titem.add([label, value]);\n\t\t\tthis.items.add(item);\n\t\t}\n\n\t\t//-- events --//\n\n\t\treader.on(\"metadata\", (meta) => {\n\n\t\t\tthis.items.clear();\n\t\t\tcontainer.clear();\n\t\t\tcontainer.add(this.items);\n\t\t\tdocument.title = meta.title;\n\t\t\tfor (const prop in meta) {\n\t\t\t\tinit(prop, meta);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tfor (const prop in labels) {\n\t\t\t\tlet text;\n\t\t\t\tif (prop === key) {\n\t\t\t\t\ttext = strings.get(prop);\n\t\t\t\t} else {\n\t\t\t\t\ttext = strings.get(prop).toUpperCase();\n\t\t\t\t}\n\t\t\t\tlabels[prop].setValue(text);\n\t\t\t}\n\t\t});\n\t}\n}","import { UITabbedPanel, UIInput, UIDiv } from \"./ui.js\";\nimport { TocPanel } from \"./sidebar/toc.js\";\nimport { BookmarksPanel } from \"./sidebar/bookmarks.js\";\nimport { AnnotationsPanel } from \"./sidebar/annotations.js\";\nimport { SearchPanel } from \"./sidebar/search.js\";\nimport { SettingsPanel } from \"./sidebar/settings.js\";\nimport { MetadataPanel } from \"./sidebar/metadata.js\";\n\nexport class Sidebar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst controls = reader.settings;\n\t\tconst keys = [\n\t\t\t\"sidebar/close\",\n\t\t\t\"sidebar/contents\",\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/search\",\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/metadata\"\n\t\t];\n\n\t\tconst container = new UITabbedPanel(\"vertical\").setId(\"sidebar\");\n\n\t\tconst openerBox = new UIDiv().setId(\"btn-p\").addClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t\topenerBtn.dom.blur();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tcontainer.addMenu(openerBox);\n\n\t\tcontainer.addTab(\"btn-t\", strings.get(keys[1]), new TocPanel(reader));\n\t\tif (controls.bookmarks) {\n\t\t\tconst bookmarkPanel = new BookmarksPanel(reader);\n\t\t\tcontainer.addTab(\"btn-d\", strings.get(keys[2]), bookmarkPanel);\n\t\t\treader.bookmarksPanel = bookmarkPanel;\n\t\t}\n\t\tif (controls.annotations) {\n\t\t\tconst annotationPanel = new AnnotationsPanel(reader);\n\t\t\tcontainer.addTab(\"btn-a\", strings.get(keys[3]), annotationPanel);\n\t\t\treader.annotationsPanel = annotationPanel;\n\t\t}\n\n\t\tcontainer.addTab(\"btn-s\", strings.get(keys[4]), new SearchPanel(reader));\n\t\tcontainer.addTab(\"btn-c\", strings.get(keys[5]), new SettingsPanel(reader));\n\t\tcontainer.addTab(\"btn-i\", strings.get(keys[6]), new MetadataPanel(reader));\n\t\tcontainer.select(\"btn-t\");\n\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\tif (value) {\n\t\t\t\tcontainer.setClass(\"open\");\n\t\t\t} else {\n\t\t\t\tcontainer.removeAttribute(\"class\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\t\tcontainer.setLabel(\"btn-t\", strings.get(keys[1]));\n\t\t\tif (controls.bookmarks) {\n\t\t\t\tcontainer.setLabel(\"btn-d\", strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (controls.annotations) {\n\t\t\t\tcontainer.setLabel(\"btn-a\", strings.get(keys[3]));\n\t\t\t}\n\t\t\tcontainer.setLabel(\"btn-s\", strings.get(keys[4]));\n\t\t\tcontainer.setLabel(\"btn-c\", strings.get(keys[5]));\n\t\t\tcontainer.setLabel(\"btn-i\", strings.get(keys[6]));\n\t\t});\n\t}\n}","import { uuid } from \"./utils.js\";\nimport { UIBox, UIDiv, UIInput, UILabel } from \"./ui.js\";\n\nexport class NoteDlg {\n\n constructor(reader) {\n\n const container = new UIDiv().setId(\"notedlg\");\n const strings = reader.strings;\n const keys = [\n \"notedlg/label\",\n \"notedlg/add\"\n ];\n const label = new UILabel(strings.get(keys[0]), \"note-input\");\n const textBox = new UIInput(\"text\", \"\").setId(\"note-input\");\n textBox.dom.oninput = (e) => {\n\n this.update();\n e.preventDefault();\n };\n\n const addBtn = new UIInput(\"button\", strings.get(keys[1]));\n addBtn.dom.disabled = true;\n addBtn.dom.onclick = (e) => {\n\n const note = {\n cfi: this.cfi,\n date: new Date(),\n text: textBox.getValue(),\n uuid: uuid()\n };\n this.range = undefined;\n reader.settings.annotations.push(note);\n reader.emit(\"noteadded\", note);\n container.removeAttribute(\"class\");\n e.preventDefault();\n addBtn.dom.blur();\n };\n\n this.update = () => {\n\n addBtn.dom.disabled = !(this.range && textBox.getValue().length > 0);\n };\n\n container.add(new UIBox([label, textBox, addBtn]).addClass(\"control\"));\n document.body.appendChild(container.dom);\n\n //-- events --//\n\n reader.on(\"selected\", (cfi, contents) => {\n\n this.cfi = cfi;\n this.range = contents.range(cfi);\n this.update();\n container.setClass(\"open\");\n textBox.setValue(\"\");\n });\n\n reader.on(\"unselected\", () => {\n\n this.range = undefined;\n this.update();\n container.removeAttribute(\"class\");\n });\n\n reader.on(\"languagechanged\", (value) => {\n\n label.setTextContent(strings.get(keys[0]));\n addBtn.setValue(strings.get(keys[1]));\n });\n }\n}","import { UIDiv, UILabel, UIInput } from \"./ui.js\";\r\n\r\nexport class Status {\r\n constructor(reader) {\r\n const strings = reader.strings;\r\n const settings = reader.settings;\r\n\r\n const container = new UIDiv().setId(\"status-bar\");\r\n const keys = [\r\n \"status/fullscreen\",\r\n \"status/apprec\",\r\n ];\r\n\r\n /* ---------------------------- Status Bar ----------------------------- */\r\n const leftText = new UIDiv().setClass(\"status-title\");\r\n const rightAction = new UIDiv().setClass(\"status-action\");\r\n\r\n let text = new UILabel().setClass(\"status-text\").setTextContent(\"Trang cuối của chương\");\r\n leftText.add(text);\r\n\r\n\r\n // Button apps rectangle\r\n let appRecBtn;\r\n const appRecBox = new UIDiv().setId(\"btn-ar\").setClass(\"box\");\r\n appRecBtn = new UIInput(\"button\");\r\n appRecBtn.setTitle(strings.get(keys[1]));\r\n\r\n appRecBtn.dom.onclick = (e) => {\r\n e.preventDefault();\r\n toggleBookList();\r\n };\r\n\r\n appRecBox.add(appRecBtn);\r\n rightAction.add(appRecBox);\r\n\r\n function toggleBookList() {\r\n const bookList = [\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 1 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 2 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 3 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 4 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 5 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 6 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 7 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 8 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 9 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 10 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 11 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 12 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 13 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 14 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 15 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 16 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 17 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 18 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 19 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 20 },\r\n ];\r\n\r\n let existingModal = document.getElementById('book-list-modal');\r\n if (!existingModal) {\r\n let modal = document.createElement('div');\r\n modal.setAttribute('id', 'book-list-modal');\r\n modal.setAttribute('class', 'book-modal');\r\n\r\n let modalContent = document.createElement('div');\r\n modalContent.setAttribute('class', 'book-modal-content');\r\n\r\n let bookGrid = document.createElement('div');\r\n bookGrid.setAttribute('class', 'book-grid');\r\n bookList.forEach((book) => {\r\n let bookItem = document.createElement('div');\r\n bookItem.setAttribute('class', 'book-item');\r\n bookItem.innerHTML = `\r\n
\r\n

${book.title}

\r\n

${book.author}

\r\n
\r\n
${book.page}
\r\n `;\r\n bookGrid.appendChild(bookItem);\r\n });\r\n\r\n modalContent.appendChild(bookGrid);\r\n modal.appendChild(modalContent);\r\n\r\n container.dom.appendChild(modal);\r\n }\r\n\r\n let modal = document.getElementById('book-list-modal');\r\n modal.classList.toggle(\"active\");\r\n }\r\n\r\n\r\n // Button Full Screen\r\n let fullscreenBtn;\r\n if (settings.fullscreen) {\r\n\r\n const fullscreenBox = new UIDiv().setId(\"btn-f\").setClass(\"box\");\r\n fullscreenBtn = new UIInput(\"button\");\r\n fullscreenBtn.setTitle(strings.get(keys[0]));\r\n fullscreenBtn.dom.onclick = (e) => {\r\n\r\n this.toggleFullScreen();\r\n e.preventDefault();\r\n };\r\n\r\n document.onkeydown = (e) => {\r\n\r\n if (e.key === \"F11\") {\r\n e.preventDefault();\r\n this.toggleFullScreen();\r\n }\r\n };\r\n\r\n document.onfullscreenchange = (e) => {\r\n\r\n // const w = window.screen.width === e.target.clientWidth;\r\n // const h = window.screen.height === e.target.clientHeight;\r\n\r\n if (document.fullscreenElement) {\r\n fullscreenBox.addClass(\"resize-small\");\r\n } else {\r\n fullscreenBox.removeClass(\"resize-small\");\r\n }\r\n };\r\n\r\n\r\n fullscreenBox.add(fullscreenBtn);\r\n rightAction.add(fullscreenBox);\r\n }\r\n\r\n reader.on(\"languagechanged\", (value) => {\r\n if (settings.fullscreen) {\r\n fullscreenBtn.setTitle(strings.get(keys[0]));\r\n }\r\n });\r\n\r\n\r\n container.add([leftText, rightAction]);\r\n document.body.appendChild(container.dom);\r\n }\r\n\r\n toggleFullScreen() {\r\n\r\n document.activeElement.blur();\r\n\r\n if (document.fullscreenElement === null) {\r\n document.documentElement.requestFullscreen();\r\n } else if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n }\r\n }\r\n}\r\n","import EventEmitter from \"event-emitter\";\n\nimport { extend, detectMobile } from \"./utils.js\";\nimport { Storage } from \"./storage.js\";\nimport { Strings } from \"./strings.js\";\nimport { Toolbar } from \"./toolbar.js\";\nimport { Content } from \"./content.js\";\nimport { Sidebar } from \"./sidebar.js\";\nimport { NoteDlg } from \"./notedlg.js\";\nimport { Status } from \"./status.js\";\n\nexport class Reader {\n\n\tconstructor(bookPath, settings) {\n\n\t\tconst preinit = (data) => {\n\t\t\tconst url = new URL(window.location);\n\t\t\tlet path = bookPath;\n\t\t\tif (settings && !settings.openbook) {\n\t\t\t\tpath = bookPath;\n\t\t\t\tif (data) this.storage.clear();\n\t\t\t} else if (data && url.search.length === 0) {\n\t\t\t\tpath = data;\n\t\t\t}\n\t\t\tthis.cfgInit(path, settings);\n\t\t\tthis.strings = new Strings(this);\n\t\t\tthis.toolbar = new Toolbar(this);\n\t\t\tthis.content = new Content(this);\n\t\t\tthis.status = new Status(this);\n\t\t\tthis.sidebar = new Sidebar(this);\n\t\t\tif (this.settings.annotations) {\n\t\t\t\tthis.notedlg = new NoteDlg(this);\n\t\t\t}\n\t\t\tthis.init();\n\t\t}\n\n\t\tthis.settings = undefined;\n\t\tthis.isMobile = detectMobile();\n\t\tthis.storage = new Storage();\n\t\tconst openbook = settings && settings.openbook;\n\n\t\tif (this.storage.indexedDB && (!settings || openbook)) {\n\t\t\tthis.storage.init(() => this.storage.get((data) => preinit(data)));\n\t\t} else {\n\t\t\tpreinit();\n\t\t}\n\n\t\twindow.onbeforeunload = this.unload.bind(this);\n\t\twindow.onhashchange = this.hashChanged.bind(this);\n\t\twindow.onkeydown = this.keyboardHandler.bind(this);\n\t\twindow.onwheel = (e) => {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Initialize book.\n\t * @param {*} bookPath\n\t * @param {*} settings\n\t */\n\tinit(bookPath, settings) {\n\n\t\tthis.emit(\"viewercleanup\");\n\t\tthis.navItems = {};\n\n\t\tif (arguments.length > 0) {\n\n\t\t\tthis.cfgInit(bookPath, settings);\n\t\t}\n\n\t\tthis.book = ePub(this.settings.bookPath);\n\t\tthis.rendition = this.book.renderTo(\"viewer\", {\n\t\t\tmanager: this.settings.manager,\n\t\t\tflow: this.settings.flow,\n\t\t\tspread: this.settings.spread.mod,\n\t\t\tminSpreadWidth: this.settings.spread.min,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tsnap: true\n\t\t});\n\n\t\tconst cfi = this.settings.previousLocationCfi;\n\t\tif (cfi) {\n\t\t\tthis.displayed = this.rendition.display(cfi);\n\t\t} else {\n\t\t\tthis.displayed = this.rendition.display();\n\t\t}\n\n\t\tthis.displayed.then((renderer) => {\n\t\t\tthis.emit(\"displayed\", renderer, this.settings);\n\t\t});\n\n\t\tthis.book.ready.then(() => {\n\t\t\tthis.emit(\"bookready\", this.settings);\n\t\t}).then(() => {\n\t\t\tthis.emit(\"bookloaded\");\n\t\t});\n\n\t\tthis.book.loaded.metadata.then((meta) => {\n\t\t\tthis.emit(\"metadata\", meta);\n\t\t});\n\n\t\tthis.book.loaded.navigation.then((toc) => {\n\t\t\tthis.emit(\"bookready\", toc);\n\t\t});\n\n\t\tthis.rendition.on(\"click\", (e) => {\n\t\t\tconst selection = e.view.document.getSelection();\n\t\t\tif (selection.type !== \"Range\") {\n\t\t\t\tthis.emit(\"unselected\");\n\t\t\t}\n\t\t});\n\n\t\tthis.rendition.on(\"layout\", (props) => {\n\t\t\tthis.emit(\"layout\", props);\n\t\t});\n\n\t\tthis.rendition.on(\"selected\", (cfiRange, contents) => {\n\t\t\tthis.setLocation(cfiRange);\n\t\t\tthis.emit(\"selected\", cfiRange, contents);\n\t\t});\n\n\t\tthis.rendition.on(\"relocated\", (location) => {\n\t\t\tthis.setLocation(location.start.cfi);\n\t\t\tthis.emit(\"relocated\", location);\n\t\t});\n\n\t\tthis.rendition.on(\"keydown\", this.keyboardHandler.bind(this));\n\n\t\tthis.on(\"prev\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.next();\n\t\t\t} else {\n\t\t\t\tthis.rendition.prev();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"next\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.prev();\n\t\t\t} else {\n\t\t\t\tthis.rendition.next();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"languagechanged\", (value) => {\n\t\t\tthis.settings.language = value;\n\t\t});\n\n\t\tthis.on(\"flowchanged\", (value) => {\n\t\t\tthis.settings.flow = value;\n\t\t\tthis.rendition.flow(value);\n\t\t});\n\n\t\tthis.on(\"spreadchanged\", (value) => {\n\t\t\tconst mod = value.mod || this.settings.spread.mod;\n\t\t\tconst min = value.min || this.settings.spread.min;\n\t\t\tthis.settings.spread.mod = mod;\n\t\t\tthis.settings.spread.min = min;\n\t\t\tthis.rendition.spread(mod, min);\n\t\t});\n\n\t\tthis.on(\"styleschanged\", (value) => {\n\t\t\tconst fontSize = value.fontSize;\n\t\t\tthis.settings.styles.fontSize = fontSize;\n\t\t\tthis.rendition.themes.fontSize(fontSize + \"px\");\n\t\t});\n\t}\n\n\t/* ------------------------------- Common ------------------------------- */\n\n\tnavItemFromCfi(cfi) {\n\n\t\t// This feature was added to solve the problem of duplicate titles in \n\t\t// bookmarks. But this still has no solution because when reloading the \n\t\t// reader, rendition cannot get the range from the previously saved CFI.\n\t\tconst range = this.rendition.getRange(cfi);\n\t\tconst idref = range ? range.startContainer.parentNode.id : undefined;\n\t\tconst location = this.rendition.currentLocation();\n\t\tconst href = location.start.href;\n\t\treturn this.navItems[href + \"#\" + idref] || this.navItems[href];\n\t}\n\n\t/* ------------------------------ Bookmarks ----------------------------- */\n\n\t/**\n\t * Verifying the current page in bookmarks.\n\t * @param {*} cfi\n\t * @returns The index of the bookmark if it exists, or -1 otherwise.\n\t */\n\tisBookmarked(cfi) {\n\t\treturn this.settings.bookmarks.indexOf(cfi);\n\t}\n\n\t/* ----------------------------- Annotations ---------------------------- */\n\n\tisAnnotated(note) {\n\n\t\treturn this.settings.annotations.indexOf(note);\n\t}\n\n\t/* ------------------------------ Settings ------------------------------ */\n\n\t/**\n\t * Initialize book settings.\n\t * @param {any} bookPath\n\t * @param {any} settings\n\t */\n\tcfgInit(bookPath, settings) {\n\n\t\tthis.entryKey = md5(bookPath).toString();\n\t\tthis.settings = {\n\t\t\tbookPath: bookPath,\n\t\t\tarrows: this.isMobile ? \"none\" : \"content\", // none | content | toolbar\n\t\t\tmanager: this.isMobile ? \"continuous\" : \"default\",\n\t\t\trestore: true,\n\t\t\thistory: true,\n\t\t\topenbook: this.storage.indexedDB ? true : false,\n\t\t\tlanguage: \"en\",\n\t\t\tsectionId: undefined,\n\t\t\tbookmarks: [], // array | false\n\t\t\tannotations: [], // array | false\n\t\t\tflow: \"paginated\", // paginated | scrolled\n\t\t\tspread: {\n\t\t\t\tmod: \"auto\", // auto | none\n\t\t\t\tmin: 800\n\t\t\t},\n\t\t\tstyles: {\n\t\t\t\tfontSize: 16\t// Default fontsize by 'px'\n\t\t\t},\n\t\t\tpagination: undefined, // not implemented\n\t\t\tfullscreen: document.fullscreenEnabled,\n\t\t\tbackground: [],\t// Setting for change background \"viewer\"\n\t\t};\n\n\t\textend(settings || {}, this.settings);\n\n\t\tif (this.settings.restore) {\n\t\t\tthis.applySavedSettings(settings || {});\n\t\t} else {\n\t\t\tthis.removeSavedSettings();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the book setting can be retrieved from localStorage.\n\t * @returns true if the book key exists, or false otherwise.\n\t */\n\tisSaved() {\n\n\t\treturn localStorage && localStorage.getItem(this.entryKey) !== null;\n\t}\n\n\t/**\n\t * Removing the current book settings from local storage.\n\t * @returns true if the book settings were deleted successfully, or false\n\t * otherwise.\n\t */\n\tremoveSavedSettings() {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlocalStorage.removeItem(this.entryKey);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Applies saved settings from local storage.\n\t * @param {*} external External settings\n\t * @returns True if the settings were applied successfully, false otherwise.\n\t */\n\tapplySavedSettings(external) {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlet stored;\n\t\ttry {\n\t\t\tstored = JSON.parse(localStorage.getItem(this.entryKey));\n\t\t} catch (e) {\n\t\t\tconsole.exception(e);\n\t\t}\n\n\t\tif (stored) {\n\t\t\textend(stored, this.settings, external);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Saving the current book settings in local storage.\n\t */\n\tsaveSettings() {\n\n\t\tthis.settings.previousLocationCfi = this.rendition.location.start.cfi;\n\t\tconst cfg = Object.assign({}, this.settings);\n\t\tdelete cfg.arrows;\n\t\tdelete cfg.manager;\n\t\tdelete cfg.history;\n\t\tdelete cfg.restore;\n\t\tdelete cfg.openbook;\n\t\tdelete cfg.pagination;\n\t\tdelete cfg.fullscreen;\n\t\tdelete cfg.background;\n\t\tlocalStorage.setItem(this.entryKey, JSON.stringify(cfg));\n\t}\n\n\tsetLocation(cfi) {\n\n\t\tconst baseUrl = this.book.archived ? undefined : this.book.url;\n\t\tconst url = new URL(window.location, baseUrl);\n\t\turl.hash = \"#\" + cfi;\n\n\t\t// Update the History Location\n\t\tif (this.settings.history && window.location.hash !== url.hash) {\n\t\t\t// Add CFI fragment to the history\n\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\tthis.currentLocationCfi = cfi;\n\t\t}\n\t}\n\n\t//-- event handlers --//\n\n\tunload() {\n\n\t\tif (this.settings.restore && localStorage) {\n\t\t\tthis.saveSettings();\n\t\t}\n\t}\n\n\thashChanged() {\n\n\t\tconst hash = window.location.hash.slice(1);\n\t\tthis.rendition.display(hash);\n\t}\n\n\tkeyboardHandler(e) {\n\n\t\tconst step = 1;\n\t\tlet value = this.settings.styles.fontSize;\n\n\t\tswitch (e.key) {\n\n\t\t\tcase \"=\":\n\t\t\tcase \"+\":\n\t\t\t\tvalue += step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"-\":\n\t\t\t\tvalue -= step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"0\":\n\t\t\t\tvalue = 16;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tthis.emit(\"prev\");\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tthis.emit(\"next\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nEventEmitter(Reader.prototype);"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/js/epubreader.min.js b/dist/js/epubreader.min.js index df8c4bb..474a748 100644 --- a/dist/js/epubreader.min.js +++ b/dist/js/epubreader.min.js @@ -1,2 +1,2 @@ -var e={263:(e,t,s)=>{var a=s(175),o=s(873),n=s(596),i=s(148),r=s(214);(e.exports=function(e,t){var s,o,d,l,c;return arguments.length<2||"string"!=typeof e?(l=t,t=e,e=null):l=arguments[2],a(e)?(s=r.call(e,"c"),o=r.call(e,"e"),d=r.call(e,"w")):(s=d=!0,o=!1),c={value:t,configurable:s,enumerable:o,writable:d},l?n(i(l),c):c}).gs=function(e,t,s){var d,l,c,h;return"string"!=typeof e?(c=s,s=t,t=e,e=null):c=arguments[3],a(t)?o(t)?a(s)?o(s)||(c=s,s=void 0):s=void 0:(c=t,t=s=void 0):t=void 0,a(e)?(d=r.call(e,"c"),l=r.call(e,"e")):(d=!0,l=!1),h={get:t,set:s,configurable:d,enumerable:l},c?n(i(c),h):h}},11:e=>{e.exports=function(){}},596:(e,t,s)=>{e.exports=s(339)()?Object.assign:s(595)},339:e=>{e.exports=function(){var e,t=Object.assign;return"function"==typeof t&&(t(e={foo:"raz"},{bar:"dwa"},{trzy:"trzy"}),e.foo+e.bar+e.trzy==="razdwatrzy")}},595:(e,t,s)=>{var a=s(93),o=s(134),n=Math.max;e.exports=function(e,t){var s,i,r,d=n(arguments.length,2);for(e=Object(o(e)),r=function(a){try{e[a]=t[a]}catch(e){s||(s=e)}},i=1;i{var a=s(11)();e.exports=function(e){return e!==a&&null!==e}},93:(e,t,s)=>{e.exports=s(380)()?Object.keys:s(232)},380:e=>{e.exports=function(){try{return Object.keys("primitive"),!0}catch(e){return!1}}},232:(e,t,s)=>{var a=s(762),o=Object.keys;e.exports=function(e){return o(a(e)?Object(e):e)}},148:(e,t,s)=>{var a=s(762),o=Array.prototype.forEach,n=Object.create;e.exports=function(e){var t=n(null);return o.call(arguments,(function(e){a(e)&&function(e,t){var s;for(s in e)t[s]=e[s]}(Object(e),t)})),t}},499:e=>{e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},134:(e,t,s)=>{var a=s(762);e.exports=function(e){if(!a(e))throw new TypeError("Cannot use null or undefined");return e}},214:(e,t,s)=>{e.exports=s(525)()?String.prototype.contains:s(521)},525:e=>{var t="razdwatrzy";e.exports=function(){return"function"==typeof t.contains&&!0===t.contains("dwa")&&!1===t.contains("foo")}},521:e=>{var t=String.prototype.indexOf;e.exports=function(e){return t.call(this,e,arguments[1])>-1}},68:(e,t,s)=>{var a,o,n,i,r,d,l,c=s(263),h=s(499),b=Function.prototype.apply,u=Function.prototype.call,m=Object.create,g=Object.defineProperty,p=Object.defineProperties,f=Object.prototype.hasOwnProperty,w={configurable:!0,enumerable:!1,writable:!0};o=function(e,t){var s,o;return h(t),o=this,a.call(this,e,s=function(){n.call(o,e,s),b.call(t,this,arguments)}),s.__eeOnceListener__=t,this},r={on:a=function(e,t){var s;return h(t),f.call(this,"__ee__")?s=this.__ee__:(s=w.value=m(null),g(this,"__ee__",w),w.value=null),s[e]?"object"==typeof s[e]?s[e].push(t):s[e]=[s[e],t]:s[e]=t,this},once:o,off:n=function(e,t){var s,a,o,n;if(h(t),!f.call(this,"__ee__"))return this;if(!(s=this.__ee__)[e])return this;if("object"==typeof(a=s[e]))for(n=0;o=a[n];++n)o!==t&&o.__eeOnceListener__!==t||(2===a.length?s[e]=a[n?0:1]:a.splice(n,1));else a!==t&&a.__eeOnceListener__!==t||delete s[e];return this},emit:i=function(e){var t,s,a,o,n;if(f.call(this,"__ee__")&&(o=this.__ee__[e]))if("object"==typeof o){for(s=arguments.length,n=new Array(s-1),t=1;t{var a=s(202);e.exports=function(e){if("function"!=typeof e)return!1;if(!hasOwnProperty.call(e,"length"))return!1;try{if("number"!=typeof e.length)return!1;if("function"!=typeof e.call)return!1;if("function"!=typeof e.apply)return!1}catch(e){return!1}return!a(e)}},181:(e,t,s)=>{var a=s(175),o={object:!0,function:!0,undefined:!0};e.exports=function(e){return!!a(e)&&hasOwnProperty.call(o,typeof e)}},873:(e,t,s)=>{var a=s(80),o=/^\s*class[\s{/}]/,n=Function.prototype.toString;e.exports=function(e){return!!a(e)&&!o.test(n.call(e))}},202:(e,t,s)=>{var a=s(181);e.exports=function(e){if(!a(e))return!1;try{return!!e.constructor&&e.constructor.prototype===e}catch(e){return!1}}},175:e=>{e.exports=function(e){return null!=e}}},t={};function s(a){var o=t[a];if(void 0!==o)return o.exports;var n=t[a]={exports:{}};return e[a](n,n.exports,s),n.exports}s.d=(e,t)=>{for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};s.r(a),s.d(a,{Reader:()=>R});var o=s(68);const n=(e,t)=>e?e[t]:void 0,i=(e,t,s,a)=>{let o;if("boolean"==typeof t[a])switch(a){case"annotations":case"bookmarks":o=t[a]?e[a]:t[a];break;default:o=t[a]}else o="arrows"===a?t[a]:void 0===n(s,a)?e[a]:t[a];return o},r=(e,t,s)=>{for(let a in e)"bookPath"!==a&&(t[a]instanceof Array?t[a]=s?e[a]?e[a]:t[a]:e[a]:t[a]instanceof Object?r(e[a],t[a],n(s,a)):t[a]=s?i(e,t,s,a):e[a])},d=()=>{let e=(new Date).getTime();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(t=>{let s=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===t?s:7&s|8).toString(16)}))};class l{constructor(){this.name="epubreader-js",this.version=1,this.db,this.indexedDB=window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.OIndexedDB||window.msIndexedDB,void 0===this.indexedDB&&console.error("The IndexedDB API not available in your browser.")}init(e){if(void 0===this.indexedDB)return void e();const t=Date.now(),s=e=>console.error("IndexedDB",e),a=indexedDB.open(this.name,this.version);a.onupgradeneeded=e=>{const t=e.target.result;!1===t.objectStoreNames.contains("entries")&&t.createObjectStore("entries")},a.onsuccess=a=>{this.db=a.target.result,this.db.onerror=s,e(),console.log(`storage.init: ${Date.now()-t} ms`)},a.onerror=s}get(e){if(void 0===this.db)return void e();const t=Date.now();this.db.transaction(["entries"],"readwrite").objectStore("entries").get(0).onsuccess=s=>{e(s.target.result),console.log(`storage.get: ${Date.now()-t} ms`)}}set(e,t){if(void 0===this.db)return void t();const s=Date.now();this.db.transaction(["entries"],"readwrite").objectStore("entries").put(e,0).onsuccess=()=>{t(),console.log(`storage.set: ${Date.now()-s} ms`)}}clear(){if(void 0===this.db)return;const e=Date.now();this.db.transaction(["entries"],"readwrite").objectStore("entries").clear().onsuccess=()=>{console.log(`storage.clear: ${Date.now()-e} ms`)}}}class c{constructor(e){this.language=e.settings.language||"en",this.values={en:{"toolbar/sidebar":"Sidebar","toolbar/prev":"Previous page","toolbar/next":"Next page","toolbar/openbook":"Open book","toolbar/openbook/error":"Your browser does not support the required features.\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.","toolbar/bookmark":"Add this page to bookmarks","toolbar/fullscreen":"Fullscreen","sidebar/close":"Close Sidebar","sidebar/contents":"Contents","sidebar/bookmarks":"Bookmarks","sidebar/bookmarks/add":"Add","sidebar/bookmarks/remove":"Remove","sidebar/bookmarks/clear":"Clear","sidebar/annotations":"Annotations","sidebar/annotations/add":"Add","sidebar/annotations/remove":"Remove","sidebar/annotations/clear":"Clear","sidebar/annotations/anchor":"Anchor","sidebar/annotations/cancel":"Cancel","sidebar/search":"Search","sidebar/search/placeholder":"Search","sidebar/settings":"Settings","sidebar/settings/language":"Language","sidebar/settings/fontsize":"Font size (%)","sidebar/settings/flow":"Flow","sidebar/settings/pagination":["Pagination","Generate pagination"],"sidebar/settings/spread":"Spread","sidebar/settings/spread/minwidth":"Minimum spread width","sidebar/metadata":"Metadata","sidebar/metadata/title":"Title","sidebar/metadata/creator":"Creator","sidebar/metadata/description":"Description","sidebar/metadata/pubdate":"Pubdate","sidebar/metadata/publisher":"Publisher","sidebar/metadata/identifier":"Identifier","sidebar/metadata/language":"Language","sidebar/metadata/rights":"Rights","sidebar/metadata/modified_date":"Modified date","sidebar/metadata/layout":"Layout","sidebar/metadata/flow":"Flow","sidebar/metadata/spread":"Spread","sidebar/metadata/direction":"Direction","notedlg/label":"Note","notedlg/add":"Add"},fr:{"toolbar/sidebar":"Barre latérale","toolbar/prev":"???","toolbar/next":"???","toolbar/openbook":"Ouvrir un livre local","toolbar/openbook/error":"Votre navigateur ne prend pas en charge les fonctions nécessaires.\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.","toolbar/bookmark":"Insérer un marque page ici","toolbar/fullscreen":"Plein écran","sidebar/close":"???","sidebar/contents":"Sommaire","sidebar/bookmarks":"Marque-pages","sidebar/bookmarks/add":"Ajouter","sidebar/bookmarks/remove":"Retirer","sidebar/bookmarks/clear":"Tout enlever","sidebar/annotations":"Annotations","sidebar/annotations/add":"Ajouter","sidebar/annotations/remove":"Retirer","sidebar/annotations/clear":"Tout enlever","sidebar/annotations/anchor":"Ancre","sidebar/annotations/cancel":"Annuler","sidebar/search":"Rechercher","sidebar/search/placeholder":"rechercher","sidebar/settings":"Réglages","sidebar/settings/language":"Langue","sidebar/settings/fontsize":"???","sidebar/settings/flow":"???","sidebar/settings/pagination":["Pagination","Établir une pagination"],"sidebar/settings/spread":"???","sidebar/settings/spread/minwidth":"???","sidebar/metadata":"???","sidebar/metadata/title":"???","sidebar/metadata/creator":"???","sidebar/metadata/description":"???","sidebar/metadata/pubdate":"???","sidebar/metadata/publisher":"???","sidebar/metadata/identifier":"???","sidebar/metadata/language":"Langue","sidebar/metadata/rights":"???","sidebar/metadata/modified_date":"???","sidebar/metadata/layout":"???","sidebar/metadata/flow":"???","sidebar/metadata/spread":"???","sidebar/metadata/direction":"???","notedlg/label":"???","notedlg/add":"Ajouter"},ja:{"toolbar/sidebar":"サイドバー","toolbar/prev":"???","toolbar/next":"???","toolbar/openbook":"本を開く","toolbar/openbook/error":"ご利用のブラウザは必要な機能をサポートしていません。\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。","toolbar/bookmark":"このページに栞を設定する","toolbar/fullscreen":"フルスクリーン","sidebar/close":"???","sidebar/contents":"目次","sidebar/bookmarks":"栞","sidebar/bookmarks/add":"追加","sidebar/bookmarks/remove":"削除","sidebar/bookmarks/clear":"クリア","sidebar/annotations":"注釈","sidebar/annotations/add":"追加","sidebar/bookmarks/remove":"削除","sidebar/annotations/clear":"クリア","sidebar/annotations/anchor":"アンカー","sidebar/annotations/cancel":"キャンセル","sidebar/search":"検索","sidebar/search/placeholder":"検索","sidebar/settings":"設定","sidebar/settings/language":"表示言語","sidebar/settings/fontsize":"???","sidebar/settings/flow":"???","sidebar/settings/pagination":["ページネーション","ページネーションを生成します。"],"sidebar/settings/spread":"???","sidebar/settings/spread/minwidth":"???","sidebar/metadata":"???","sidebar/metadata/title":"???","sidebar/metadata/creator":"???","sidebar/metadata/description":"???","sidebar/metadata/pubdate":"???","sidebar/metadata/publisher":"???","sidebar/metadata/identifier":"???","sidebar/metadata/language":"表示言語","sidebar/metadata/rights":"???","sidebar/metadata/modified_date":"???","sidebar/metadata/layout":"???","sidebar/metadata/flow":"???","sidebar/metadata/spread":"???","sidebar/metadata/direction":"???","notedlg/label":"???","notedlg/add":"追加"},ru:{"toolbar/sidebar":"Боковая панель","toolbar/prev":"Предыдущая страница","toolbar/next":"Следущая страница","toolbar/openbook":"Открыть книгу","toolbar/openbook/error":"Ваш браузер не поддерживает необходимые функции.\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.","toolbar/bookmark":"Добавить эту страницу в закладки","toolbar/fullscreen":"Полноэкранный режим","sidebar/close":"Закрыть боковую панель","sidebar/contents":"Содержание","sidebar/bookmarks":"Закладки","sidebar/bookmarks/add":"Добавить","sidebar/bookmarks/remove":"Удалить","sidebar/bookmarks/clear":"Очистить","sidebar/annotations":"Аннотации","sidebar/annotations/add":"Добавить","sidebar/annotations/remove":"Удалить","sidebar/annotations/clear":"Очистить","sidebar/annotations/anchor":"Метка","sidebar/annotations/cancel":"Отмена","sidebar/search":"Поиск","sidebar/search/placeholder":"Поиск","sidebar/settings":"Настройки","sidebar/settings/language":"Язык","sidebar/settings/fontsize":"Размер шрифта","sidebar/settings/flow":"Поток","sidebar/settings/pagination":["Нумерация страниц","Генерировать нумерацию страниц"],"sidebar/settings/spread":"Разворот","sidebar/settings/spread/minwidth":"Мин. ширина колонки","sidebar/metadata":"Метаданные","sidebar/metadata/title":"Заголовок","sidebar/metadata/creator":"Автор","sidebar/metadata/description":"Описание","sidebar/metadata/pubdate":"Дата публикации","sidebar/metadata/publisher":"Издатель","sidebar/metadata/identifier":"Идентификатор","sidebar/metadata/language":"Язык","sidebar/metadata/rights":"Лицензия","sidebar/metadata/modified_date":"Дата изменения","sidebar/metadata/layout":"Макет","sidebar/metadata/flow":"Поток","sidebar/metadata/spread":"Разворот","sidebar/metadata/direction":"Направление","notedlg/label":"Заметка","notedlg/add":"Добавить"}},e.on("languagechanged",(e=>{this.language=e}))}get(e){return this.values[this.language][e]||"???"}}const h="is not an instance of UIElement.";class b{constructor(e){this.dom=document.createElement(e)}add(){for(let e=0;e{e.stopPropagation()},this.setValue(t),this.setTitle(s)}getName(){return this.dom.name}setName(e){return this.dom.name=e,this}getType(){return this.dom.type}setType(e){return this.dom.type=e,this}getValue(){return this.dom.value}setValue(e){return this.dom.value!==e&&void 0!==e&&(this.dom.value=e),this}}class y extends b{constructor(e,t,s,a,o){super("input"),this.dom.type="number",this.dom.step=t||1,this.dom.onkeydown=e=>{e.stopPropagation()},this.value=e||0,this.min=s||-1/0,this.max=a||1/0,this.precision=o||0,this.setValue(e),this.dom.onchange=e=>{this.setValue(this.value)}}getName(){return this.dom.name}setName(e){return this.dom.name=e,this}setPrecision(e){return this.precision=e,this.setValue(this.value),this}setRange(e,t){return this.min=e,this.max=t,this.dom.min=e,this.dom.max=t,this}setStep(e){return this.dom.step=e,this}getValue(){return parseFloat(this.dom.value)}setValue(e){return void 0!==e&&((e=parseFloat(e))this.max&&(e=this.max),this.value=e,this.dom.value=e.toFixed(this.precision)),this}}class C extends m{constructor(e){super(),this.align=e||"horizontal",this.tabs=[],this.panels=[],this.selector=(new u).setClass("tab-selector"),this.menuDiv=(new m).setClass("menu"),this.tabsDiv=(new m).setClass("tabs"),this.tabsDiv.add(this.selector),this.panelsDiv=(new m).setClass("panels"),this.selected="",this.add(this.menuDiv),this.add(this.tabsDiv),this.add(this.panelsDiv)}addMenu(e){this.menuDiv.add(e)}addTab(e,t,s){const a=new I(t,this);a.setId(e),a.setClass("box"),this.tabs.push(a),this.tabsDiv.add(a);const o=new m;o.setId(e),o.add(s),this.panels.push(o),this.panelsDiv.add(o),this.select(e)}select(e){for(let t of this.tabs)t.dom.id===e?(t.addClass("selected"),this.transformSelector(t)):t.dom.id===this.selected&&t.removeClass("selected");for(let t of this.panels)t.dom.id===e?t.dom.style.display="block":t.dom.id===this.selected&&(t.dom.style.display="none");return this.selected=e,this}setLabel(e,t){for(let s of this.tabs)if(s.dom.id===e){s.setTitle(t);break}}transformSelector(e){let t;const s=e.getBoundingClientRect();"horizontal"===this.align?(t=s.width*this.tabs.indexOf(e),this.selector.dom.style.transform=`translateX(${t}px)`):(t=s.height*this.tabs.indexOf(e),this.selector.dom.style.transform=`translateY(${t}px)`)}}class I extends m{constructor(e,t){super(),this.button=new x("button"),this.button.dom.title=e,this.dom.onclick=e=>{t.select(this.dom.id),e.preventDefault()},this.add(this.button)}}class S extends b{constructor(e){super("ul"),this.parent=e&&e.parent,this.expanded=!1}expand(){return this.expanded=!0,this.dom.style.display="block",this.parent&&this.parent.expand(),this}collaps(){return this.expanded=!1,this.dom.style.display="none",this}}class D extends b{constructor(e){super("li"),this.parent=e,this.selected=!1}add(){let e=0;const t=(new m).setId("item-box");for(let s=0;s{e.emit("sidebaropener",!0),r.dom.blur(),t.preventDefault()},i.add(r),n.add(i),"toolbar"===s.arrows&&(d=(new m).setId("btn-p").setClass("box"),l=new x("button"),l.setTitle(t.get(o[1])),l.dom.onclick=t=>{e.emit("prev"),t.preventDefault(),l.dom.blur()},d.add(l),n.add(d),c=(new m).setId("btn-n").setClass("box"),h=new x("button"),h.dom.title=t.get(o[2]),h.dom.onclick=t=>{e.emit("next"),t.preventDefault(),h.dom.blur()},c.add(h),n.add(c));const b=(new m).setClass("menu-2");let u,g,p,f;if(s.openbook){const s=t=>{e.storage.clear(),e.storage.set(t.target.result,(()=>{e.unload(),e.init(t.target.result);const s=new URL(window.location.origin);window.history.pushState({},"",s)}))},a=e=>{console.error(e)},n=(new m).setId("btn-o").setClass("box");u=new x("file"),u.dom.title=t.get(o[3]),u.dom.accept="application/epub+zip",u.dom.onchange=e=>{if(0!==e.target.files.length)if(window.FileReader){const t=new FileReader;t.onload=s,t.readAsArrayBuffer(e.target.files[0]),t.onerror=a}else alert(t.get(o[4]))},u.dom.onclick=e=>{u.dom.blur()},n.add(u),b.add(n)}if(s.bookmarks&&(g=(new m).setId("btn-b").setClass("box"),p=new x("button"),p.setTitle(t.get(o[5])),p.dom.onclick=t=>{const s=this.locationCfi,a=-1===e.isBookmarked(s);e.emit("bookmarked",a),t.preventDefault(),p.dom.blur()},g.add(p),b.add(g)),s.fullscreen){const e=(new m).setId("btn-f").setClass("box");f=new x("button"),f.setTitle(t.get(o[6])),f.dom.onclick=e=>{this.toggleFullScreen(),e.preventDefault()},document.onkeydown=e=>{"F11"===e.key&&(e.preventDefault(),this.toggleFullScreen())},document.onfullscreenchange=t=>{const s=window.screen.width===t.target.clientWidth,a=window.screen.height===t.target.clientHeight;s&&a?e.addClass("resize-small"):e.removeClass("resize-small")},e.add(f),b.add(e)}a.add([n,b]),document.body.appendChild(a.dom),e.on("relocated",(t=>{if(s.bookmarks){const s=t.start.cfi;-1===e.isBookmarked(s)?g.removeClass("bookmarked"):g.addClass("bookmarked"),this.locationCfi=s}"toolbar"===s.arrows&&(d.dom.style.display=t.atStart?"none":"block",c.dom.style.display=t.atEnd?"none":"block")})),e.on("bookmarked",(e=>{e?g.addClass("bookmarked"):g.removeClass("bookmarked")})),e.on("languagechanged",(e=>{r.setTitle(t.get(o[0])),"toolbar"===s.arrows&&(l.setTitle(t.get(o[1])),h.setTitle(t.get(o[2]))),s.openbook&&u.setTitle(t.get(o[3])),s.bookmarks&&p.setTitle(t.get(o[5])),s.fullscreen&&f.setTitle(t.get(o[6]))}))}toggleFullScreen(){document.activeElement.blur(),null===document.fullscreenElement?document.documentElement.requestFullscreen():document.exitFullscreen&&document.exitFullscreen()}}class O{constructor(e){const t=e.settings,s=(new m).setId("content");let a;"content"===t.arrows&&(a=(new m).setId("prev").setClass("arrow"),a.dom.onclick=t=>{e.emit("prev"),t.preventDefault()},a.add(new u("<")),s.add(a));const o=(new m).setId("viewer");let n;s.add(o),"content"===t.arrows&&(n=(new m).setId("next").setClass("arrow"),n.dom.onclick=t=>{e.emit("next"),t.preventDefault()},n.add(new u(">")),s.add(n));const i=(new m).setId("loader"),r=(new m).setId("divider"),d=(new m).setId("overlay");d.dom.onclick=t=>{e.emit("sidebaropener",!1),t.preventDefault()},s.add([i,r,d]),document.body.appendChild(s.dom),e.on("bookready",(e=>{o.setClass(e.flow),i.dom.style.display="block"})),e.on("bookloaded",(()=>{i.dom.style.display="none"})),e.on("layout",(e=>{e.spread&&e.width>e.spreadWidth?r.dom.style.display="block":r.dom.style.display="none"})),e.on("flowchanged",(e=>{o.setClass(e)})),e.on("relocated",(e=>{"content"===t.arrows&&(e.atStart?a.addClass("disabled"):a.removeClass("disabled"),e.atEnd?n.addClass("disabled"):n.removeClass("disabled"))})),e.on("prev",(()=>{"content"===t.arrows&&(a.addClass("active"),setTimeout((()=>{a.removeClass("active")}),100))})),e.on("next",(()=>{"content"===t.arrows&&(n.addClass("active"),setTimeout((()=>{n.removeClass("active")}),100))})),e.on("sidebaropener",(e=>{d.dom.style.display=e?"block":"none"})),e.on("viewercleanup",(()=>{o.clear()}))}}class z extends p{constructor(e){super();const t=(new m).setClass("list-container"),s=e.strings,a=["sidebar/contents"],o=new v(s.get(a[0])).setClass("label");this.reader=e,this.selector=void 0,this.setId("contents"),this.add(new T(o).addClass("header")),e.on("navigation",(e=>{t.clear(),t.add(this.generateToc(e)),this.add(t)})),e.on("languagechanged",(e=>{o.setValue(s.get(a[0]))}))}generateToc(e,t){const s=new S(t);return e.forEach((e=>{const t=new w(e.href,e.label),a=new D(s).setId(e.id),o=new u;if(t.dom.onclick=t=>{this.selector&&this.selector!==a&&this.selector.unselect(),a.select(),this.selector=a,this.reader.settings.sectionId=e.id,this.reader.rendition.display(e.href),t.preventDefault()},a.add([o,t]),this.reader.navItems[e.href]={id:e.id,label:e.label},this.reader.settings.sectionId===e.id&&(s.expand(),a.select(),this.selector=a),e.subitems&&e.subitems.length>0){const t=this.generateToc(e.subitems,a);o.setClass("toggle-collapsed"),o.dom.onclick=()=>(t.expanded?(t.collaps(),o.setClass("toggle-collapsed")):(t.expand(),o.setClass("toggle-expanded")),!1),a.add(t)}s.add(a)})),s}}class j extends p{constructor(e){super();const t=(new m).setClass("list-container"),s=e.strings,a=["sidebar/bookmarks","sidebar/bookmarks/clear"],o=new v(s.get(a[0])).setClass("label"),n=new x("button",s.get(a[1]));n.dom.onclick=t=>{this.clearBookmarks(),e.emit("bookmarked",!1),t.preventDefault()},this.add(new T([o,n]).addClass("header")),this.selector=void 0,this.bookmarks=new S,t.add(this.bookmarks),this.setId("bookmarks"),this.add(t),this.reader=e;const i=()=>{n.dom.disabled=0===e.settings.bookmarks.length};e.on("displayed",((e,t)=>{t.bookmarks.forEach((e=>{this.setBookmark(e)})),i()})),e.on("relocated",(e=>{this.locationCfi=e.start.cfi})),e.on("bookmarked",((e,t)=>{e?this.appendBookmark():this.removeBookmark(t),i()})),e.on("languagechanged",(e=>{o.setValue(s.get(a[0])),n.setValue(s.get(a[1]))}))}appendBookmark(){const e=this.locationCfi;this.reader.isBookmarked(e)>-1||(this.setBookmark(e),this.reader.settings.bookmarks.push(e))}removeBookmark(e){const t=e||this.locationCfi,s=this.reader.isBookmarked(t);-1!==s&&(this.bookmarks.remove(s),this.reader.settings.bookmarks.splice(s,1))}clearBookmarks(){this.bookmarks.clear(),this.reader.settings.bookmarks=[]}setBookmark(e){const t=new w,s=new D,a=(new u).setClass("btn-remove"),o=this.reader.navItemFromCfi(e);let n,i;if(void 0===o){const t=this.reader.book.spine.get(e);n=t.idref,i=t.idref}else n=o.id,i=o.label;t.setHref("#"+e),t.dom.onclick=t=>{this.selector&&this.selector!==s&&this.selector.unselect(),s.select(),this.selector=s,this.reader.rendition.display(e),t.preventDefault()},t.setTextContent(i),a.dom.onclick=t=>{this.reader.emit("bookmarked",!1,e),t.preventDefault()},s.add([t,a]),s.setId(n),this.bookmarks.add(s)}}class B extends p{constructor(e){super();const t=(new m).setClass("list-container"),s=e.strings,a=["sidebar/annotations","sidebar/annotations/clear"],o=new v(s.get(a[0])).setClass("label"),n=new x("button",s.get(a[1]));n.dom.onclick=e=>{this.clearNotes(),e.preventDefault()},this.add(new T([o,n]).addClass("header")),this.selector=void 0,this.notes=new S,t.add(this.notes),this.setId("annotations"),this.add(t),this.reader=e,this.update=()=>{n.dom.disabled=0===e.settings.annotations.length},e.on("bookready",(e=>{e.annotations.forEach((e=>{this.set(e)})),this.update()})),e.on("noteadded",(e=>{this.set(e),this.update()})),e.on("languagechanged",(e=>{o.setValue(s.get(a[0])),n.setValue(s.get(a[1]))}))}set(e){const t=new w("#"+e.cfi,e.text),s=(new D).setId("note-"+e.uuid),a=(new u).setClass("btn-remove");t.dom.onclick=t=>{this.selector&&this.selector!==s&&this.selector.unselect(),s.select(),this.selector=s,this.reader.rendition.display(e.cfi),t.preventDefault()},a.dom.onclick=t=>{this.removeNote(e),t.preventDefault()},s.add([t,a]),this.notes.add(s),this.reader.rendition.annotations.add("highlight",e.cfi,{},(()=>{}),"note-highlight",{}),this.update()}removeNote(e){const t=this.reader.settings.annotations.indexOf(e);-1!==t&&(this.notes.remove(t),this.reader.settings.annotations.splice(t,1),this.reader.rendition.annotations.remove(e.cfi,"highlight"),this.update())}clearNotes(){this.reader.settings.annotations.forEach((e=>{this.reader.rendition.annotations.remove(e.cfi,"highlight")})),this.notes.clear(),this.reader.settings.annotations=[],this.update()}}class A extends p{constructor(e){super();const t=(new m).setClass("list-container"),s=e.strings;let a;const o=new x("search").setId("nav-q");o.dom.placeholder=s.get("sidebar/search/placeholder"),o.dom.onsearch=()=>{const e=o.getValue();0===e.length?this.items.clear():a!==e&&(this.items.clear(),this.doSearch(e).then((e=>{e.forEach((e=>{this.set(e)}))}))),a=e},this.setId("search"),this.items=new S,t.add(this.items),this.add([new T(o),t]),this.reader=e,this.selector=void 0}async doSearch(e){const t=this.reader.book,s=await Promise.all(t.spine.spineItems.map((s=>s.load(t.load.bind(t)).then(s.find.bind(s,e)).finally(s.unload.bind(s)))));return await Promise.resolve([].concat.apply([],s))}set(e){const t=new w("#"+e.cfi,e.excerpt),s=new D;t.dom.onclick=()=>(this.selector&&this.selector!==s&&this.selector.unselect(),s.select(),this.selector=s,this.reader.rendition.display(e.cfi),!1),s.add(t),this.items.add(s)}}class V extends p{constructor(e){super(),super.setId("settings");const t=e.strings,s=["sidebar/settings","sidebar/settings/language","sidebar/settings/fontsize","sidebar/settings/flow","sidebar/settings/spread","sidebar/settings/spread/minwidth"],a=new v(t.get(s[0])).setClass("label");this.add(new T(a).addClass("header"));const o=new f(t.get(s[1]),"language-ui"),n=new g,i=(new k).setOptions({en:"English",fr:"French",ja:"Japanese",ru:"Russian"});i.dom.onchange=t=>{e.emit("languagechanged",t.target.value)},i.setId("language-ui"),n.add(o),n.add(i);const r=new f(t.get(s[2]),"fontsize"),d=new g,l=new y(100,1);l.dom.onchange=t=>{e.emit("styleschanged",{fontSize:parseInt(t.target.value)})},l.setId("fontsize"),d.add(r),d.add(l);const c=new f(t.get(s[3]),"flow"),h=new g,b=(new k).setOptions({paginated:"Paginated",scrolled:"Scrolled"});b.dom.onchange=t=>{e.emit("flowchanged",t.target.value),"scrolled"===t.target.value?e.emit("spreadchanged",{mod:"none",min:void 0}):e.emit("spreadchanged",{mod:void 0,min:void 0})},b.setId("flow"),h.add(c),h.add(b);const u=new y(800,1),m=new f(t.get(s[4]),"spread"),p=new g,w=(new k).setOptions({none:"None",auto:"Auto"});w.dom.onchange=t=>{e.emit("spreadchanged",{mod:t.target.value,min:void 0}),u.dom.disabled="none"===t.target.value},w.setId("spread"),p.add(m),p.add(w);const C=new f(t.get(s[5]),"min-spread-width"),I=new g;u.dom.onchange=t=>{e.emit("spreadchanged",{mod:void 0,min:parseInt(t.target.value)})},u.setId("min-spread-width"),I.add(C),I.add(u);const S=t.get("sidebar/settings/pagination"),D=new g,_=new x("checkbox",!1,S[1]);_.setId("pagination"),_.dom.onclick=e=>{},D.add(new f(S[0],"pagination")),D.add(_),this.add(new T([n,d,h,p,I])),e.on("bookready",(e=>{i.setValue(e.language),l.setValue(e.styles.fontSize),b.setValue(e.flow),w.setValue(e.spread.mod),u.setValue(e.spread.min),u.dom.disabled="none"===e.spread.mod})),e.on("layout",(e=>{"scrolled"===e.flow?(w.setValue("none"),w.dom.disabled=!0,u.dom.disabled=!0):w.dom.disabled=!1})),e.on("languagechanged",(e=>{a.setTextContent(t.get(s[0])),o.setTextContent(t.get(s[1])),r.setTextContent(t.get(s[2])),c.setTextContent(t.get(s[3])),m.setTextContent(t.get(s[4])),C.setTextContent(t.get(s[5]))}))}}class P extends p{constructor(e){super();const t=(new m).setClass("list-container"),s=e.strings,a={},o="sidebar/metadata",n=new v(s.get(o)).setClass("label");this.add(new T(n).addClass("header")),a[o]=n,this.items=new S,this.setId("metadata"),this.add(t);const i=(e,t)=>{if(void 0===t[e]||null===t[e]||"string"==typeof t[e]&&0===t[e].length)return;const n=new D,i=(new v).setClass("label"),r=(new v).setClass("value");i.setValue(s.get(o+"/"+e).toUpperCase()),"description"===e?r.dom.innerHTML=t[e]:r.setValue(t[e]),a[o+"/"+e]=i,n.add([i,r]),this.items.add(n)};e.on("metadata",(e=>{this.items.clear(),t.clear(),t.add(this.items),document.title=e.title;for(const t in e)i(t,e)})),e.on("languagechanged",(e=>{for(const e in a){let t;t=e===o?s.get(e):s.get(e).toUpperCase(),a[e].setValue(t)}}))}}class L{constructor(e){const t=e.strings,s=e.settings,a=["sidebar/close","sidebar/contents","sidebar/bookmarks","sidebar/annotations","sidebar/search","sidebar/settings","sidebar/metadata"],o=new C("vertical").setId("sidebar"),n=(new m).setId("btn-p").addClass("box"),i=new x("button");i.setTitle(t.get(a[0])),i.dom.onclick=t=>{e.emit("sidebaropener",!1),t.preventDefault(),i.dom.blur()},n.add(i),o.addMenu(n),o.addTab("btn-t",t.get(a[1]),new z(e)),s.bookmarks&&o.addTab("btn-d",t.get(a[2]),new j(e)),s.annotations&&o.addTab("btn-a",t.get(a[3]),new B(e)),o.addTab("btn-s",t.get(a[4]),new A(e)),o.addTab("btn-c",t.get(a[5]),new V(e)),o.addTab("btn-i",t.get(a[6]),new P(e)),o.select("btn-t"),document.body.appendChild(o.dom),e.on("sidebaropener",(e=>{e?o.setClass("open"):o.removeAttribute("class")})),e.on("languagechanged",(e=>{i.setTitle(t.get(a[0])),o.setLabel("btn-t",t.get(a[1])),s.bookmarks&&o.setLabel("btn-d",t.get(a[2])),s.annotations&&o.setLabel("btn-a",t.get(a[3])),o.setLabel("btn-s",t.get(a[4])),o.setLabel("btn-c",t.get(a[5])),o.setLabel("btn-i",t.get(a[6]))}))}}class F{constructor(e){const t=(new m).setId("notedlg"),s=e.strings,a=["notedlg/label","notedlg/add"],o=new f(s.get(a[0]),"note-input"),n=new x("text","").setId("note-input");n.dom.oninput=e=>{this.update(),e.preventDefault()};const i=new x("button",s.get(a[1]));i.dom.disabled=!0,i.dom.onclick=s=>{const a={cfi:this.cfi,date:new Date,text:n.getValue(),uuid:d()};this.range=void 0,e.settings.annotations.push(a),e.emit("noteadded",a),t.removeAttribute("class"),s.preventDefault(),i.dom.blur()},this.update=()=>{i.dom.disabled=!(this.range&&n.getValue().length>0)},t.add(new T([o,n,i]).addClass("control")),document.body.appendChild(t.dom),e.on("selected",((e,s)=>{this.cfi=e,this.range=s.range(e),this.update(),t.setClass("open"),n.setValue("")})),e.on("unselected",(()=>{this.range=void 0,this.update(),t.removeAttribute("class")})),e.on("languagechanged",(e=>{o.setTextContent(s.get(a[0])),i.setValue(s.get(a[1]))}))}}class R{constructor(e,t){const s=s=>{const a=new URL(window.location);let o=e;t&&!t.openbook?(o=e,s&&this.storage.clear()):s&&0===a.search.length&&(o=s),this.cfgInit(o,t),this.strings=new c(this),this.toolbar=new _(this),this.content=new O(this),this.sidebar=new L(this),this.settings.annotations&&(this.notedlg=new F(this)),this.init()};this.settings=void 0,this.isMobile=[/Android/i,/BlackBerry/i,/iPhone/i,/iPad/i,/iPod/i,/Windows Phone/i,/webOS/i].some((e=>navigator.userAgent.match(e))),this.storage=new l;const a=t&&t.openbook;!this.storage.indexedDB||t&&!a?s():this.storage.init((()=>this.storage.get((e=>s(e))))),window.onbeforeunload=this.unload.bind(this),window.onhashchange=this.hashChanged.bind(this),window.onkeydown=this.keyboardHandler.bind(this),window.onwheel=e=>{e.ctrlKey&&e.preventDefault()}}init(e,t){this.emit("viewercleanup"),this.navItems={},arguments.length>0&&this.cfgInit(e,t),this.book=ePub(this.settings.bookPath),this.rendition=this.book.renderTo("viewer",{manager:this.settings.manager,flow:this.settings.flow,spread:this.settings.spread.mod,minSpreadWidth:this.settings.spread.min,width:"100%",height:"100%",snap:!0});const s=this.settings.previousLocationCfi;this.displayed=s?this.rendition.display(s):this.rendition.display(),this.displayed.then((e=>{this.emit("displayed",e,this.settings)})),this.book.ready.then((()=>{this.emit("bookready",this.settings)})).then((()=>{this.emit("bookloaded")})),this.book.loaded.metadata.then((e=>{this.emit("metadata",e)})),this.book.loaded.navigation.then((e=>{this.emit("navigation",e)})),this.rendition.on("click",(e=>{"Range"!==e.view.document.getSelection().type&&this.emit("unselected")})),this.rendition.on("layout",(e=>{this.emit("layout",e)})),this.rendition.on("selected",((e,t)=>{this.setLocation(e),this.emit("selected",e,t)})),this.rendition.on("relocated",(e=>{this.setLocation(e.start.cfi),this.emit("relocated",e)})),this.rendition.on("keydown",this.keyboardHandler.bind(this)),this.on("prev",(()=>{"rtl"===this.book.package.metadata.direction?this.rendition.next():this.rendition.prev()})),this.on("next",(()=>{"rtl"===this.book.package.metadata.direction?this.rendition.prev():this.rendition.next()})),this.on("languagechanged",(e=>{this.settings.language=e})),this.on("flowchanged",(e=>{this.settings.flow=e,this.rendition.flow(e)})),this.on("spreadchanged",(e=>{const t=e.mod||this.settings.spread.mod,s=e.min||this.settings.spread.min;this.settings.spread.mod=t,this.settings.spread.min=s,this.rendition.spread(t,s)})),this.on("styleschanged",(e=>{const t=e.fontSize;this.settings.styles.fontSize=t,this.rendition.themes.fontSize(t+"%")}))}navItemFromCfi(e){const t=this.rendition.getRange(e),s=t?t.startContainer.parentNode.id:void 0,a=this.rendition.currentLocation().start.href;return this.navItems[a+"#"+s]||this.navItems[a]}isBookmarked(e){return this.settings.bookmarks.indexOf(e)}isAnnotated(e){return this.settings.annotations.indexOf(e)}cfgInit(e,t){this.entryKey=md5(e).toString(),this.settings={bookPath:e,arrows:this.isMobile?"none":"content",manager:this.isMobile?"continuous":"default",restore:!0,history:!0,openbook:!!this.storage.indexedDB,language:"en",sectionId:void 0,bookmarks:[],annotations:[],flow:"paginated",spread:{mod:"auto",min:800},styles:{fontSize:100},pagination:void 0,fullscreen:document.fullscreenEnabled},r(t||{},this.settings),this.settings.restore?this.applySavedSettings(t||{}):this.removeSavedSettings()}isSaved(){return localStorage&&null!==localStorage.getItem(this.entryKey)}removeSavedSettings(){return!!this.isSaved()&&(localStorage.removeItem(this.entryKey),!0)}applySavedSettings(e){if(!this.isSaved())return!1;let t;try{t=JSON.parse(localStorage.getItem(this.entryKey))}catch(e){console.exception(e)}return!!t&&(r(t,this.settings,e),!0)}saveSettings(){this.settings.previousLocationCfi=this.rendition.location.start.cfi;const e=Object.assign({},this.settings);delete e.arrows,delete e.manager,delete e.history,delete e.restore,delete e.openbook,delete e.pagination,delete e.fullscreen,localStorage.setItem(this.entryKey,JSON.stringify(e))}setLocation(e){const t=this.book.archived?void 0:this.book.url,s=new URL(window.location,t);s.hash="#"+e,this.settings.history&&window.location.hash!==s.hash&&(window.history.pushState({},"",s),this.currentLocationCfi=e)}unload(){this.settings.restore&&localStorage&&this.saveSettings()}hashChanged(){const e=window.location.hash.slice(1);this.rendition.display(e)}keyboardHandler(e){let t=this.settings.styles.fontSize;switch(e.key){case"=":case"+":t+=2,this.emit("styleschanged",{fontSize:t});break;case"-":t-=2,this.emit("styleschanged",{fontSize:t});break;case"0":t=100,this.emit("styleschanged",{fontSize:t});break;case"ArrowLeft":this.emit("prev");break;case"ArrowRight":this.emit("next")}}}o(R.prototype);var E=a.Reader;export{E as Reader}; +var e={263:(e,t,s)=>{var a=s(175),o=s(873),n=s(596),i=s(148),r=s(214);(e.exports=function(e,t){var s,o,d,l,c;return arguments.length<2||"string"!=typeof e?(l=t,t=e,e=null):l=arguments[2],a(e)?(s=r.call(e,"c"),o=r.call(e,"e"),d=r.call(e,"w")):(s=d=!0,o=!1),c={value:t,configurable:s,enumerable:o,writable:d},l?n(i(l),c):c}).gs=function(e,t,s){var d,l,c,h;return"string"!=typeof e?(c=s,s=t,t=e,e=null):c=arguments[3],a(t)?o(t)?a(s)?o(s)||(c=s,s=void 0):s=void 0:(c=t,t=s=void 0):t=void 0,a(e)?(d=r.call(e,"c"),l=r.call(e,"e")):(d=!0,l=!1),h={get:t,set:s,configurable:d,enumerable:l},c?n(i(c),h):h}},11:e=>{e.exports=function(){}},596:(e,t,s)=>{e.exports=s(339)()?Object.assign:s(595)},339:e=>{e.exports=function(){var e,t=Object.assign;return"function"==typeof t&&(t(e={foo:"raz"},{bar:"dwa"},{trzy:"trzy"}),e.foo+e.bar+e.trzy==="razdwatrzy")}},595:(e,t,s)=>{var a=s(93),o=s(134),n=Math.max;e.exports=function(e,t){var s,i,r,d=n(arguments.length,2);for(e=Object(o(e)),r=function(a){try{e[a]=t[a]}catch(e){s||(s=e)}},i=1;i{var a=s(11)();e.exports=function(e){return e!==a&&null!==e}},93:(e,t,s)=>{e.exports=s(380)()?Object.keys:s(232)},380:e=>{e.exports=function(){try{return Object.keys("primitive"),!0}catch(e){return!1}}},232:(e,t,s)=>{var a=s(762),o=Object.keys;e.exports=function(e){return o(a(e)?Object(e):e)}},148:(e,t,s)=>{var a=s(762),o=Array.prototype.forEach,n=Object.create;e.exports=function(e){var t=n(null);return o.call(arguments,(function(e){a(e)&&function(e,t){var s;for(s in e)t[s]=e[s]}(Object(e),t)})),t}},499:e=>{e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},134:(e,t,s)=>{var a=s(762);e.exports=function(e){if(!a(e))throw new TypeError("Cannot use null or undefined");return e}},214:(e,t,s)=>{e.exports=s(525)()?String.prototype.contains:s(521)},525:e=>{var t="razdwatrzy";e.exports=function(){return"function"==typeof t.contains&&!0===t.contains("dwa")&&!1===t.contains("foo")}},521:e=>{var t=String.prototype.indexOf;e.exports=function(e){return t.call(this,e,arguments[1])>-1}},68:(e,t,s)=>{var a,o,n,i,r,d,l,c=s(263),h=s(499),m=Function.prototype.apply,u=Function.prototype.call,b=Object.create,g=Object.defineProperty,p=Object.defineProperties,f=Object.prototype.hasOwnProperty,k={configurable:!0,enumerable:!1,writable:!0};o=function(e,t){var s,o;return h(t),o=this,a.call(this,e,s=function(){n.call(o,e,s),m.call(t,this,arguments)}),s.__eeOnceListener__=t,this},r={on:a=function(e,t){var s;return h(t),f.call(this,"__ee__")?s=this.__ee__:(s=k.value=b(null),g(this,"__ee__",k),k.value=null),s[e]?"object"==typeof s[e]?s[e].push(t):s[e]=[s[e],t]:s[e]=t,this},once:o,off:n=function(e,t){var s,a,o,n;if(h(t),!f.call(this,"__ee__"))return this;if(!(s=this.__ee__)[e])return this;if("object"==typeof(a=s[e]))for(n=0;o=a[n];++n)o!==t&&o.__eeOnceListener__!==t||(2===a.length?s[e]=a[n?0:1]:a.splice(n,1));else a!==t&&a.__eeOnceListener__!==t||delete s[e];return this},emit:i=function(e){var t,s,a,o,n;if(f.call(this,"__ee__")&&(o=this.__ee__[e]))if("object"==typeof o){for(s=arguments.length,n=new Array(s-1),t=1;t{var a=s(202);e.exports=function(e){if("function"!=typeof e)return!1;if(!hasOwnProperty.call(e,"length"))return!1;try{if("number"!=typeof e.length)return!1;if("function"!=typeof e.call)return!1;if("function"!=typeof e.apply)return!1}catch(e){return!1}return!a(e)}},181:(e,t,s)=>{var a=s(175),o={object:!0,function:!0,undefined:!0};e.exports=function(e){return!!a(e)&&hasOwnProperty.call(o,typeof e)}},873:(e,t,s)=>{var a=s(80),o=/^\s*class[\s{/}]/,n=Function.prototype.toString;e.exports=function(e){return!!a(e)&&!o.test(n.call(e))}},202:(e,t,s)=>{var a=s(181);e.exports=function(e){if(!a(e))return!1;try{return!!e.constructor&&e.constructor.prototype===e}catch(e){return!1}}},175:e=>{e.exports=function(e){return null!=e}}},t={};function s(a){var o=t[a];if(void 0!==o)return o.exports;var n=t[a]={exports:{}};return e[a](n,n.exports,s),n.exports}s.d=(e,t)=>{for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};s.r(a),s.d(a,{Reader:()=>j});var o=s(68);const n=(e,t)=>e?e[t]:void 0,i=(e,t,s,a)=>{let o;if("boolean"==typeof t[a])switch(a){case"annotations":case"bookmarks":o=t[a]?e[a]:t[a];break;default:o=t[a]}else o="arrows"===a?t[a]:void 0===n(s,a)?e[a]:t[a];return o},r=(e,t,s)=>{for(let a in e)"bookPath"!==a&&(t[a]instanceof Array?t[a]=s?e[a]?e[a]:t[a]:e[a]:t[a]instanceof Object?r(e[a],t[a],n(s,a)):t[a]=s?i(e,t,s,a):e[a])},d=()=>{let e=(new Date).getTime();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(t=>{let s=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===t?s:7&s|8).toString(16)}))};class l{constructor(){this.name="epubreader-js",this.version=1,this.db,this.indexedDB=window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.OIndexedDB||window.msIndexedDB,void 0===this.indexedDB&&console.error("The IndexedDB API not available in your browser.")}init(e){if(void 0===this.indexedDB)return void e();const t=Date.now(),s=e=>console.error("IndexedDB",e),a=indexedDB.open(this.name,this.version);a.onupgradeneeded=e=>{const t=e.target.result;!1===t.objectStoreNames.contains("entries")&&t.createObjectStore("entries")},a.onsuccess=a=>{this.db=a.target.result,this.db.onerror=s,e(),console.log(`storage.init: ${Date.now()-t} ms`)},a.onerror=s}get(e){if(void 0===this.db)return void e();const t=Date.now();this.db.transaction(["entries"],"readwrite").objectStore("entries").get(0).onsuccess=s=>{e(s.target.result),console.log(`storage.get: ${Date.now()-t} ms`)}}set(e,t){if(void 0===this.db)return void t();const s=Date.now();this.db.transaction(["entries"],"readwrite").objectStore("entries").put(e,0).onsuccess=()=>{t(),console.log(`storage.set: ${Date.now()-s} ms`)}}clear(){if(void 0===this.db)return;const e=Date.now();this.db.transaction(["entries"],"readwrite").objectStore("entries").clear().onsuccess=()=>{console.log(`storage.clear: ${Date.now()-e} ms`)}}}class c{constructor(e){this.language=e.settings.language||"en",this.values={en:{"toolbar/sidebar":"Sidebar","toolbar/prev":"Previous page","toolbar/next":"Next page","toolbar/openbook":"Open book","toolbar/openbook/error":"Your browser does not support the required features.\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.","toolbar/bookmark":"Add this page to bookmarks","toolbar/fullscreen":"Fullscreen","toolbar/background":"Change background","sidebar/close":"Close Sidebar","sidebar/contents":"Contents","sidebar/bookmarks":"Bookmarks","sidebar/bookmarks/add":"Add","sidebar/bookmarks/remove":"Remove","sidebar/bookmarks/clear":"Clear","sidebar/annotations":"Annotations","sidebar/annotations/add":"Add","sidebar/annotations/remove":"Remove","sidebar/annotations/clear":"Clear","sidebar/annotations/anchor":"Anchor","sidebar/annotations/cancel":"Cancel","sidebar/search":"Search","sidebar/search/placeholder":"Search","sidebar/settings":"Settings","sidebar/settings/language":"Language","sidebar/settings/fontsize":"Font size (%)","sidebar/settings/flow":"Flow","sidebar/settings/pagination":["Pagination","Generate pagination"],"sidebar/settings/spread":"Spread","sidebar/settings/spread/minwidth":"Minimum spread width","sidebar/metadata":"Metadata","sidebar/metadata/title":"Title","sidebar/metadata/creator":"Creator","sidebar/metadata/description":"Description","sidebar/metadata/pubdate":"Pubdate","sidebar/metadata/publisher":"Publisher","sidebar/metadata/identifier":"Identifier","sidebar/metadata/language":"Language","sidebar/metadata/rights":"Rights","sidebar/metadata/modified_date":"Modified date","sidebar/metadata/layout":"Layout","sidebar/metadata/flow":"Flow","sidebar/metadata/spread":"Spread","sidebar/metadata/direction":"Direction","notedlg/label":"Note","notedlg/add":"Add","status/fullscreen":"Fullscreen","status/":""},fr:{"toolbar/sidebar":"Barre latérale","toolbar/prev":"???","toolbar/next":"???","toolbar/openbook":"Ouvrir un livre local","toolbar/openbook/error":"Votre navigateur ne prend pas en charge les fonctions nécessaires.\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.","toolbar/bookmark":"Insérer un marque page ici","toolbar/fullscreen":"Plein écran","toolbar/background":"Changer l'arrière-plan","sidebar/close":"???","sidebar/contents":"Sommaire","sidebar/bookmarks":"Marque-pages","sidebar/bookmarks/add":"Ajouter","sidebar/bookmarks/remove":"Retirer","sidebar/bookmarks/clear":"Tout enlever","sidebar/annotations":"Annotations","sidebar/annotations/add":"Ajouter","sidebar/annotations/remove":"Retirer","sidebar/annotations/clear":"Tout enlever","sidebar/annotations/anchor":"Ancre","sidebar/annotations/cancel":"Annuler","sidebar/search":"Rechercher","sidebar/search/placeholder":"rechercher","sidebar/settings":"Réglages","sidebar/settings/language":"Langue","sidebar/settings/fontsize":"???","sidebar/settings/flow":"???","sidebar/settings/pagination":["Pagination","Établir une pagination"],"sidebar/settings/spread":"???","sidebar/settings/spread/minwidth":"???","sidebar/metadata":"???","sidebar/metadata/title":"???","sidebar/metadata/creator":"???","sidebar/metadata/description":"???","sidebar/metadata/pubdate":"???","sidebar/metadata/publisher":"???","sidebar/metadata/identifier":"???","sidebar/metadata/language":"Langue","sidebar/metadata/rights":"???","sidebar/metadata/modified_date":"???","sidebar/metadata/layout":"???","sidebar/metadata/flow":"???","sidebar/metadata/spread":"???","sidebar/metadata/direction":"???","notedlg/label":"???","notedlg/add":"Ajouter","status/fullscreen":"","status/":""},ja:{"toolbar/sidebar":"サイドバー","toolbar/prev":"???","toolbar/next":"???","toolbar/openbook":"本を開く","toolbar/openbook/error":"ご利用のブラウザは必要な機能をサポートしていません。\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。","toolbar/bookmark":"このページに栞を設定する","toolbar/fullscreen":"フルスクリーン","toolbar/background":"背景を変更する","sidebar/close":"???","sidebar/contents":"目次","sidebar/bookmarks":"栞","sidebar/bookmarks/add":"追加","sidebar/bookmarks/remove":"削除","sidebar/bookmarks/clear":"クリア","sidebar/annotations":"注釈","sidebar/annotations/add":"追加","sidebar/bookmarks/remove":"削除","sidebar/annotations/clear":"クリア","sidebar/annotations/anchor":"アンカー","sidebar/annotations/cancel":"キャンセル","sidebar/search":"検索","sidebar/search/placeholder":"検索","sidebar/settings":"設定","sidebar/settings/language":"表示言語","sidebar/settings/fontsize":"???","sidebar/settings/flow":"???","sidebar/settings/pagination":["ページネーション","ページネーションを生成します。"],"sidebar/settings/spread":"???","sidebar/settings/spread/minwidth":"???","sidebar/metadata":"???","sidebar/metadata/title":"???","sidebar/metadata/creator":"???","sidebar/metadata/description":"???","sidebar/metadata/pubdate":"???","sidebar/metadata/publisher":"???","sidebar/metadata/identifier":"???","sidebar/metadata/language":"表示言語","sidebar/metadata/rights":"???","sidebar/metadata/modified_date":"???","sidebar/metadata/layout":"???","sidebar/metadata/flow":"???","sidebar/metadata/spread":"???","sidebar/metadata/direction":"???","notedlg/label":"???","notedlg/add":"追加","status/fullscreen":"","status/":""},ru:{"toolbar/sidebar":"Боковая панель","toolbar/prev":"Предыдущая страница","toolbar/next":"Следущая страница","toolbar/openbook":"Открыть книгу","toolbar/openbook/error":"Ваш браузер не поддерживает необходимые функции.\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.","toolbar/bookmark":"Добавить эту страницу в закладки","toolbar/fullscreen":"Полноэкранный режим","toolbar/background":"изменить фон","sidebar/close":"Закрыть боковую панель","sidebar/contents":"Содержание","sidebar/bookmarks":"Закладки","sidebar/bookmarks/add":"Добавить","sidebar/bookmarks/remove":"Удалить","sidebar/bookmarks/clear":"Очистить","sidebar/annotations":"Аннотации","sidebar/annotations/add":"Добавить","sidebar/annotations/remove":"Удалить","sidebar/annotations/clear":"Очистить","sidebar/annotations/anchor":"Метка","sidebar/annotations/cancel":"Отмена","sidebar/search":"Поиск","sidebar/search/placeholder":"Поиск","sidebar/settings":"Настройки","sidebar/settings/language":"Язык","sidebar/settings/fontsize":"Размер шрифта","sidebar/settings/flow":"Поток","sidebar/settings/pagination":["Нумерация страниц","Генерировать нумерацию страниц"],"sidebar/settings/spread":"Разворот","sidebar/settings/spread/minwidth":"Мин. ширина колонки","sidebar/metadata":"Метаданные","sidebar/metadata/title":"Заголовок","sidebar/metadata/creator":"Автор","sidebar/metadata/description":"Описание","sidebar/metadata/pubdate":"Дата публикации","sidebar/metadata/publisher":"Издатель","sidebar/metadata/identifier":"Идентификатор","sidebar/metadata/language":"Язык","sidebar/metadata/rights":"Лицензия","sidebar/metadata/modified_date":"Дата изменения","sidebar/metadata/layout":"Макет","sidebar/metadata/flow":"Поток","sidebar/metadata/spread":"Разворот","sidebar/metadata/direction":"Направление","notedlg/label":"Заметка","notedlg/add":"Добавить","status/fullscreen":"","status/":""},vi:{"toolbar/sidebar":"Thanh bên","toolbar/prev":"Trang trước","toolbar/next":"Trang kế tiếp","toolbar/openbook":"Mở sách","toolbar/openbook/error":"Trình duyệt của bạn không hỗ trợ các tính năng cần thiết. Vui lòng sử dụng trình duyệt hiện đại như Google Chrome hoặc Mozilla Firefox.","toolbar/bookmark":"Thêm trang này vào dấu trang","toolbar/fullscreen":"Toàn màn hình","toolbar/background":"Đổi màu nền","sidebar/close":"Đóng thanh bên","sidebar/contents":"Nội dung","sidebar/bookmarks":"Dấu trang","sidebar/bookmarks/add":"Thêm dấu trang","sidebar/bookmarks/remove":"Xóa dấu trang","sidebar/bookmarks/clear":"???","sidebar/annotations":"Chú thích","sidebar/annotations/add":"Thêm chú thích","sidebar/annotations/remove":"Xóa chú thích","sidebar/annotations/clear":"???","sidebar/annotations/anchor":"???","sidebar/annotations/cancel":"???","sidebar/search":"Tìm kiếm","sidebar/search/placeholder":"???","sidebar/settings":"Cài đặt","sidebar/settings/language":"Ngôn ngữ","sidebar/settings/fontsize":"Cỡ chữ (%)","sidebar/settings/flow":"???","sidebar/settings/pagination":["???","???"],"sidebar/settings/spread":"???","sidebar/settings/spread/minwidth":"????","sidebar/metadata":"Metadata","sidebar/metadata/title":"Chủ đề","sidebar/metadata/creator":"Người sáng tạo","sidebar/metadata/description":"Mô tả","sidebar/metadata/pubdate":"Ngày tạo","sidebar/metadata/publisher":"Nhà xuất bản","sidebar/metadata/identifier":"Định dạng","sidebar/metadata/language":"Ngôn ngữ","sidebar/metadata/rights":"Quyền","sidebar/metadata/modified_date":"Ngày sửa đổi","sidebar/metadata/layout":"???","sidebar/metadata/flow":"???","sidebar/metadata/spread":"???","sidebar/metadata/direction":"???","notedlg/label":"???","notedlg/add":"???","status/fullscreen":"Toàn màn hình","status/":""}},e.on("languagechanged",(e=>{this.language=e}))}get(e){return this.values[this.language][e]||"???"}}const h="is not an instance of UIElement.";class m{constructor(e){this.dom=document.createElement(e)}add(){for(let e=0;e{e.stopPropagation()},this.setValue(t),this.setTitle(s)}getName(){return this.dom.name}setName(e){return this.dom.name=e,this}getType(){return this.dom.type}setType(e){return this.dom.type=e,this}getValue(){return this.dom.value}setValue(e){return this.dom.value!==e&&void 0!==e&&(this.dom.value=e),this}}class x extends m{constructor(e,t,s,a,o){super("input"),this.dom.type="number",this.dom.step=t||1,this.dom.onkeydown=e=>{e.stopPropagation()},this.value=e||0,this.min=s||-1/0,this.max=a||1/0,this.precision=o||0,this.setValue(e),this.dom.onchange=e=>{this.setValue(this.value)}}getName(){return this.dom.name}setName(e){return this.dom.name=e,this}setPrecision(e){return this.precision=e,this.setValue(this.value),this}setRange(e,t){return this.min=e,this.max=t,this.dom.min=e,this.dom.max=t,this}setStep(e){return this.dom.step=e,this}getValue(){return parseFloat(this.dom.value)}setValue(e){return void 0!==e&&((e=parseFloat(e))this.max&&(e=this.max),this.value=e,this.dom.value=e.toFixed(this.precision)),this}}class C extends b{constructor(e){super(),this.align=e||"horizontal",this.tabs=[],this.panels=[],this.selector=(new u).setClass("tab-selector"),this.menuDiv=(new b).setClass("menu"),this.tabsDiv=(new b).setClass("tabs"),this.tabsDiv.add(this.selector),this.panelsDiv=(new b).setClass("panels"),this.selected="",this.add(this.menuDiv),this.add(this.tabsDiv),this.add(this.panelsDiv)}addMenu(e){this.menuDiv.add(e)}addTab(e,t,s){const a=new S(t,this);a.setId(e),a.setClass("box"),this.tabs.push(a),this.tabsDiv.add(a);const o=new b;o.setId(e),o.add(s),this.panels.push(o),this.panelsDiv.add(o),this.select(e)}select(e){for(let t of this.tabs)t.dom.id===e?(t.addClass("selected"),this.transformSelector(t)):t.dom.id===this.selected&&t.removeClass("selected");for(let t of this.panels)t.dom.id===e?t.dom.style.display="block":t.dom.id===this.selected&&(t.dom.style.display="none");return this.selected=e,this}setLabel(e,t){for(let s of this.tabs)if(s.dom.id===e){s.setTitle(t);break}}transformSelector(e){let t;const s=e.getBoundingClientRect();"horizontal"===this.align?(t=s.width*this.tabs.indexOf(e),this.selector.dom.style.transform=`translateX(${t}px)`):(t=s.height*this.tabs.indexOf(e),this.selector.dom.style.transform=`translateY(${t}px)`)}}class S extends b{constructor(e,t){super(),this.button=new y("button"),this.button.dom.title=e,this.dom.onclick=e=>{t.select(this.dom.id),e.preventDefault()},this.add(this.button)}}class I extends m{constructor(e){super("ul"),this.parent=e&&e.parent,this.expanded=!1}expand(){return this.expanded=!0,this.dom.style.display="block",this.parent&&this.parent.expand(),this}collaps(){return this.expanded=!1,this.dom.style.display="none",this}}class T extends m{constructor(e){super("li"),this.parent=e,this.selected=!1}add(){let e=0;const t=(new b).setId("item-box");for(let s=0;s{const e=o.getValue();0===e.length?this.items.clear():a!==e&&(this.items.clear(),this.doSearch(e).then((e=>{e.forEach((e=>{this.set(e)}))}))),a=e},this.setId("search"),this.items=new I,t.add(this.items),this.add([new D(o),t]),this.reader=e,this.selector=void 0}async doSearch(e){const t=this.reader.book,s=await Promise.all(t.spine.spineItems.map((s=>s.load(t.load.bind(t)).then(s.find.bind(s,e)).finally(s.unload.bind(s)))));return await Promise.resolve([].concat.apply([],s))}set(e){const t=new k("#"+e.cfi,e.excerpt),s=new T;t.dom.onclick=()=>(this.selector&&this.selector!==s&&this.selector.unselect(),s.select(),this.selector=s,this.reader.rendition.display(e.cfi),!1),s.add(t),this.items.add(s)}}class M{constructor(e){const t=e.strings,s=e.settings,a=(new b).setId("toolbar"),o=["toolbar/sidebar","toolbar/prev","toolbar/next","toolbar/openbook","toolbar/openbook/error","toolbar/bookmark","toolbar/fullscreen","toolbar/background","toolbar/search","toolbar/close"],n=(new b).setClass("menu-1"),i=(new b).setId("btn-m").setClass("box"),r=new y("button");let d,l,c,h;r.dom.title=t.get(o[0]),r.dom.onclick=t=>{e.emit("sidebaropener",!0),r.dom.blur(),t.preventDefault()},i.add(r),n.add(i),"toolbar"===s.arrows&&(d=(new b).setId("btn-p").setClass("box"),l=new y("button"),l.setTitle(t.get(o[1])),l.dom.onclick=t=>{e.emit("prev"),t.preventDefault(),l.dom.blur()},d.add(l),n.add(d),c=(new b).setId("btn-n").setClass("box"),h=new y("button"),h.dom.title=t.get(o[2]),h.dom.onclick=t=>{e.emit("next"),t.preventDefault(),h.dom.blur()},c.add(h),n.add(c));const m=(new b).setId("btn-logo").setClass("logo"),g=(new k).setId("logo-link").setHref("#").setTextContent("LOGO");let p,w,x,C,S,I;function T(){let t=document.getElementById("toolbar-bookmarks-list");if(!t)return;t.innerHTML="";let s=document.createElement("h3");s.textContent="Bookmarks của tui",t.appendChild(s),e.settings.bookmarks.forEach(((s,a)=>{let o=document.createElement("li"),n=document.createElement("a"),i=document.createElement("span");n.href="#",n.textContent=`Bookmark ${a+1}`,n.onclick=t=>{t.preventDefault(),document.querySelectorAll("#toolbar-bookmarks-list li a").forEach((e=>{e.classList.remove("active")})),n.classList.add("active"),e.rendition.display(s)},i.innerHTML='',i.onclick=t=>{t.stopPropagation(),e.removeBookmarkFromToolbar(s)},o.appendChild(n),o.appendChild(i),t.appendChild(o)}))}m.add(g),n.add(m),p=(new b).setId("btn-t").setClass("box"),w=new y("button"),w.dom.onclick=t=>{t.stopPropagation(),e.book.loaded.navigation.then((t=>{!function(t){let s=document.getElementById("toolbar-toc-list");if(s)s.remove();else{let s=document.createElement("ul");s.setAttribute("id","toolbar-toc-list");let a=document.createElement("h3");a.textContent="Mục lục",s.appendChild(a),t.forEach((t=>{let a=document.createElement("li"),o=document.createElement("a");o.href="#",o.textContent=t.label,o.onclick=s=>{s.preventDefault(),document.querySelectorAll("#toolbar-toc-list li a").forEach((e=>{e.classList.remove("active")})),o.classList.add("active"),e.rendition.display(t.href)},a.appendChild(o),s.appendChild(a)})),p.dom.appendChild(s)}document.getElementById("toolbar-toc-list").classList.toggle("active")}(t)}))},p.add(w),n.add(p),x=(new b).setId("btn-d").setClass("box"),C=new y("button"),C.dom.onclick=e=>{e.stopPropagation(),function(){let e=document.getElementById("toolbar-bookmarks-list");e||(e=document.createElement("ul"),e.setAttribute("id","toolbar-bookmarks-list"),V.dom.appendChild(e)),T(),e.classList.toggle("active")}()},x.add(C),n.add(x),e.on("bookmarked",((e,t)=>{T()})),e.removeBookmarkFromToolbar=function(t){let s=document.getElementById("toolbar-bookmarks-list");if(!s)return;let a=s.querySelectorAll("li"),o=Array.from(a).find((e=>e.querySelector("a").textContent.includes(t)));o&&o.remove();const n=e.settings.bookmarks.indexOf(t);-1!==n&&e.settings.bookmarks.splice(n,1),e.emit("bookmarked",!1,t),e.bookmarksPanel.removeBookmark(t)},S=(new b).setId("btn-a").setClass("box"),I=new y("button"),I.dom.onclick=t=>{t.stopPropagation(),function(){if(!document.getElementById("toolbar-annotations-list")){let t=document.createElement("ul");t.setAttribute("id","toolbar-annotations-list");let s=document.createElement("h3");s.textContent="Highlights & Ghi chú",t.appendChild(s),e.settings.annotations.forEach((s=>{let a=document.createElement("li"),o=document.createElement("a"),n=document.createElement("span");o.href="#",o.textContent=s.text,o.onclick=t=>{t.preventDefault(),document.querySelectorAll("#toolbar-annotations-list li a").forEach((e=>{e.classList.remove("active")})),o.classList.add("active"),e.rendition.display(s.cfi)},n.innerHTML='',n.onclick=t=>{t.stopPropagation(),e.removeNoteFromToolbar(s)},a.appendChild(o),a.appendChild(n),t.appendChild(a)})),S.dom.appendChild(t)}document.getElementById("toolbar-annotations-list").classList.toggle("active")}()},S.add(I),n.add(S),e.removeNoteFromToolbar=function(t){let s=document.getElementById("toolbar-annotations-list");if(!s)return;let a=s.querySelectorAll("li"),o=Array.from(a).find((e=>{e.querySelector("a").textContent,t.text}));o&&o.remove();const n=e.annotationsPanel;n&&(n.removeNote(t),n.update());const i=e.settings.annotations.findIndex((e=>e.cfi===t.cfi));-1!==i&&e.settings.annotations.splice(i,1),e.rendition.annotations.remove(t.cfi,"highlight")};const D=(new b).setClass("menu-center"),M=(new f).setClass("toolbar-center-label");M.setTextContent("Determined");const A=(new b).setClass("page-map"),B=(new u).setClass("current-page-index").setTextContent("1"),L=(new v).setTextContent(" của "),z=(new u).setClass("total-pages").setTextContent("200");A.add(B),A.add(L),A.add(z),D.add(M),D.add(A);const O=(new b).setClass("menu-2");let _,R;s.background&&(_=(new b).setId("btn-bg").setClass("box"),R=new y("color").setClass("color-picker"),R.dom.title=t.get(o[7]),R.dom.oninput=t=>{const s=t.target.value;e.emit("colorchanged",s)},_.add(R),O.add(_));let F,P,j,V,N,H,q,$,U=(new f).setClass("font-size-px").setTextContent("Fontsize (px):"),G=(new b).setId("btn-fontsize").setClass("box"),K=new y("button").setClass("btn-font-decrease"),W=new y("button").setClass("btn-font-increase"),J=new y("text").setClass("input-font-size"),X=s.fontSize||16;if(J.dom.value=X,K.dom.textContent="-",K.dom.onclick=()=>{X=Math.max(8,X-1),J.dom.value=X,e.emit("styleschanged",{fontSize:X})},W.dom.textContent="+",W.dom.onclick=()=>{X=Math.min(72,X+1),J.dom.value=X,e.emit("styleschanged",{fontSize:X})},J.dom.onchange=()=>{let t=parseInt(J.dom.value,10);!isNaN(t)&&t>=8&&t<=72?(X=t,e.emit("styleschanged",{fontSize:X})):J.dom.value=X},G.add(U),G.add(K),G.add(J),G.add(W),O.add(G),s.openbook){const s=t=>{e.storage.clear(),e.storage.set(t.target.result,(()=>{e.unload(),e.init(t.target.result);const s=new URL(window.location.origin);window.history.pushState({},"",s)}))},a=e=>{console.error(e)},n=(new b).setId("btn-o").setClass("box");F=new y("file"),F.dom.title=t.get(o[3]),F.dom.accept="application/epub+zip",F.dom.onchange=e=>{if(0!==e.target.files.length)if(window.FileReader){const t=new FileReader;t.onload=s,t.readAsArrayBuffer(e.target.files[0]),t.onerror=a}else alert(t.get(o[4]))},F.dom.onclick=e=>{F.dom.blur()},n.add(F),O.add(n)}if(P=(new b).setId("btn-s").setClass("box"),j=new y("button"),j.setTitle(t.get(o[8])),j.dom.onclick=t=>{t.stopPropagation(),function(){if(!document.getElementById("toolbar-search-list")){let t=document.createElement("div");t.setAttribute("id","toolbar-search-list"),t.classList.add("search-popup");let s=document.createElement("div");s.classList.add("search-container");let a=document.createElement("span");a.classList.add("search-icon"),a.innerHTML='';let o=document.createElement("input");o.setAttribute("type","search"),o.setAttribute("placeholder","Search"),o.setAttribute("id","nav-q"),o.setAttribute("class","toolbar-search-input"),s.appendChild(a),s.appendChild(o);let n=document.createElement("ul");n.setAttribute("id","toolbar-search-results");let i=new E(e);o.oninput=async()=>{let e=o.value.trim();if(e.length>0){let t=await i.doSearch(e);if(n.innerHTML="",0===t.length){let e=document.createElement("li");e.innerText="Không tìm thấy kết quả trùng khớp",e.style.color="gray",e.style.padding="8px",n.appendChild(e)}t.forEach((e=>{let t=document.createElement("li"),s=document.createElement("a");s.href="#"+e.cfi,s.textContent=e.excerpt,s.onclick=t=>{t.preventDefault(),i.reader.rendition.display(e.cfi)},t.appendChild(s),n.appendChild(t)}))}else n.innerHTML=""},t.appendChild(s),t.appendChild(n),P.dom.appendChild(t)}document.getElementById("toolbar-search-list").classList.toggle("active")}()},P.add(j),O.add(P),s.bookmarks&&(V=(new b).setId("btn-b").setClass("box"),N=new y("button"),N.setTitle(t.get(o[5])),N.dom.onclick=t=>{const s=this.locationCfi,a=-1===e.isBookmarked(s);e.emit("bookmarked",a),t.preventDefault(),N.dom.blur()},V.add(N),O.add(V)),s.fullscreen){const e=(new b).setId("btn-f").setClass("box");H=new y("button"),H.setTitle(t.get(o[6])),H.dom.onclick=e=>{this.toggleFullScreen(),e.preventDefault()},document.onkeydown=e=>{"F11"===e.key&&(e.preventDefault(),this.toggleFullScreen())},document.onfullscreenchange=t=>{const s=window.screen.width===t.target.clientWidth,a=window.screen.height===t.target.clientHeight;s&&a?e.addClass("resize-small"):e.removeClass("resize-small")},e.add(H),O.add(e)}a.add([n,D,O]),document.body.appendChild(a.dom),q=(new b).setId("btn-close").setClass("box"),$=new y("button").setClass("active"),$.setTitle(t.get(o[9])),q.add($),O.add(q),e.on("relocated",(t=>{if(s.bookmarks){const s=t.start.cfi;-1===e.isBookmarked(s)?V.removeClass("bookmarked"):V.addClass("bookmarked"),this.locationCfi=s}"toolbar"===s.arrows&&(d.dom.style.display=t.atStart?"none":"block",c.dom.style.display=t.atEnd?"none":"block")})),e.on("bookmarked",(e=>{e?V.addClass("bookmarked"):V.removeClass("bookmarked")})),e.on("languagechanged",(e=>{r.setTitle(t.get(o[0])),"toolbar"===s.arrows&&(l.setTitle(t.get(o[1])),h.setTitle(t.get(o[2]))),s.openbook&&F.setTitle(t.get(o[3])),s.bookmarks&&N.setTitle(t.get(o[5])),s.fullscreen&&H.setTitle(t.get(o[6])),s.background&&backgroundBtn.setTitle(t.get(o[7]))}))}toggleFullScreen(){document.activeElement.blur(),null===document.fullscreenElement?document.documentElement.requestFullscreen():document.exitFullscreen&&document.exitFullscreen()}}class A{constructor(e){const t=e.settings,s=(new b).setId("content");let a;if("content"===t.arrows){a=(new b).setId("prev").setClass("arrow"),a.dom.onclick=t=>{e.emit("prev"),t.preventDefault()};const t=new u;t.dom.innerHTML='',a.add(t),s.add(a)}const o=(new b).setId("viewer");let n;if(s.add(o),e.on("colorchanged",(e=>{o.dom.style.backgroundColor=e})),"content"===t.arrows){n=(new b).setId("next").setClass("arrow"),n.dom.onclick=t=>{e.emit("next"),t.preventDefault()};const t=new u;t.dom.innerHTML='',n.add(t),s.add(n)}const i=(new b).setId("loader"),r=(new b).setId("divider"),d=(new b).setId("overlay");d.dom.onclick=t=>{e.emit("sidebaropener",!1),t.preventDefault()},s.add([i,r,d]),document.body.appendChild(s.dom),e.on("bookready",(e=>{o.setClass(e.flow),i.dom.style.display="block"})),e.on("bookloaded",(()=>{i.dom.style.display="none"})),e.on("layout",(e=>{e.spread&&e.width>e.spreadWidth?r.dom.style.display="block":r.dom.style.display="none"})),e.on("flowchanged",(e=>{o.setClass(e)})),e.on("relocated",(e=>{"content"===t.arrows&&(e.atStart?a.addClass("disabled"):a.removeClass("disabled"),e.atEnd?n.addClass("disabled"):n.removeClass("disabled"))})),e.on("prev",(()=>{"content"===t.arrows&&(a.addClass("active"),setTimeout((()=>{a.removeClass("active")}),100))})),e.on("next",(()=>{"content"===t.arrows&&(n.addClass("active"),setTimeout((()=>{n.removeClass("active")}),100))})),e.on("sidebaropener",(e=>{d.dom.style.display=e?"block":"none"})),e.on("viewercleanup",(()=>{o.clear()}))}}class B extends p{constructor(e){super();const t=(new b).setClass("list-container"),s=e.strings,a=["sidebar/contents"],o=new v(s.get(a[0])).setClass("label");this.reader=e,this.selector=void 0,this.setId("contents"),this.add(new D(o).addClass("header")),e.on("bookready",(()=>{e.book.loaded.navigation.then((e=>{t.clear(),t.add(this.generateToc(e)),this.add(t),console.log(e)}))})),e.on("languagechanged",(e=>{o.setValue(s.get(a[0]))}))}generateToc(e,t){const s=new I(t);return e.forEach((e=>{const t=new k(e.href,e.label),a=new T(s).setId(e.id),o=new u;if(t.dom.onclick=t=>{this.selector&&this.selector!==a&&this.selector.unselect(),a.select(),this.selector=a,this.reader.settings.sectionId=e.id,this.reader.rendition.display(e.href),t.preventDefault()},a.add([o,t]),this.reader.navItems[e.href]={id:e.id,label:e.label},this.reader.settings.sectionId===e.id&&(s.expand(),a.select(),this.selector=a),e.subitems&&e.subitems.length>0){const t=this.generateToc(e.subitems,a);o.setClass("toggle-collapsed"),o.dom.onclick=()=>(t.expanded?(t.collaps(),o.setClass("toggle-collapsed")):(t.expand(),o.setClass("toggle-expanded")),!1),a.add(t)}s.add(a)})),s}}class L extends p{constructor(e){super();const t=(new b).setClass("list-container"),s=e.strings,a=["sidebar/bookmarks","sidebar/bookmarks/clear"],o=new v(s.get(a[0])).setClass("label"),n=new y("button",s.get(a[1]));n.dom.onclick=t=>{this.clearBookmarks(),e.emit("bookmarked",!1),t.preventDefault()},this.add(new D([o,n]).addClass("header")),this.selector=void 0,this.bookmarks=new I,t.add(this.bookmarks),this.setId("bookmarks"),this.add(t),this.reader=e;const i=()=>{n.dom.disabled=0===e.settings.bookmarks.length};e.on("displayed",((e,t)=>{t.bookmarks.forEach((e=>{this.setBookmark(e)})),i()})),e.on("relocated",(e=>{this.locationCfi=e.start.cfi})),e.on("bookmarked",((e,t)=>{e?this.appendBookmark():this.removeBookmark(t),i()})),e.on("languagechanged",(e=>{o.setValue(s.get(a[0])),n.setValue(s.get(a[1]))}))}appendBookmark(){const e=this.locationCfi;this.reader.isBookmarked(e)>-1||(this.setBookmark(e),this.reader.settings.bookmarks.push(e))}removeBookmark(e){const t=e||this.locationCfi,s=this.reader.isBookmarked(t);-1!==s&&(this.bookmarks.remove(s),this.reader.settings.bookmarks.splice(s,1))}clearBookmarks(){this.bookmarks.clear(),this.reader.settings.bookmarks=[]}setBookmark(e){const t=new k,s=new T,a=(new u).setClass("btn-remove"),o=this.reader.navItemFromCfi(e);let n,i;if(void 0===o){const t=this.reader.book.spine.get(e);n=t.idref,i=t.idref}else n=o.id,i=o.label;t.setHref("#"+e),t.dom.onclick=t=>{this.selector&&this.selector!==s&&this.selector.unselect(),s.select(),this.selector=s,this.reader.rendition.display(e),t.preventDefault()},t.setTextContent(i),a.dom.onclick=t=>{this.reader.emit("bookmarked",!1,e),t.preventDefault()},s.add([t,a]),s.setId(n),this.bookmarks.add(s)}}class z extends p{constructor(e){super();const t=(new b).setClass("list-container"),s=e.strings,a=["sidebar/annotations","sidebar/annotations/clear"],o=new v(s.get(a[0])).setClass("label"),n=new y("button",s.get(a[1]));n.dom.onclick=e=>{this.clearNotes(),e.preventDefault()},this.add(new D([o,n]).addClass("header")),this.selector=void 0,this.notes=new I,t.add(this.notes),this.setId("annotations"),this.add(t),this.reader=e,this.update=()=>{n.dom.disabled=0===e.settings.annotations.length},e.on("navigation",(e=>{e.annotations.forEach((e=>{this.set(e)})),this.update()})),e.on("noteadded",(e=>{this.set(e),this.update()})),e.on("languagechanged",(e=>{o.setValue(s.get(a[0])),n.setValue(s.get(a[1]))}))}set(e){const t=new k("#"+e.cfi,e.text),s=(new T).setId("note-"+e.uuid),a=(new u).setClass("btn-remove");t.dom.onclick=t=>{this.selector&&this.selector!==s&&this.selector.unselect(),s.select(),this.selector=s,this.reader.rendition.display(e.cfi),t.preventDefault()},a.dom.onclick=t=>{this.removeNote(e),t.preventDefault()},s.add([t,a]),this.notes.add(s),this.reader.rendition.annotations.add("highlight",e.cfi,{},(()=>{}),"note-highlight",{}),this.update();const o=document.getElementById("toolbar-annotations-list");if(o){const t=document.createElement("li"),s=document.createElement("a");s.href="#",s.textContent=e.text,s.onclick=t=>{t.preventDefault(),this.reader.rendition.display(e.cfi)},t.appendChild(s);const a=document.createElement("span");a.innerHTML='',a.onclick=t=>{t.stopPropagation(),this.reader.removeNoteFromToolbar(e)},t.appendChild(a),o.appendChild(t)}}removeNote(e){const t=this.reader.settings.annotations.indexOf(e);if(-1===t)return;this.notes.remove(t),this.reader.settings.annotations.splice(t,1),this.reader.rendition.annotations.remove(e.cfi,"highlight"),this.update();const s=document.getElementById("toolbar-annotations-list");s&&s.querySelectorAll("li").forEach((t=>{t.querySelector("a").textContent===e.text&&t.remove()}))}clearNotes(){this.reader.settings.annotations.forEach((e=>{this.reader.rendition.annotations.remove(e.cfi,"highlight")})),this.notes.clear(),this.reader.settings.annotations=[],this.update()}}class O extends p{constructor(e){super(),super.setId("settings");const t=e.strings,s=["sidebar/settings","sidebar/settings/language","sidebar/settings/fontsize","sidebar/settings/flow","sidebar/settings/spread","sidebar/settings/spread/minwidth"],a=new v(t.get(s[0])).setClass("label");this.add(new D(a).addClass("header"));const o=new f(t.get(s[1]),"language-ui"),n=new g,i=(new w).setOptions({en:"English",fr:"French",ja:"Japanese",ru:"Russian",vi:"Vietnamese"});i.dom.onchange=t=>{e.emit("languagechanged",t.target.value)},i.setId("language-ui"),n.add(o),n.add(i);const r=new f(t.get(s[2]),"fontsize"),d=new g,l=new x(16,1);l.dom.onchange=t=>{const s=parseInt(t.target.value);s>=8&&s<=72&&e.emit("styleschanged",{fontSize:s})},l.setId("fontsize"),d.add(r),d.add(l),l.dom.disabled=!0;const c=new f(t.get(s[3]),"flow"),h=new g,m=(new w).setOptions({paginated:"Paginated",scrolled:"Scrolled"});m.dom.onchange=t=>{e.emit("flowchanged",t.target.value),"scrolled"===t.target.value?e.emit("spreadchanged",{mod:"none",min:void 0}):e.emit("spreadchanged",{mod:void 0,min:void 0})},m.setId("flow"),h.add(c),h.add(m);const u=new x(800,1),b=new f(t.get(s[4]),"spread"),p=new g,k=(new w).setOptions({none:"None",auto:"Auto"});k.dom.onchange=t=>{e.emit("spreadchanged",{mod:t.target.value,min:void 0}),u.dom.disabled="none"===t.target.value},k.setId("spread"),p.add(b),p.add(k);const C=new f(t.get(s[5]),"min-spread-width"),S=new g;u.dom.onchange=t=>{e.emit("spreadchanged",{mod:void 0,min:parseInt(t.target.value)})},u.setId("min-spread-width"),S.add(C),S.add(u);const I=t.get("sidebar/settings/pagination"),T=new g,E=new y("checkbox",!1,I[1]);E.setId("pagination"),E.dom.onclick=e=>{},T.add(new f(I[0],"pagination")),T.add(E),this.add(new D([n,d,h,p,S])),e.on("bookready",(e=>{i.setValue(e.language),l.setValue(e.styles.fontSize),m.setValue(e.flow),k.setValue(e.spread.mod),u.setValue(e.spread.min),u.dom.disabled="none"===e.spread.mod})),e.on("layout",(e=>{"scrolled"===e.flow?(k.setValue("none"),k.dom.disabled=!0,u.dom.disabled=!0):k.dom.disabled=!1})),e.on("languagechanged",(e=>{a.setTextContent(t.get(s[0])),o.setTextContent(t.get(s[1])),r.setTextContent(t.get(s[2])),c.setTextContent(t.get(s[3])),b.setTextContent(t.get(s[4])),C.setTextContent(t.get(s[5]))}))}}class _ extends p{constructor(e){super();const t=(new b).setClass("list-container"),s=e.strings,a={},o="sidebar/metadata",n=new v(s.get(o)).setClass("label");this.add(new D(n).addClass("header")),a[o]=n,this.items=new I,this.setId("metadata"),this.add(t);const i=(e,t)=>{if(void 0===t[e]||null===t[e]||"string"==typeof t[e]&&0===t[e].length)return;const n=new T,i=(new v).setClass("label"),r=(new v).setClass("value");i.setValue(s.get(o+"/"+e).toUpperCase()),"description"===e?r.dom.innerHTML=t[e]:r.setValue(t[e]),a[o+"/"+e]=i,n.add([i,r]),this.items.add(n)};e.on("metadata",(e=>{this.items.clear(),t.clear(),t.add(this.items),document.title=e.title;for(const t in e)i(t,e)})),e.on("languagechanged",(e=>{for(const e in a){let t;t=e===o?s.get(e):s.get(e).toUpperCase(),a[e].setValue(t)}}))}}class R{constructor(e){const t=e.strings,s=e.settings,a=["sidebar/close","sidebar/contents","sidebar/bookmarks","sidebar/annotations","sidebar/search","sidebar/settings","sidebar/metadata"],o=new C("vertical").setId("sidebar"),n=(new b).setId("btn-p").addClass("box"),i=new y("button");if(i.setTitle(t.get(a[0])),i.dom.onclick=t=>{e.emit("sidebaropener",!1),t.preventDefault(),i.dom.blur()},n.add(i),o.addMenu(n),o.addTab("btn-t",t.get(a[1]),new B(e)),s.bookmarks){const s=new L(e);o.addTab("btn-d",t.get(a[2]),s),e.bookmarksPanel=s}if(s.annotations){const s=new z(e);o.addTab("btn-a",t.get(a[3]),s),e.annotationsPanel=s}o.addTab("btn-s",t.get(a[4]),new E(e)),o.addTab("btn-c",t.get(a[5]),new O(e)),o.addTab("btn-i",t.get(a[6]),new _(e)),o.select("btn-t"),document.body.appendChild(o.dom),e.on("sidebaropener",(e=>{e?o.setClass("open"):o.removeAttribute("class")})),e.on("languagechanged",(e=>{i.setTitle(t.get(a[0])),o.setLabel("btn-t",t.get(a[1])),s.bookmarks&&o.setLabel("btn-d",t.get(a[2])),s.annotations&&o.setLabel("btn-a",t.get(a[3])),o.setLabel("btn-s",t.get(a[4])),o.setLabel("btn-c",t.get(a[5])),o.setLabel("btn-i",t.get(a[6]))}))}}class F{constructor(e){const t=(new b).setId("notedlg"),s=e.strings,a=["notedlg/label","notedlg/add"],o=new f(s.get(a[0]),"note-input"),n=new y("text","").setId("note-input");n.dom.oninput=e=>{this.update(),e.preventDefault()};const i=new y("button",s.get(a[1]));i.dom.disabled=!0,i.dom.onclick=s=>{const a={cfi:this.cfi,date:new Date,text:n.getValue(),uuid:d()};this.range=void 0,e.settings.annotations.push(a),e.emit("noteadded",a),t.removeAttribute("class"),s.preventDefault(),i.dom.blur()},this.update=()=>{i.dom.disabled=!(this.range&&n.getValue().length>0)},t.add(new D([o,n,i]).addClass("control")),document.body.appendChild(t.dom),e.on("selected",((e,s)=>{this.cfi=e,this.range=s.range(e),this.update(),t.setClass("open"),n.setValue("")})),e.on("unselected",(()=>{this.range=void 0,this.update(),t.removeAttribute("class")})),e.on("languagechanged",(e=>{o.setTextContent(s.get(a[0])),i.setValue(s.get(a[1]))}))}}class P{constructor(e){const t=e.strings,s=e.settings,a=(new b).setId("status-bar"),o=["status/fullscreen","status/apprec"],n=(new b).setClass("status-title"),i=(new b).setClass("status-action");let r,d=(new f).setClass("status-text").setTextContent("Trang cuối của chương");n.add(d);const l=(new b).setId("btn-ar").setClass("box");let c;if(r=new y("button"),r.setTitle(t.get(o[1])),r.dom.onclick=e=>{e.preventDefault(),function(){const e=[{title:"Determined",author:"Robert M. Sapolsky",page:1},{title:"Determined",author:"Robert M. Sapolsky",page:2},{title:"Determined",author:"Robert M. Sapolsky",page:3},{title:"Determined",author:"Robert M. Sapolsky",page:4},{title:"Determined",author:"Robert M. Sapolsky",page:5},{title:"Determined",author:"Robert M. Sapolsky",page:6},{title:"Determined",author:"Robert M. Sapolsky",page:7},{title:"Determined",author:"Robert M. Sapolsky",page:8},{title:"Determined",author:"Robert M. Sapolsky",page:9},{title:"Determined",author:"Robert M. Sapolsky",page:10},{title:"Determined",author:"Robert M. Sapolsky",page:11},{title:"Determined",author:"Robert M. Sapolsky",page:12},{title:"Determined",author:"Robert M. Sapolsky",page:13},{title:"Determined",author:"Robert M. Sapolsky",page:14},{title:"Determined",author:"Robert M. Sapolsky",page:15},{title:"Determined",author:"Robert M. Sapolsky",page:16},{title:"Determined",author:"Robert M. Sapolsky",page:17},{title:"Determined",author:"Robert M. Sapolsky",page:18},{title:"Determined",author:"Robert M. Sapolsky",page:19},{title:"Determined",author:"Robert M. Sapolsky",page:20}];if(!document.getElementById("book-list-modal")){let t=document.createElement("div");t.setAttribute("id","book-list-modal"),t.setAttribute("class","book-modal");let s=document.createElement("div");s.setAttribute("class","book-modal-content");let o=document.createElement("div");o.setAttribute("class","book-grid"),e.forEach((e=>{let t=document.createElement("div");t.setAttribute("class","book-item"),t.innerHTML=`\n
\n

${e.title}

\n

${e.author}

\n
\n
${e.page}
\n `,o.appendChild(t)})),s.appendChild(o),t.appendChild(s),a.dom.appendChild(t)}document.getElementById("book-list-modal").classList.toggle("active")}()},l.add(r),i.add(l),s.fullscreen){const e=(new b).setId("btn-f").setClass("box");c=new y("button"),c.setTitle(t.get(o[0])),c.dom.onclick=e=>{this.toggleFullScreen(),e.preventDefault()},document.onkeydown=e=>{"F11"===e.key&&(e.preventDefault(),this.toggleFullScreen())},document.onfullscreenchange=t=>{document.fullscreenElement?e.addClass("resize-small"):e.removeClass("resize-small")},e.add(c),i.add(e)}e.on("languagechanged",(e=>{s.fullscreen&&c.setTitle(t.get(o[0]))})),a.add([n,i]),document.body.appendChild(a.dom)}toggleFullScreen(){document.activeElement.blur(),null===document.fullscreenElement?document.documentElement.requestFullscreen():document.exitFullscreen&&document.exitFullscreen()}}class j{constructor(e,t){const s=s=>{const a=new URL(window.location);let o=e;t&&!t.openbook?(o=e,s&&this.storage.clear()):s&&0===a.search.length&&(o=s),this.cfgInit(o,t),this.strings=new c(this),this.toolbar=new M(this),this.content=new A(this),this.status=new P(this),this.sidebar=new R(this),this.settings.annotations&&(this.notedlg=new F(this)),this.init()};this.settings=void 0,this.isMobile=[/Android/i,/BlackBerry/i,/iPhone/i,/iPad/i,/iPod/i,/Windows Phone/i,/webOS/i].some((e=>navigator.userAgent.match(e))),this.storage=new l;const a=t&&t.openbook;!this.storage.indexedDB||t&&!a?s():this.storage.init((()=>this.storage.get((e=>s(e))))),window.onbeforeunload=this.unload.bind(this),window.onhashchange=this.hashChanged.bind(this),window.onkeydown=this.keyboardHandler.bind(this),window.onwheel=e=>{e.ctrlKey&&e.preventDefault()}}init(e,t){this.emit("viewercleanup"),this.navItems={},arguments.length>0&&this.cfgInit(e,t),this.book=ePub(this.settings.bookPath),this.rendition=this.book.renderTo("viewer",{manager:this.settings.manager,flow:this.settings.flow,spread:this.settings.spread.mod,minSpreadWidth:this.settings.spread.min,width:"100%",height:"100%",snap:!0});const s=this.settings.previousLocationCfi;this.displayed=s?this.rendition.display(s):this.rendition.display(),this.displayed.then((e=>{this.emit("displayed",e,this.settings)})),this.book.ready.then((()=>{this.emit("bookready",this.settings)})).then((()=>{this.emit("bookloaded")})),this.book.loaded.metadata.then((e=>{this.emit("metadata",e)})),this.book.loaded.navigation.then((e=>{this.emit("bookready",e)})),this.rendition.on("click",(e=>{"Range"!==e.view.document.getSelection().type&&this.emit("unselected")})),this.rendition.on("layout",(e=>{this.emit("layout",e)})),this.rendition.on("selected",((e,t)=>{this.setLocation(e),this.emit("selected",e,t)})),this.rendition.on("relocated",(e=>{this.setLocation(e.start.cfi),this.emit("relocated",e)})),this.rendition.on("keydown",this.keyboardHandler.bind(this)),this.on("prev",(()=>{"rtl"===this.book.package.metadata.direction?this.rendition.next():this.rendition.prev()})),this.on("next",(()=>{"rtl"===this.book.package.metadata.direction?this.rendition.prev():this.rendition.next()})),this.on("languagechanged",(e=>{this.settings.language=e})),this.on("flowchanged",(e=>{this.settings.flow=e,this.rendition.flow(e)})),this.on("spreadchanged",(e=>{const t=e.mod||this.settings.spread.mod,s=e.min||this.settings.spread.min;this.settings.spread.mod=t,this.settings.spread.min=s,this.rendition.spread(t,s)})),this.on("styleschanged",(e=>{const t=e.fontSize;this.settings.styles.fontSize=t,this.rendition.themes.fontSize(t+"px")}))}navItemFromCfi(e){const t=this.rendition.getRange(e),s=t?t.startContainer.parentNode.id:void 0,a=this.rendition.currentLocation().start.href;return this.navItems[a+"#"+s]||this.navItems[a]}isBookmarked(e){return this.settings.bookmarks.indexOf(e)}isAnnotated(e){return this.settings.annotations.indexOf(e)}cfgInit(e,t){this.entryKey=md5(e).toString(),this.settings={bookPath:e,arrows:this.isMobile?"none":"content",manager:this.isMobile?"continuous":"default",restore:!0,history:!0,openbook:!!this.storage.indexedDB,language:"en",sectionId:void 0,bookmarks:[],annotations:[],flow:"paginated",spread:{mod:"auto",min:800},styles:{fontSize:16},pagination:void 0,fullscreen:document.fullscreenEnabled,background:[]},r(t||{},this.settings),this.settings.restore?this.applySavedSettings(t||{}):this.removeSavedSettings()}isSaved(){return localStorage&&null!==localStorage.getItem(this.entryKey)}removeSavedSettings(){return!!this.isSaved()&&(localStorage.removeItem(this.entryKey),!0)}applySavedSettings(e){if(!this.isSaved())return!1;let t;try{t=JSON.parse(localStorage.getItem(this.entryKey))}catch(e){console.exception(e)}return!!t&&(r(t,this.settings,e),!0)}saveSettings(){this.settings.previousLocationCfi=this.rendition.location.start.cfi;const e=Object.assign({},this.settings);delete e.arrows,delete e.manager,delete e.history,delete e.restore,delete e.openbook,delete e.pagination,delete e.fullscreen,delete e.background,localStorage.setItem(this.entryKey,JSON.stringify(e))}setLocation(e){const t=this.book.archived?void 0:this.book.url,s=new URL(window.location,t);s.hash="#"+e,this.settings.history&&window.location.hash!==s.hash&&(window.history.pushState({},"",s),this.currentLocationCfi=e)}unload(){this.settings.restore&&localStorage&&this.saveSettings()}hashChanged(){const e=window.location.hash.slice(1);this.rendition.display(e)}keyboardHandler(e){let t=this.settings.styles.fontSize;switch(e.key){case"=":case"+":t+=1,this.emit("styleschanged",{fontSize:t});break;case"-":t-=1,this.emit("styleschanged",{fontSize:t});break;case"0":t=16,this.emit("styleschanged",{fontSize:t});break;case"ArrowLeft":this.emit("prev");break;case"ArrowRight":this.emit("next")}}}o(j.prototype);var V=a.Reader;export{V as Reader}; //# sourceMappingURL=epubreader.min.js.map \ No newline at end of file diff --git a/dist/js/epubreader.min.js.map b/dist/js/epubreader.min.js.map index c6aca9c..0fc33dc 100644 --- a/dist/js/epubreader.min.js.map +++ b/dist/js/epubreader.min.js.map @@ -1 +1 @@ -{"version":3,"file":"js/epubreader.min.js","mappings":"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","sources":["webpack://epubreader-js/./node_modules/d/index.js","webpack://epubreader-js/./node_modules/es5-ext/function/noop.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/is-value.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/normalize-options.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-callable.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-value.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/index.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/shim.js","webpack://epubreader-js/./node_modules/event-emitter/index.js","webpack://epubreader-js/./node_modules/type/function/is.js","webpack://epubreader-js/./node_modules/type/object/is.js","webpack://epubreader-js/./node_modules/type/plain-function/is.js","webpack://epubreader-js/./node_modules/type/prototype/is.js","webpack://epubreader-js/./node_modules/type/value/is.js","webpack://epubreader-js/webpack/bootstrap","webpack://epubreader-js/webpack/runtime/define property getters","webpack://epubreader-js/webpack/runtime/hasOwnProperty shorthand","webpack://epubreader-js/webpack/runtime/make namespace object","webpack://epubreader-js/./src/utils.js","webpack://epubreader-js/./src/storage.js","webpack://epubreader-js/./src/strings.js","webpack://epubreader-js/./src/ui.js","webpack://epubreader-js/./src/toolbar.js","webpack://epubreader-js/./src/content.js","webpack://epubreader-js/./src/sidebar/toc.js","webpack://epubreader-js/./src/sidebar/bookmarks.js","webpack://epubreader-js/./src/sidebar/annotations.js","webpack://epubreader-js/./src/sidebar/search.js","webpack://epubreader-js/./src/sidebar/settings.js","webpack://epubreader-js/./src/sidebar/metadata.js","webpack://epubreader-js/./src/sidebar.js","webpack://epubreader-js/./src/notedlg.js","webpack://epubreader-js/./src/reader.js"],"sourcesContent":["\"use strict\";\n\nvar isValue = require(\"type/value/is\")\n , isPlainFunction = require(\"type/plain-function/is\")\n , assign = require(\"es5-ext/object/assign\")\n , normalizeOpts = require(\"es5-ext/object/normalize-options\")\n , contains = require(\"es5-ext/string/#/contains\");\n\nvar d = (module.exports = function (dscr, value/*, options*/) {\n\tvar c, e, w, options, desc;\n\tif (arguments.length < 2 || typeof dscr !== \"string\") {\n\t\toptions = value;\n\t\tvalue = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[2];\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t\tw = contains.call(dscr, \"w\");\n\t} else {\n\t\tc = w = true;\n\t\te = false;\n\t}\n\n\tdesc = { value: value, configurable: c, enumerable: e, writable: w };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n});\n\nd.gs = function (dscr, get, set/*, options*/) {\n\tvar c, e, options, desc;\n\tif (typeof dscr !== \"string\") {\n\t\toptions = set;\n\t\tset = get;\n\t\tget = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[3];\n\t}\n\tif (!isValue(get)) {\n\t\tget = undefined;\n\t} else if (!isPlainFunction(get)) {\n\t\toptions = get;\n\t\tget = set = undefined;\n\t} else if (!isValue(set)) {\n\t\tset = undefined;\n\t} else if (!isPlainFunction(set)) {\n\t\toptions = set;\n\t\tset = undefined;\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t} else {\n\t\tc = true;\n\t\te = false;\n\t}\n\n\tdesc = { get: get, set: set, configurable: c, enumerable: e };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n};\n","\"use strict\";\n\n// eslint-disable-next-line no-empty-function\nmodule.exports = function () {};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.assign : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\tvar assign = Object.assign, obj;\n\tif (typeof assign !== \"function\") return false;\n\tobj = { foo: \"raz\" };\n\tassign(obj, { bar: \"dwa\" }, { trzy: \"trzy\" });\n\treturn obj.foo + obj.bar + obj.trzy === \"razdwatrzy\";\n};\n","\"use strict\";\n\nvar keys = require(\"../keys\")\n , value = require(\"../valid-value\")\n , max = Math.max;\n\nmodule.exports = function (dest, src /*, …srcn*/) {\n\tvar error, i, length = max(arguments.length, 2), assign;\n\tdest = Object(value(dest));\n\tassign = function (key) {\n\t\ttry {\n\t\t\tdest[key] = src[key];\n\t\t} catch (e) {\n\t\t\tif (!error) error = e;\n\t\t}\n\t};\n\tfor (i = 1; i < length; ++i) {\n\t\tsrc = arguments[i];\n\t\tkeys(src).forEach(assign);\n\t}\n\tif (error !== undefined) throw error;\n\treturn dest;\n};\n","\"use strict\";\n\nvar _undefined = require(\"../function/noop\")(); // Support ES3 engines\n\nmodule.exports = function (val) { return val !== _undefined && val !== null; };\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.keys : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\ttry {\n\t\tObject.keys(\"primitive\");\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\nvar isValue = require(\"../is-value\");\n\nvar keys = Object.keys;\n\nmodule.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nvar forEach = Array.prototype.forEach, create = Object.create;\n\nvar process = function (src, obj) {\n\tvar key;\n\tfor (key in src) obj[key] = src[key];\n};\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = function (opts1 /*, …options*/) {\n\tvar result = create(null);\n\tforEach.call(arguments, function (options) {\n\t\tif (!isValue(options)) return;\n\t\tprocess(Object(options), result);\n\t});\n\treturn result;\n};\n","\"use strict\";\n\nmodule.exports = function (fn) {\n\tif (typeof fn !== \"function\") throw new TypeError(fn + \" is not a function\");\n\treturn fn;\n};\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) throw new TypeError(\"Cannot use null or undefined\");\n\treturn value;\n};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? String.prototype.contains : require(\"./shim\");\n","\"use strict\";\n\nvar str = \"razdwatrzy\";\n\nmodule.exports = function () {\n\tif (typeof str.contains !== \"function\") return false;\n\treturn str.contains(\"dwa\") === true && str.contains(\"foo\") === false;\n};\n","\"use strict\";\n\nvar indexOf = String.prototype.indexOf;\n\nmodule.exports = function (searchString /*, position*/) {\n\treturn indexOf.call(this, searchString, arguments[1]) > -1;\n};\n","'use strict';\n\nvar d = require('d')\n , callable = require('es5-ext/object/valid-callable')\n\n , apply = Function.prototype.apply, call = Function.prototype.call\n , create = Object.create, defineProperty = Object.defineProperty\n , defineProperties = Object.defineProperties\n , hasOwnProperty = Object.prototype.hasOwnProperty\n , descriptor = { configurable: true, enumerable: false, writable: true }\n\n , on, once, off, emit, methods, descriptors, base;\n\non = function (type, listener) {\n\tvar data;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) {\n\t\tdata = descriptor.value = create(null);\n\t\tdefineProperty(this, '__ee__', descriptor);\n\t\tdescriptor.value = null;\n\t} else {\n\t\tdata = this.__ee__;\n\t}\n\tif (!data[type]) data[type] = listener;\n\telse if (typeof data[type] === 'object') data[type].push(listener);\n\telse data[type] = [data[type], listener];\n\n\treturn this;\n};\n\nonce = function (type, listener) {\n\tvar once, self;\n\n\tcallable(listener);\n\tself = this;\n\ton.call(this, type, once = function () {\n\t\toff.call(self, type, once);\n\t\tapply.call(listener, this, arguments);\n\t});\n\n\tonce.__eeOnceListener__ = listener;\n\treturn this;\n};\n\noff = function (type, listener) {\n\tvar data, listeners, candidate, i;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return this;\n\tdata = this.__ee__;\n\tif (!data[type]) return this;\n\tlisteners = data[type];\n\n\tif (typeof listeners === 'object') {\n\t\tfor (i = 0; (candidate = listeners[i]); ++i) {\n\t\t\tif ((candidate === listener) ||\n\t\t\t\t\t(candidate.__eeOnceListener__ === listener)) {\n\t\t\t\tif (listeners.length === 2) data[type] = listeners[i ? 0 : 1];\n\t\t\t\telse listeners.splice(i, 1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ((listeners === listener) ||\n\t\t\t\t(listeners.__eeOnceListener__ === listener)) {\n\t\t\tdelete data[type];\n\t\t}\n\t}\n\n\treturn this;\n};\n\nemit = function (type) {\n\tvar i, l, listener, listeners, args;\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return;\n\tlisteners = this.__ee__[type];\n\tif (!listeners) return;\n\n\tif (typeof listeners === 'object') {\n\t\tl = arguments.length;\n\t\targs = new Array(l - 1);\n\t\tfor (i = 1; i < l; ++i) args[i - 1] = arguments[i];\n\n\t\tlisteners = listeners.slice();\n\t\tfor (i = 0; (listener = listeners[i]); ++i) {\n\t\t\tapply.call(listener, this, args);\n\t\t}\n\t} else {\n\t\tswitch (arguments.length) {\n\t\tcase 1:\n\t\t\tcall.call(listeners, this);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tcall.call(listeners, this, arguments[1]);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tcall.call(listeners, this, arguments[1], arguments[2]);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tl = arguments.length;\n\t\t\targs = new Array(l - 1);\n\t\t\tfor (i = 1; i < l; ++i) {\n\t\t\t\targs[i - 1] = arguments[i];\n\t\t\t}\n\t\t\tapply.call(listeners, this, args);\n\t\t}\n\t}\n};\n\nmethods = {\n\ton: on,\n\tonce: once,\n\toff: off,\n\temit: emit\n};\n\ndescriptors = {\n\ton: d(on),\n\tonce: d(once),\n\toff: d(off),\n\temit: d(emit)\n};\n\nbase = defineProperties({}, descriptors);\n\nmodule.exports = exports = function (o) {\n\treturn (o == null) ? create(base) : defineProperties(Object(o), descriptors);\n};\nexports.methods = methods;\n","\"use strict\";\n\nvar isPrototype = require(\"../prototype/is\");\n\nmodule.exports = function (value) {\n\tif (typeof value !== \"function\") return false;\n\n\tif (!hasOwnProperty.call(value, \"length\")) return false;\n\n\ttry {\n\t\tif (typeof value.length !== \"number\") return false;\n\t\tif (typeof value.call !== \"function\") return false;\n\t\tif (typeof value.apply !== \"function\") return false;\n\t} catch (error) {\n\t\treturn false;\n\t}\n\n\treturn !isPrototype(value);\n};\n","\"use strict\";\n\nvar isValue = require(\"../value/is\");\n\n// prettier-ignore\nvar possibleTypes = { \"object\": true, \"function\": true, \"undefined\": true /* document.all */ };\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) return false;\n\treturn hasOwnProperty.call(possibleTypes, typeof value);\n};\n","\"use strict\";\n\nvar isFunction = require(\"../function/is\");\n\nvar classRe = /^\\s*class[\\s{/}]/, functionToString = Function.prototype.toString;\n\nmodule.exports = function (value) {\n\tif (!isFunction(value)) return false;\n\tif (classRe.test(functionToString.call(value))) return false;\n\treturn true;\n};\n","\"use strict\";\n\nvar isObject = require(\"../object/is\");\n\nmodule.exports = function (value) {\n\tif (!isObject(value)) return false;\n\ttry {\n\t\tif (!value.constructor) return false;\n\t\treturn value.constructor.prototype === value;\n\t} catch (error) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\n// ES3 safe\nvar _undefined = void 0;\n\nmodule.exports = function (value) { return value !== _undefined && value !== null; };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const d = (obj, prop) => obj ? obj[prop] : undefined\n\nconst q = (src, dst, ext, prop) => {\n let val\n if (typeof dst[prop] === \"boolean\") {\n switch (prop) {\n case \"annotations\":\n case \"bookmarks\":\n val = dst[prop] ? src[prop] : dst[prop]\n break;\n default:\n val = dst[prop]\n break;\n }\n } else if (prop === \"arrows\") {\n val = dst[prop]\n } else {\n val = d(ext, prop) === undefined ? src[prop] : dst[prop]\n }\n return val\n}\n\nexport const extend = (src, dst, ext) => {\n for (let prop in src) {\n if (prop === \"bookPath\") {\n continue\n } else if (dst[prop] instanceof Array) {\n dst[prop] = ext ? (src[prop] ? src[prop] : dst[prop]) : src[prop]\n } else if (dst[prop] instanceof Object) {\n extend(src[prop], dst[prop], d(ext, prop)) // recursive call\n } else {\n dst[prop] = ext ? q(src, dst, ext, prop) : src[prop]\n }\n }\n}\n\nexport const uuid = () => {\n let d = new Date().getTime()\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n let r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === \"x\" ? r : (r & 0x7 | 0x8)).toString(16)\n })\n return uuid\n}\n\nexport const detectMobile = () => {\n const matches = [\n /Android/i,\n /BlackBerry/i,\n /iPhone/i,\n /iPad/i,\n /iPod/i,\n /Windows Phone/i,\n /webOS/i\n ]\n return matches.some((i) => navigator.userAgent.match(i))\n}","export class Storage {\n\n\tconstructor() {\n\n\t\tthis.name = \"epubreader-js\";\n\t\tthis.version = 1.0;\n\t\tthis.db;\n\t\tthis.indexedDB = window.indexedDB ||\n\t\t\twindow.webkitIndexedDB ||\n\t\t\twindow.mozIndexedDB ||\n\t\t\twindow.OIndexedDB ||\n\t\t\twindow.msIndexedDB;\n\n\t\tif (this.indexedDB === undefined) {\n\n\t\t\tconsole.error(\"The IndexedDB API not available in your browser.\");\n\t\t}\n\t}\n\n\tinit(callback) {\n\n\t\tif (this.indexedDB === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst onerror = (e) => console.error(\"IndexedDB\", e);\n\t\tconst request = indexedDB.open(this.name, this.version);\n\t\trequest.onupgradeneeded = (e) => {\n\n\t\t\tconst db = e.target.result;\n\t\t\tif (db.objectStoreNames.contains(\"entries\") === false) {\n\t\t\t\tdb.createObjectStore(\"entries\");\n\t\t\t}\n\t\t}\n\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tthis.db = e.target.result;\n\t\t\tthis.db.onerror = onerror;\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.init: ${Date.now() - time} ms`);\n\t\t}\n\n\t\trequest.onerror = onerror;\n\t}\n\n\tget(callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.get(0);\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tcallback(e.target.result);\n\t\t\tconsole.log(`storage.get: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tset(data, callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.put(data, 0);\n\t\trequest.onsuccess = () => {\n\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.set: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tclear() {\n\n\t\tif (this.db === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.clear();\n\t\trequest.onsuccess = () => {\n\n\t\t\tconsole.log(`storage.clear: ${Date.now() - time} ms`);\n\t\t}\n\t}\n}","export class Strings {\n\n\tconstructor(reader) {\n\n\t\tthis.language = reader.settings.language || \"en\";\n\t\tthis.values = {\n\t\t\ten: {\n\t\t\t\t\"toolbar/sidebar\": \"Sidebar\",\n\t\t\t\t\"toolbar/prev\": \"Previous page\",\n\t\t\t\t\"toolbar/next\": \"Next page\",\n\t\t\t\t\"toolbar/openbook\": \"Open book\",\n\t\t\t\t\"toolbar/openbook/error\": \"Your browser does not support the required features.\\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Add this page to bookmarks\",\n\t\t\t\t\"toolbar/fullscreen\": \"Fullscreen\",\n\n\t\t\t\t\"sidebar/close\": \"Close Sidebar\",\n\t\t\t\t\"sidebar/contents\": \"Contents\",\n\t\t\t\t\"sidebar/bookmarks\": \"Bookmarks\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Add\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Remove\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Add\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Remove\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Anchor\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Cancel\",\n\t\t\t\t\"sidebar/search\": \"Search\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Search\",\n\t\t\t\t\"sidebar/settings\": \"Settings\",\n\t\t\t\t\"sidebar/settings/language\": \"Language\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Font size (%)\",\n\t\t\t\t\"sidebar/settings/flow\": \"Flow\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Generate pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Spread\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Minimum spread width\",\n\t\t\t\t\"sidebar/metadata\": \"Metadata\",\n\t\t\t\t\"sidebar/metadata/title\": \"Title\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Creator\",\n\t\t\t\t\"sidebar/metadata/description\": \"Description\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Pubdate\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Publisher\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Identifier\",\n\t\t\t\t\"sidebar/metadata/language\": \"Language\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Rights\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Modified date\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Layout\", // rendition:layout\n\t\t\t\t\"sidebar/metadata/flow\": \"Flow\", // rendition:flow\n\t\t\t\t\"sidebar/metadata/spread\": \"Spread\", // rendition:spread\n\t\t\t\t\"sidebar/metadata/direction\": \"Direction\", // page-progression-direction\n\n\t\t\t\t\"notedlg/label\": \"Note\",\n\t\t\t\t\"notedlg/add\": \"Add\"\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\t\"toolbar/sidebar\": \"Barre latérale\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"Ouvrir un livre local\",\n\t\t\t\t\"toolbar/openbook/error\": \"Votre navigateur ne prend pas en charge les fonctions nécessaires.\\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Insérer un marque page ici\",\n\t\t\t\t\"toolbar/fullscreen\": \"Plein écran\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"Sommaire\",\n\t\t\t\t\"sidebar/bookmarks\": \"Marque-pages\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Ancre\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Annuler\",\n\t\t\t\t\"sidebar/search\": \"Rechercher\",\n\t\t\t\t\"sidebar/search/placeholder\": \"rechercher\",\n\t\t\t\t\"sidebar/settings\": \"Réglages\",\n\t\t\t\t\"sidebar/settings/language\": \"Langue\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Établir une pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"Langue\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"Ajouter\"\n\t\t\t},\n\t\t\tja: {\n\t\t\t\t\"toolbar/sidebar\": \"サイドバー\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"本を開く\",\n\t\t\t\t\"toolbar/openbook/error\": \"ご利用のブラウザは必要な機能をサポートしていません。\\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。\",\n\t\t\t\t\"toolbar/bookmark\": \"このページに栞を設定する\",\n\t\t\t\t\"toolbar/fullscreen\": \"フルスクリーン\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"目次\",\n\t\t\t\t\"sidebar/bookmarks\": \"栞\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations\": \"注釈\",\n\t\t\t\t\"sidebar/annotations/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/annotations/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"アンカー\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"キャンセル\",\n\t\t\t\t\"sidebar/search\": \"検索\",\n\t\t\t\t\"sidebar/search/placeholder\": \"検索\",\n\t\t\t\t\"sidebar/settings\": \"設定\",\n\t\t\t\t\"sidebar/settings/language\": \"表示言語\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"ページネーション\", \"ページネーションを生成します。\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"表示言語\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"追加\"\n\t\t\t},\n\t\t\tru: {\n\t\t\t\t\"toolbar/sidebar\": \"Боковая панель\",\n\t\t\t\t\"toolbar/prev\": \"Предыдущая страница\",\n\t\t\t\t\"toolbar/next\": \"Следущая страница\",\n\t\t\t\t\"toolbar/openbook\": \"Открыть книгу\",\n\t\t\t\t\"toolbar/openbook/error\": \"Ваш браузер не поддерживает необходимые функции.\\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Добавить эту страницу в закладки\",\n\t\t\t\t\"toolbar/fullscreen\": \"Полноэкранный режим\",\n\n\t\t\t\t\"sidebar/close\": \"Закрыть боковую панель\",\n\t\t\t\t\"sidebar/contents\": \"Содержание\",\n\t\t\t\t\"sidebar/bookmarks\": \"Закладки\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Добавить\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations\": \"Аннотации\",\n\t\t\t\t\"sidebar/annotations/add\": \"Добавить\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Метка\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Отмена\",\n\t\t\t\t\"sidebar/search\": \"Поиск\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Поиск\",\n\t\t\t\t\"sidebar/settings\": \"Настройки\",\n\t\t\t\t\"sidebar/settings/language\": \"Язык\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Размер шрифта\",\n\t\t\t\t\"sidebar/settings/flow\": \"Поток\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Нумерация страниц\", \"Генерировать нумерацию страниц\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Мин. ширина колонки\",\n\t\t\t\t\"sidebar/metadata\": \"Метаданные\",\n\t\t\t\t\"sidebar/metadata/title\": \"Заголовок\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Автор\",\n\t\t\t\t\"sidebar/metadata/description\": \"Описание\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Дата публикации\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Издатель\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Идентификатор\",\n\t\t\t\t\"sidebar/metadata/language\": \"Язык\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Лицензия\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Дата изменения\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Макет\",\n\t\t\t\t\"sidebar/metadata/flow\": \"Поток\",\n\t\t\t\t\"sidebar/metadata/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/metadata/direction\": \"Направление\",\n\n\t\t\t\t\"notedlg/label\": \"Заметка\",\n\t\t\t\t\"notedlg/add\": \"Добавить\"\n\t\t\t}\n\t\t};\n\n\t\treader.on(\"languagechanged\", (value) => {\n\t\t\tthis.language = value;\n\t\t});\n\t}\n\n\tget(key) { return this.values[this.language][key] || \"???\"; }\n}","/**\n * @author mrdoob https://github.com/mrdoob/ui.js\n */\n\nconst ERROR_MSG = \"is not an instance of UIElement.\";\n\n/**\n * UIElement\n * @param {string} tag\n */\nexport class UIElement {\n\t\n\tconstructor(tag) {\n\n\t\tthis.dom = document.createElement(tag); \n\t}\n\n\tadd() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.appendChild(argument.dom);\n\n\t\t\t} else if (Array.isArray(argument)) {\n\n\t\t\t\tfor (let j = 0; j < argument.length; j++) {\n\n\t\t\t\t\tconst element = argument[j];\n\n\t\t\t\t\tif (element instanceof UIElement) {\n\n\t\t\t\t\t\tthis.dom.appendChild(element.dom);\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error(\"UIElement:\", element, ERROR_MSG);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tremove() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.removeChild(argument.dom);\n\n\t\t\t} else if (Number.isInteger(argument)) {\n\n\t\t\t\tthis.dom.removeChild(this.dom.childNodes[argument]);\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tclear() {\n\n\t\twhile (this.dom.children.length) {\n\n\t\t\tthis.dom.removeChild(this.dom.lastChild);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetId(id) {\n\n\t\tthis.dom.id = id;\n\t\treturn this;\n\t}\n\n\tgetId() {\n\n\t\treturn this.dom.id;\n\t}\n\n\tremoveAttribute(name) {\n\n\t\tthis.dom.removeAttribute(name);\n\t\treturn this;\n\t}\n\n\tsetClass(name) {\n\n\t\tthis.dom.className = name;\n\t\treturn this;\n\t}\n\n\taddClass(name) {\n\n\t\tthis.dom.classList.add(name);\n\t\treturn this;\n\t}\n\n\tremoveClass(name) {\n\n\t\tthis.dom.classList.remove(name);\n\t\treturn this;\n\t}\n\n\tsetStyle(key, value) {\n\n\t\tthis.dom.style[key] = value;\n\t\treturn this;\n\t}\n\n\tgetTitle() {\n\n\t\treturn this.dom.title;\n\t}\n\n\tsetTitle(title) {\n\n\t\tif (this.dom.title !== title && title)\n\t\t\tthis.dom.title = title;\n\t\treturn this;\n\t}\n\n\tgetTextContent() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetTextContent(text) {\n\n\t\tif (this.dom.textContent !== text && text)\n\t\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n\n\tgetBoundingClientRect() {\n\n\t\treturn this.dom.getBoundingClientRect();\n\t}\n}\n\n/**\n * UISpan\n * @param {string} text\n */\nexport class UISpan extends UIElement {\n\n\tconstructor(text) {\n\n\t\tsuper(\"span\");\n\t\tthis.setTextContent(text);\n\t}\n}\n\n/**\n * UIDiv\n */\nexport class UIDiv extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"div\");\n\t}\n}\n\n/**\n * UIRow\n */\nexport class UIRow extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"row\";\n\t}\n}\n\n/**\n * UIPanel\n */\nexport class UIPanel extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"panel\";\n\t}\n}\n\n/**\n * UILabel\n * @param {string} text\n * @param {string} id\n */\nexport class UILabel extends UIElement {\n\n\tconstructor(text, id) {\n\n\t\tsuper(\"label\");\n\n\t\tthis.dom.textContent = text;\n\t\tif (id) this.dom.htmlFor = id;\n\t}\n}\n\n/**\n * UILink\n * @param {string} href\n * @param {string} text\n */\nexport class UILink extends UIElement {\n\n\tconstructor(href, text) {\n\n\t\tsuper(\"a\");\n\n\t\tthis.dom.href = href || \"#\";\n\t\tthis.dom.textContent = text || \"\";\n\t}\n\n\tsetHref(url) {\n\n\t\tthis.dom.href = url;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIText\n * @param {string} text\n */\nexport class UIText extends UISpan {\n\n\tconstructor(text) {\n\n\t\tsuper();\n\n\t\tthis.dom.textContent = text;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetValue(text) {\n\n\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITextArea\n */\nexport class UITextArea extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"textarea\");\n\n\t\tthis.dom.spellcheck = false;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UISelect\n */\nexport class UISelect extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"select\");\n\t}\n\n\tsetMultiple(boolean) {\n\n\t\tthis.dom.multiple = boolean || false;\n\t\treturn this;\n\t}\n\n\tsetOptions(options) {\n\n\t\tconst selected = this.dom.value;\n\t\tthis.clear();\n\n\t\tfor (const key in options) {\n\n\t\t\tconst option = document.createElement(\"option\");\n\t\t\toption.value = key;\n\t\t\toption.text = options[key];\n\t\t\tthis.dom.appendChild(option);\n\t\t}\n\t\tthis.dom.value = selected;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tvalue = String(value);\n\n\t\tif (this.dom.value !== value)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIInput\n * @param {*} type\n * @param {*} value\n * @param {*} title\n */\nexport class UIInput extends UIElement {\n\n\tconstructor(type, value, title) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = type;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.setValue(value);\n\t\tthis.setTitle(title);\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tgetType() {\n\n\t\treturn this.dom.type;\n\t}\n\n\tsetType(type) {\n\n\t\tthis.dom.type = type;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tif (this.dom.value !== value && value !== undefined)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIColor\n */\nexport class UIColor extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"input\");\n\n\t\ttry {\n\n\t\t\tthis.dom.type = \"color\";\n\t\t\tthis.dom.value = \"#ffffff\";\n\n\t\t} catch (e) {\n\n\t\t\tconsole.exception(e);\n\t\t}\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tgetHexValue() {\n\n\t\treturn parseInt(this.dom.value.substr(1), 16);\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n\n\tsetHexValue(hex) {\n\n\t\tthis.dom.value = \"#\" + (\"000000\" + hex.toString(16)).slice(-6);\n\t\treturn this;\n\t}\n}\n\n/**\n * UINumber\n * @param {number} value\n * @param {number} step\n * @param {number} min\n * @param {number} max\n * @param {number} precision\n */\nexport class UINumber extends UIElement {\n\n\tconstructor(value, step, min, max, precision) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = \"number\";\n\t\tthis.dom.step = step || 1;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.value = value || 0;\n\t\tthis.min = min || -Infinity;\n\t\tthis.max = max || +Infinity;\n\t\tthis.precision = precision || 0;\n\t\tthis.setValue(value);\n\t\tthis.dom.onchange = (e) => {\n\n\t\t\tthis.setValue(this.value);\n\t\t};\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision) {\n\n\t\tthis.precision = precision;\n\t\tthis.setValue(this.value);\n\t\treturn this;\n\t}\n\n\tsetRange(min, max) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\t\tthis.dom.min = min;\n\t\tthis.dom.max = max;\n\t\treturn this;\n\t}\n\n\tsetStep(step) {\n\n\t\tthis.dom.step = step;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn parseFloat(this.dom.value);\n\t}\n\n\tsetValue(value) {\n\n\t\tif (value !== undefined) {\n\t\t\tvalue = parseFloat(value);\n\n\t\t\tif (value < this.min)\n\t\t\t\tvalue = this.min;\n\t\t\tif (value > this.max)\n\t\t\t\tvalue = this.max;\n\n\t\t\tthis.value = value;\n\t\t\tthis.dom.value = value.toFixed(this.precision);\n\t\t}\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBreak\n */\nexport class UIBreak extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"br\");\n\t}\n}\n\n/**\n * UIHorizontalRule\n */\nexport class UIHorizontalRule extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"hr\");\n\t}\n}\n\n/**\n * UIProgress\n * @param {*} value\n */\nexport class UIProgress extends UIElement {\n\n\tconstructor(value) {\n\n\t\tsuper(\"progress\");\n\n\t\tthis.dom.value = value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITabbedPanel\n * @param {string} align (horizontal | vertical)\n */\nexport class UITabbedPanel extends UIDiv {\n\n\tconstructor(align) {\n\n\t\tsuper();\n\n\t\tthis.align = align || \"horizontal\";\n\t\tthis.tabs = [];\n\t\tthis.panels = [];\n\t\tthis.selector = new UISpan().setClass(\"tab-selector\");\n\t\tthis.menuDiv = new UIDiv().setClass(\"menu\");\n\t\tthis.tabsDiv = new UIDiv().setClass(\"tabs\");\n\t\tthis.tabsDiv.add(this.selector);\n\t\tthis.panelsDiv = new UIDiv().setClass(\"panels\");\n\t\tthis.selected = \"\";\n\t\tthis.add(this.menuDiv);\n\t\tthis.add(this.tabsDiv);\n\t\tthis.add(this.panelsDiv);\n\t}\n\n\taddMenu(items) {\n\t\tthis.menuDiv.add(items);\n\t}\n\n\taddTab(id, label, items) {\n\n\t\tconst tab = new UITab(label, this);\n\t\ttab.setId(id);\n\t\ttab.setClass(\"box\");\n\t\tthis.tabs.push(tab);\n\t\tthis.tabsDiv.add(tab);\n\n\t\tconst panel = new UIDiv();\n\t\tpanel.setId(id);\n\t\tpanel.add(items);\n\t\tthis.panels.push(panel);\n\t\tthis.panelsDiv.add(panel);\n\t\tthis.select(id);\n\t}\n\n\tselect(id) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.addClass(\"selected\");\n\t\t\t\tthis.transformSelector(tab);\n\t\t\t} else if (tab.dom.id === this.selected) {\n\t\t\t\ttab.removeClass(\"selected\");\n\t\t\t}\n\t\t}\n\n\t\tfor (let panel of this.panels) {\n\t\t\tif (panel.dom.id === id) {\n\t\t\t\tpanel.dom.style.display = \"block\";\n\t\t\t} else if (panel.dom.id === this.selected) {\n\t\t\t\tpanel.dom.style.display = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tthis.selected = id;\n\t\treturn this;\n\t}\n\n\tsetLabel(id, text) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.setTitle(text);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\ttransformSelector(tab) {\n\n\t\tlet size;\n\t\tconst rect = tab.getBoundingClientRect();\n\t\tif (this.align === \"horizontal\") {\n\t\t\tsize = rect.width * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateX(${size}px)`;\n\t\t} else {\n\t\t\tsize = rect.height * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateY(${size}px)`;\n\t\t}\n\t}\n}\n\n/**\n * UITab\n * @param {string} text\n * @param {UITabbedPanel} parent\n */\nexport class UITab extends UIDiv {\n\n\tconstructor(text, parent) {\n\n\t\tsuper();\n\t\tthis.button = new UIInput(\"button\");\n\t\tthis.button.dom.title = text;\n\t\tthis.dom.onclick = (e) => {\n\n\t\t\tparent.select(this.dom.id);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(this.button);\n\t}\n}\n\n/**\n * UIList\n * @param {UIItem} parent\n */\nexport class UIList extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"ul\");\n\t\tthis.parent = parent && parent.parent; // LI->UL\n\t\tthis.expanded = false;\n\t}\n\n\texpand() {\n\n\t\tthis.expanded = true;\n\t\tthis.dom.style.display = \"block\";\n\t\tif (this.parent)\n\t\t\tthis.parent.expand();\n\t\treturn this;\n\t}\n\n\tcollaps() {\n\n\t\tthis.expanded = false;\n\t\tthis.dom.style.display = \"none\";\n\t\treturn this;\n\t}\n}\n\n/**\n * UIItem\n * @param {UIList} parent\n */\nexport class UIItem extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"li\");\n\t\tthis.parent = parent; // UL\n\t\tthis.selected = false;\n\t}\n\n\tadd() {\n\t\tlet len = 0;\n\t\tconst box = new UIDiv().setId(\"item-box\");\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\t\t\tconst argument = arguments[i];\n\t\t\tif (argument instanceof UIList) {\n\t\t\t\tsuper.add(argument);\n\t\t\t} else {\n\t\t\t\tbox.add(argument);\n\t\t\t\tlen++;\n\t\t\t}\n\t\t}\n\t\tif (len) super.add(box);\n\t\treturn this;\n\t}\n\n\tselect() {\n\n\t\tthis.selected = true;\n\t\tthis.setClass(\"selected\");\n\t\treturn this;\n\t}\n\n\tunselect() {\n\n\t\tthis.selected = false;\n\t\tthis.removeAttribute(\"class\");\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBox\n * @param {UIElement} items\n */\nexport class UIBox extends UIElement {\n\n\tconstructor(items) {\n\n\t\tsuper(\"div\");\n\t\tthis.setClass(\"box\");\n\t\tthis.add(items);\n\t}\n}","import { UIDiv, UIInput } from \"./ui.js\";\n\nexport class Toolbar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst settings = reader.settings;\n\n\t\tconst container = new UIDiv().setId(\"toolbar\");\n\t\tconst keys = [\n\t\t\t\"toolbar/sidebar\",\n\t\t\t\"toolbar/prev\",\n\t\t\t\"toolbar/next\",\n\t\t\t\"toolbar/openbook\",\n\t\t\t\"toolbar/openbook/error\",\n\t\t\t\"toolbar/bookmark\",\n\t\t\t\"toolbar/fullscreen\"\n\t\t];\n\t\tconst menu1 = new UIDiv().setClass(\"menu-1\");\n\t\tconst openerBox = new UIDiv().setId(\"btn-m\").setClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.dom.title = strings.get(keys[0]);\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", true);\n\t\t\topenerBtn.dom.blur();\n\t\t\te.preventDefault();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tmenu1.add(openerBox);\n\n\t\tlet prevBox, prevBtn;\n\t\tlet nextBox, nextBtn;\n\t\tif (settings.arrows === \"toolbar\") {\n\t\t\tprevBox = new UIDiv().setId(\"btn-p\").setClass(\"box\");\n\t\t\tprevBtn = new UIInput(\"button\");\n\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\tprevBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t\tprevBtn.dom.blur();\n\t\t\t};\n\t\t\tprevBox.add(prevBtn);\n\t\t\tmenu1.add(prevBox);\n\n\t\t\tnextBox = new UIDiv().setId(\"btn-n\").setClass(\"box\");\n\t\t\tnextBtn = new UIInput(\"button\");\n\t\t\tnextBtn.dom.title = strings.get(keys[2]);\n\t\t\tnextBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t\tnextBtn.dom.blur();\n\t\t\t};\n\t\t\tnextBox.add(nextBtn);\n\t\t\tmenu1.add(nextBox);\n\t\t}\n\n\t\tconst menu2 = new UIDiv().setClass(\"menu-2\");\n\t\tlet openbookBtn;\n\t\tif (settings.openbook) {\n\t\t\tconst onload = (e) => {\n\n\t\t\t\treader.storage.clear();\n\t\t\t\treader.storage.set(e.target.result, () => {\n\t\t\t\t\treader.unload();\n\t\t\t\t\treader.init(e.target.result);\n\t\t\t\t\tconst url = new URL(window.location.origin);\n\t\t\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\t\t});\n\t\t\t};\n\t\t\tconst onerror = (e) => {\n\t\t\t\tconsole.error(e);\n\t\t\t};\n\t\t\tconst openbookBox = new UIDiv().setId(\"btn-o\").setClass(\"box\");\n\t\t\topenbookBtn = new UIInput(\"file\");\n\t\t\topenbookBtn.dom.title = strings.get(keys[3]);\n\t\t\topenbookBtn.dom.accept = \"application/epub+zip\";\n\t\t\topenbookBtn.dom.onchange = (e) => {\n\n\t\t\t\tif (e.target.files.length === 0)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (window.FileReader) {\n\n\t\t\t\t\tconst fr = new FileReader();\n\t\t\t\t\tfr.onload = onload;\n\t\t\t\t\tfr.readAsArrayBuffer(e.target.files[0]);\n\t\t\t\t\tfr.onerror = onerror;\n\t\t\t\t} else {\n\t\t\t\t\talert(strings.get(keys[4]));\n\t\t\t\t}\n\n\t\t\t};\n\t\t\topenbookBtn.dom.onclick = (e) => {\n\n\t\t\t\topenbookBtn.dom.blur();\n\t\t\t};\n\t\t\topenbookBox.add(openbookBtn);\n\t\t\tmenu2.add(openbookBox);\n\t\t}\n\n\t\tlet bookmarkBox, bookmarkBtn;\n\t\tif (settings.bookmarks) {\n\t\t\tbookmarkBox = new UIDiv().setId(\"btn-b\").setClass(\"box\");\n\t\t\tbookmarkBtn = new UIInput(\"button\");\n\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\tbookmarkBtn.dom.onclick = (e) => {\n\n\t\t\t\tconst cfi = this.locationCfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\treader.emit(\"bookmarked\", val);\n\t\t\t\te.preventDefault();\n\t\t\t\tbookmarkBtn.dom.blur();\n\t\t\t};\n\t\t\tbookmarkBox.add(bookmarkBtn);\n\t\t\tmenu2.add(bookmarkBox);\n\t\t}\n\n\t\tlet fullscreenBtn;\n\t\tif (settings.fullscreen) {\n\n\t\t\tconst fullscreenBox = new UIDiv().setId(\"btn-f\").setClass(\"box\");\n\t\t\tfullscreenBtn = new UIInput(\"button\");\n\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\tfullscreenBtn.dom.onclick = (e) => {\n\n\t\t\t\tthis.toggleFullScreen();\n\t\t\t\te.preventDefault();\n\t\t\t};\n\n\t\t\tdocument.onkeydown = (e) => {\n\n\t\t\t\tif (e.key === \"F11\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.toggleFullScreen();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.onfullscreenchange = (e) => {\n\n\t\t\t\tconst w = window.screen.width === e.target.clientWidth;\n\t\t\t\tconst h = window.screen.height === e.target.clientHeight;\n\n\t\t\t\tif (w && h) {\n\t\t\t\t\tfullscreenBox.addClass(\"resize-small\");\n\t\t\t\t} else {\n\t\t\t\t\tfullscreenBox.removeClass(\"resize-small\");\n\t\t\t\t}\n\t\t\t};\n\t\t\tfullscreenBox.add(fullscreenBtn);\n\t\t\tmenu2.add(fullscreenBox);\n\t\t}\n\n\t\tcontainer.add([menu1, menu2]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tconst cfi = location.start.cfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\tif (val) {\n\t\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t\t} else {\n\t\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t\t}\n\t\t\t\tthis.locationCfi = cfi; // save location cfi\n\t\t\t}\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBox.dom.style.display = location.atStart ? \"none\" : \"block\";\n\t\t\t\tnextBox.dom.style.display = location.atEnd ? \"none\" : \"block\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean) => {\n\n\t\t\tif (boolean) {\n\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t} else {\n\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\t\tnextBtn.setTitle(strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (settings.openbook) {\n\t\t\t\topenbookBtn.setTitle(strings.get(keys[3]));\n\t\t\t}\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\t}\n\t\t\tif (settings.fullscreen) {\n\t\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\t}\n\t\t});\n\t}\n\n\ttoggleFullScreen() {\n\n\t\tdocument.activeElement.blur();\n\n\t\tif (document.fullscreenElement === null) {\n\t\t\tdocument.documentElement.requestFullscreen();\n\t\t} else if (document.exitFullscreen) {\n\t\t\tdocument.exitFullscreen();\n\t\t}\n\t}\n}","import { UIDiv, UISpan } from \"./ui.js\";\n\nexport class Content {\n\n\tconstructor(reader) {\n\n\t\tconst settings = reader.settings;\n\t\tconst container = new UIDiv().setId(\"content\");\n\n\t\tlet prev;\n\t\tif (settings.arrows === \"content\") {\n\n\t\t\tprev = new UIDiv().setId(\"prev\").setClass(\"arrow\");\n\t\t\tprev.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tprev.add(new UISpan(\"<\"));\n\t\t\tcontainer.add(prev);\n\t\t}\n\n\t\tconst viewer = new UIDiv().setId(\"viewer\");\n\t\tcontainer.add(viewer);\n\n\t\tlet next;\n\t\tif (settings.arrows === \"content\") {\n\t\t\tnext = new UIDiv().setId(\"next\").setClass(\"arrow\");\n\t\t\tnext.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tnext.add(new UISpan(\">\"));\n\t\t\tcontainer.add(next);\n\t\t}\n\n\t\tconst loader = new UIDiv().setId(\"loader\");\n\t\tconst divider = new UIDiv().setId(\"divider\");\n\t\tconst overlay = new UIDiv().setId(\"overlay\");\n\t\toverlay.dom.onclick = (e) => {\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tcontainer.add([loader, divider, overlay]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tviewer.setClass(cfg.flow);\n\t\t\tloader.dom.style.display = \"block\";\n\t\t});\n\n\t\treader.on(\"bookloaded\", () => {\n\n\t\t\tloader.dom.style.display = \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.spread && props.width > props.spreadWidth) {\n\t\t\t\tdivider.dom.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tdivider.dom.style.display = \"none\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"flowchanged\", (value) => {\n\t\t\t\n\t\t\tviewer.setClass(value);\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tif (location.atStart) {\n\t\t\t\t\tprev.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tprev.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t\tif (location.atEnd) {\n\t\t\t\t\tnext.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tnext.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"prev\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tprev.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { prev.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"next\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tnext.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { next.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\toverlay.dom.style.display = value ? \"block\" : \"none\";\n\t\t});\n\n\t\treader.on(\"viewercleanup\", () => {\n\n\t\t\tviewer.clear();\n\t\t});\n\t}\n}","import { UIPanel, UIDiv, UIItem, UIList, UILink, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class TocPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/contents\"\n\t\t];\n\t\tconst label = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined; // save reference to selected tree item\n\t\tthis.setId(\"contents\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\n\t\t//-- events --//\n\n\t\treader.on(\"navigation\", (toc) => {\n\n\t\t\tcontainer.clear();\n\t\t\tcontainer.add(this.generateToc(toc));\n\t\t\tthis.add(container);\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tlabel.setValue(strings.get(keys[0]));\n\t\t});\n\t}\n\n\tgenerateToc(toc, parent) {\n\n\t\tconst list = new UIList(parent);\n\n\t\ttoc.forEach((chapter) => {\n\n\t\t\tconst link = new UILink(chapter.href, chapter.label);\n\t\t\tconst item = new UIItem(list).setId(chapter.id);\n\t\t\tconst ibtn = new UISpan();\n\n\t\t\tlink.dom.onclick = (e) => {\n\n\t\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\t\tthis.selector.unselect();\n\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t\tthis.reader.settings.sectionId = chapter.id;\n\t\t\t\tthis.reader.rendition.display(chapter.href);\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\titem.add([ibtn, link]);\n\t\t\tthis.reader.navItems[chapter.href] = {\n\t\t\t\tid: chapter.id,\n\t\t\t\tlabel: chapter.label\n\t\t\t};\n\n\t\t\tif (this.reader.settings.sectionId === chapter.id) {\n\t\t\t\tlist.expand();\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t}\n\n\t\t\tif (chapter.subitems && chapter.subitems.length > 0) {\n\n\t\t\t\tconst subItems = this.generateToc(chapter.subitems, item);\n\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\tibtn.dom.onclick = () => {\n\n\t\t\t\t\tif (subItems.expanded) {\n\t\t\t\t\t\tsubItems.collaps();\n\t\t\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubItems.expand();\n\t\t\t\t\t\tibtn.setClass(\"toggle-expanded\");\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t\titem.add(subItems);\n\t\t\t}\n\n\t\t\tlist.add(item);\n\t\t});\n\n\t\treturn list;\n\t}\n}","import { UIPanel, UIDiv, UIRow, UIInput, UILink, UIList, UIItem, UIText, UIBox, UISpan } from \"../ui.js\";\n\nexport class BookmarksPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/bookmarks/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearBookmarks();\n\t\t\treader.emit(\"bookmarked\", false);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.bookmarks = new UIList();\n\t\tcontainer.add(this.bookmarks);\n\t\tthis.setId(\"bookmarks\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\n\t\tconst update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.bookmarks.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"displayed\", (renderer, cfg) => {\n\n\t\t\tcfg.bookmarks.forEach((cfi) => {\n\n\t\t\t\tthis.setBookmark(cfi);\n\t\t\t});\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tthis.locationCfi = location.start.cfi; // save location cfi\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean, cfi) => {\n\n\t\t\tif (boolean) {\n\t\t\t\tthis.appendBookmark();\n\t\t\t} else {\n\t\t\t\tthis.removeBookmark(cfi);\n\t\t\t}\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tappendBookmark() {\n\n\t\tconst cfi = this.locationCfi;\n\t\tif (this.reader.isBookmarked(cfi) > -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setBookmark(cfi);\n\t\tthis.reader.settings.bookmarks.push(cfi);\n\t}\n\n\tremoveBookmark(cfi) {\n\n\t\tconst _cfi = cfi || this.locationCfi;\n\t\tconst index = this.reader.isBookmarked(_cfi);\n\t\tif (index === -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.bookmarks.remove(index);\n\t\tthis.reader.settings.bookmarks.splice(index, 1);\n\t}\n\n\tclearBookmarks() {\n\n\t\tthis.bookmarks.clear();\n\t\tthis.reader.settings.bookmarks = [];\n\t}\n\n\tsetBookmark(cfi) {\n\n\t\tconst link = new UILink();\n\t\tconst item = new UIItem();\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst navItem = this.reader.navItemFromCfi(cfi);\n\t\tlet idref;\n\t\tlet label;\n\n\t\tif (navItem === undefined) {\n\t\t\tconst spineItem = this.reader.book.spine.get(cfi);\n\t\t\tidref = spineItem.idref;\n\t\t\tlabel = spineItem.idref\n\t\t} else {\n\t\t\tidref = navItem.id;\n\t\t\tlabel = navItem.label;\n\t\t}\n\n\t\tlink.setHref(\"#\" + cfi);\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(cfi);\n\t\t\te.preventDefault();\n\t\t};\n\t\tlink.setTextContent(label);\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.reader.emit(\"bookmarked\", false, cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\titem.setId(idref);\n\t\tthis.bookmarks.add(item);\n\t}\n}","import { UIPanel, UIDiv, UITextArea, UIInput, UILink, UIList, UIItem, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class AnnotationsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/annotations/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearNotes();\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.notes = new UIList();\n\t\tcontainer.add(this.notes);\n\t\tthis.setId(\"annotations\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\t\tthis.update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.annotations.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tcfg.annotations.forEach((note) => {\n\n\t\t\t\tthis.set(note);\n\t\t\t});\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"noteadded\", (note) => {\n\n\t\t\tthis.set(note);\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tset(note) {\n\n\t\tconst link = new UILink(\"#\" + note.cfi, note.text);\n\t\tconst item = new UIItem().setId(\"note-\" + note.uuid);\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst call = () => { };\n\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(note.cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.removeNote(note);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\tthis.notes.add(item);\n\t\tthis.reader.rendition.annotations.add(\n\t\t\t\"highlight\", note.cfi, {}, call, \"note-highlight\", {});\n\t\tthis.update();\n\t}\n\n\tremoveNote(note) {\n\n\t\tconst index = this.reader.settings.annotations.indexOf(note);\n\t\tif (index === -1)\n\t\t\treturn;\n\n\t\tthis.notes.remove(index);\n\t\tthis.reader.settings.annotations.splice(index, 1);\n\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\tthis.update();\n\t}\n\n\tclearNotes() {\n\n\t\tthis.reader.settings.annotations.forEach(note => {\n\t\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\t});\n\t\tthis.notes.clear();\n\t\tthis.reader.settings.annotations = [];\n\t\tthis.update();\n\t}\n}","import { UIPanel, UIDiv, UIInput, UILink, UIList, UIItem, UIBox } from \"../ui.js\";\n\nexport class SearchPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\n\t\tlet searchQuery = undefined;\n\t\tconst search = new UIInput(\"search\").setId(\"nav-q\");\n\t\tsearch.dom.placeholder = strings.get(\"sidebar/search/placeholder\");\n\t\tsearch.dom.onsearch = () => {\n\n\t\t\tconst value = search.getValue();\n\n\t\t\tif (value.length === 0) {\n\t\t\t\tthis.items.clear();\n\t\t\t} else if (searchQuery !== value) {\n\t\t\t\tthis.items.clear();\n\t\t\t\tthis.doSearch(value).then(results => {\n\n\t\t\t\t\tresults.forEach(data => {\n\t\t\t\t\t\tthis.set(data);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tsearchQuery = value;\n\t\t};\n\n\t\tthis.setId(\"search\");\n\t\tthis.items = new UIList();\n\t\tcontainer.add(this.items);\n\t\tthis.add([new UIBox(search), container]);\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined;\n\t\t//\n\t\t// improvement of the highlighting of keywords is required...\n\t\t//\n\t}\n\n\t/**\n\t * Searching the entire book\n\t * @param {*} q Query keyword\n\t * @returns The search result array.\n\t */\n\tasync doSearch(q) {\n\n\t\tconst book = this.reader.book;\n\t\tconst results = await Promise.all(\n\t\t\tbook.spine.spineItems.map(item => item.load(book.load.bind(book))\n\t\t\t\t.then(item.find.bind(item, q)).finally(item.unload.bind(item))));\n\t\treturn await Promise.resolve([].concat.apply([], results));\n\t}\n\n\tset(data) {\n\n\t\tconst link = new UILink(\"#\" + data.cfi, data.excerpt);\n\t\tconst item = new UIItem();\n\t\tlink.dom.onclick = () => {\n\n\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\tthis.selector.unselect();\n\t\t\t\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(data.cfi);\n\t\t\treturn false;\n\t\t};\n\t\titem.add(link);\n\t\tthis.items.add(item);\n\t}\n}","import { UIPanel, UIRow, UISelect, UIInput, UILabel, UINumber, UIText, UIBox, UIDiv } from \"../ui.js\";\n\nexport class SettingsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tsuper.setId(\"settings\");\n\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/settings/language\",\n\t\t\t\"sidebar/settings/fontsize\",\n\t\t\t\"sidebar/settings/flow\",\n\t\t\t\"sidebar/settings/spread\",\n\t\t\t\"sidebar/settings/spread/minwidth\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.add(new UIBox(headerLabel).addClass(\"header\"));\n\n\t\tconst languageLabel = new UILabel(strings.get(keys[1]), \"language-ui\");\n\t\tconst languageRow = new UIRow();\n\t\tconst language = new UISelect().setOptions({\n\t\t\ten: \"English\",\n\t\t\tfr: \"French\",\n\t\t\tja: \"Japanese\",\n\t\t\tru: \"Russian\"\n\t\t});\n\t\tlanguage.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"languagechanged\", e.target.value);\n\t\t};\n\t\tlanguage.setId(\"language-ui\");\n\t\tlanguageRow.add(languageLabel);\n\t\tlanguageRow.add(language);\n\n\t\tconst fontSizeLabel = new UILabel(strings.get(keys[2]), \"fontsize\");\n\t\tconst fontSizeRow = new UIRow();\n\t\tconst fontSize = new UINumber(100, 1);\n\t\tfontSize.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"styleschanged\", {\n\t\t\t\tfontSize: parseInt(e.target.value)\n\t\t\t});\n\t\t};\n\t\tfontSize.setId(\"fontsize\")\n\t\tfontSizeRow.add(fontSizeLabel);\n\t\tfontSizeRow.add(fontSize);\n\n\t\t//-- flow configure --//\n\n\t\tconst flowLabel = new UILabel(strings.get(keys[3]), \"flow\");\n\t\tconst flowRow = new UIRow();\n\t\tconst flow = new UISelect().setOptions({\n\t\t\tpaginated: \"Paginated\",\n\t\t\tscrolled: \"Scrolled\"\n\t\t});\n\t\tflow.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"flowchanged\", e.target.value);\n\n\t\t\tif (e.target.value === \"scrolled\") {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: \"none\",\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: undefined,\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tflow.setId(\"flow\");\n\t\tflowRow.add(flowLabel);\n\t\tflowRow.add(flow);\n\n\t\t//-- spdead configure --//\n\n\t\tconst minSpreadWidth = new UINumber(800, 1);\n\t\tconst spreadLabel = new UILabel(strings.get(keys[4]), \"spread\");\n\t\tconst spreadRow = new UIRow();\n\t\tconst spread = new UISelect().setOptions({\n\t\t\tnone: \"None\",\n\t\t\tauto: \"Auto\"\n\t\t});\n\t\tspread.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: e.target.value,\n\t\t\t\tmin: undefined\n\t\t\t});\n\t\t\tminSpreadWidth.dom.disabled = e.target.value === \"none\";\n\t\t};\n\t\tspread.setId(\"spread\");\n\n\t\tspreadRow.add(spreadLabel);\n\t\tspreadRow.add(spread);\n\n\t\tconst minSpreadWidthLabel = new UILabel(strings.get(keys[5]), \"min-spread-width\");\n\t\tconst minSpreadWidthRow = new UIRow();\n\t\tminSpreadWidth.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: undefined,\n\t\t\t\tmin: parseInt(e.target.value)\n\t\t\t});\n\t\t};\n\t\tminSpreadWidth.setId(\"min-spread-width\");\n\t\tminSpreadWidthRow.add(minSpreadWidthLabel);\n\t\tminSpreadWidthRow.add(minSpreadWidth);\n\n\t\t//-- pagination --//\n\n\t\tconst paginationStr = strings.get(\"sidebar/settings/pagination\");\n\t\tconst paginationRow = new UIRow();\n\t\tconst pagination = new UIInput(\"checkbox\", false, paginationStr[1]);\n\t\tpagination.setId(\"pagination\");\n\t\tpagination.dom.onclick = (e) => {\n\n\t\t\t// not implemented\n\t\t};\n\n\t\tpaginationRow.add(new UILabel(paginationStr[0], \"pagination\"));\n\t\tpaginationRow.add(pagination);\n\n\t\tthis.add(new UIBox([\n\t\t\tlanguageRow,\n\t\t\tfontSizeRow,\n\t\t\tflowRow,\n\t\t\tspreadRow,\n\t\t\tminSpreadWidthRow,\n\t\t\t//paginationRow\n\t\t]));\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tlanguage.setValue(cfg.language);\n\t\t\tfontSize.setValue(cfg.styles.fontSize);\n\t\t\tflow.setValue(cfg.flow);\n\t\t\tspread.setValue(cfg.spread.mod);\n\t\t\tminSpreadWidth.setValue(cfg.spread.min);\n\t\t\tminSpreadWidth.dom.disabled = cfg.spread.mod === \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.flow === \"scrolled\") {\n\t\t\t\tspread.setValue(\"none\");\n\t\t\t\tspread.dom.disabled = true;\n\t\t\t\tminSpreadWidth.dom.disabled = true;\n\t\t\t} else {\n\t\t\t\tspread.dom.disabled = false;\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setTextContent(strings.get(keys[0]));\n\t\t\tlanguageLabel.setTextContent(strings.get(keys[1]));\n\t\t\tfontSizeLabel.setTextContent(strings.get(keys[2]));\n\t\t\tflowLabel.setTextContent(strings.get(keys[3]));\n\t\t\tspreadLabel.setTextContent(strings.get(keys[4]));\n\t\t\tminSpreadWidthLabel.setTextContent(strings.get(keys[5]));\n\t\t});\n\t}\n}","import { UIBox, UIDiv, UIItem, UIList, UIPanel, UIText } from \"../ui.js\";\n\nexport class MetadataPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst labels = {};\n\t\tconst key = \"sidebar/metadata\";\n\t\tconst label = new UIText(strings.get(key)).setClass(\"label\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\t\tlabels[key] = label;\n\n\t\tthis.items = new UIList();\n\t\tthis.setId(\"metadata\");\n\t\tthis.add(container);\n\n\t\tconst init = (prop, meta) => {\n\t\t\tif (meta[prop] === undefined ||\n\t\t\t\tmeta[prop] === null || (typeof meta[prop] === \"string\" && meta[prop].length === 0)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst item = new UIItem();\n\t\t\tconst label = new UIText().setClass(\"label\");\n\t\t\tconst value = new UIText().setClass(\"value\");\n\t\t\tlabel.setValue(strings.get(key + \"/\" + prop).toUpperCase());\n\t\t\tif (prop === \"description\") {\n\t\t\t\tvalue.dom.innerHTML = meta[prop];\n\t\t\t} else {\n\t\t\t\tvalue.setValue(meta[prop]);\n\t\t\t}\n\t\t\tlabels[key + \"/\" + prop] = label;\n\t\t\titem.add([label, value]);\n\t\t\tthis.items.add(item);\n\t\t}\n\n\t\t//-- events --//\n\n\t\treader.on(\"metadata\", (meta) => {\n\n\t\t\tthis.items.clear();\n\t\t\tcontainer.clear();\n\t\t\tcontainer.add(this.items);\n\t\t\tdocument.title = meta.title;\n\t\t\tfor (const prop in meta) {\n\t\t\t\tinit(prop, meta);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tfor (const prop in labels) {\n\t\t\t\tlet text;\n\t\t\t\tif (prop === key) {\n\t\t\t\t\ttext = strings.get(prop);\n\t\t\t\t} else {\n\t\t\t\t\ttext = strings.get(prop).toUpperCase();\n\t\t\t\t}\n\t\t\t\tlabels[prop].setValue(text);\n\t\t\t}\n\t\t});\n\t}\n}","import { UITabbedPanel, UIInput, UIDiv } from \"./ui.js\";\nimport { TocPanel } from \"./sidebar/toc.js\";\nimport { BookmarksPanel } from \"./sidebar/bookmarks.js\";\nimport { AnnotationsPanel } from \"./sidebar/annotations.js\";\nimport { SearchPanel } from \"./sidebar/search.js\";\nimport { SettingsPanel } from \"./sidebar/settings.js\";\nimport { MetadataPanel } from \"./sidebar/metadata.js\";\n\nexport class Sidebar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst controls = reader.settings;\n\t\tconst keys = [\n\t\t\t\"sidebar/close\",\n\t\t\t\"sidebar/contents\",\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/search\",\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/metadata\"\n\t\t];\n\n\t\tconst container = new UITabbedPanel(\"vertical\").setId(\"sidebar\");\n\n\t\tconst openerBox = new UIDiv().setId(\"btn-p\").addClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t\topenerBtn.dom.blur();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tcontainer.addMenu(openerBox);\n\n\t\tcontainer.addTab(\"btn-t\", strings.get(keys[1]), new TocPanel(reader));\n\t\tif (controls.bookmarks) {\n\t\t\tcontainer.addTab(\"btn-d\", strings.get(keys[2]), new BookmarksPanel(reader));\n\t\t}\n\t\tif (controls.annotations) {\n\t\t\tcontainer.addTab(\"btn-a\", strings.get(keys[3]), new AnnotationsPanel(reader));\n\t\t}\n\t\tcontainer.addTab(\"btn-s\", strings.get(keys[4]), new SearchPanel(reader));\n\t\tcontainer.addTab(\"btn-c\", strings.get(keys[5]), new SettingsPanel(reader));\n\t\tcontainer.addTab(\"btn-i\", strings.get(keys[6]), new MetadataPanel(reader));\n\t\tcontainer.select(\"btn-t\");\n\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\tif (value) {\n\t\t\t\tcontainer.setClass(\"open\");\n\t\t\t} else {\n\t\t\t\tcontainer.removeAttribute(\"class\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\t\tcontainer.setLabel(\"btn-t\", strings.get(keys[1]));\n\t\t\tif (controls.bookmarks) {\n\t\t\t\tcontainer.setLabel(\"btn-d\", strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (controls.annotations) {\n\t\t\t\tcontainer.setLabel(\"btn-a\", strings.get(keys[3]));\n\t\t\t}\n\t\t\tcontainer.setLabel(\"btn-s\", strings.get(keys[4]));\n\t\t\tcontainer.setLabel(\"btn-c\", strings.get(keys[5]));\n\t\t\tcontainer.setLabel(\"btn-i\", strings.get(keys[6]));\n\t\t});\n\t}\n}","import { uuid } from \"./utils.js\";\nimport { UIBox, UIDiv, UIInput, UILabel } from \"./ui.js\";\n\nexport class NoteDlg {\n\n constructor(reader) {\n\n const container = new UIDiv().setId(\"notedlg\");\n const strings = reader.strings;\n const keys = [\n \"notedlg/label\",\n \"notedlg/add\"\n ];\n const label = new UILabel(strings.get(keys[0]), \"note-input\");\n const textBox = new UIInput(\"text\", \"\").setId(\"note-input\");\n textBox.dom.oninput = (e) => {\n\n this.update();\n e.preventDefault();\n };\n\n const addBtn = new UIInput(\"button\", strings.get(keys[1]));\n addBtn.dom.disabled = true;\n addBtn.dom.onclick = (e) => {\n\n const note = {\n cfi: this.cfi,\n date: new Date(),\n text: textBox.getValue(),\n uuid: uuid()\n };\n this.range = undefined;\n reader.settings.annotations.push(note);\n reader.emit(\"noteadded\", note);\n container.removeAttribute(\"class\");\n e.preventDefault();\n addBtn.dom.blur();\n };\n\n this.update = () => {\n\n addBtn.dom.disabled = !(this.range && textBox.getValue().length > 0);\n };\n\n container.add(new UIBox([label, textBox, addBtn]).addClass(\"control\"));\n document.body.appendChild(container.dom);\n\n //-- events --//\n\n reader.on(\"selected\", (cfi, contents) => {\n\n this.cfi = cfi;\n this.range = contents.range(cfi);\n this.update();\n container.setClass(\"open\");\n textBox.setValue(\"\");\n });\n\n reader.on(\"unselected\", () => {\n\n this.range = undefined;\n this.update();\n container.removeAttribute(\"class\");\n });\n\n reader.on(\"languagechanged\", (value) => {\n\n label.setTextContent(strings.get(keys[0]));\n addBtn.setValue(strings.get(keys[1]));\n });\n }\n}","import EventEmitter from \"event-emitter\";\n\nimport { extend, detectMobile } from \"./utils.js\";\nimport { Storage } from \"./storage.js\";\nimport { Strings } from \"./strings.js\";\nimport { Toolbar } from \"./toolbar.js\";\nimport { Content } from \"./content.js\";\nimport { Sidebar } from \"./sidebar.js\";\nimport { NoteDlg } from \"./notedlg.js\";\n\nexport class Reader {\n\n\tconstructor(bookPath, settings) {\n\n\t\tconst preinit = (data) => {\n\t\t\tconst url = new URL(window.location);\n\t\t\tlet path = bookPath;\n\t\t\tif (settings && !settings.openbook) {\n\t\t\t\tpath = bookPath;\n\t\t\t\tif (data) this.storage.clear();\n\t\t\t} else if (data && url.search.length === 0) {\n\t\t\t\tpath = data;\n\t\t\t}\n\t\t\tthis.cfgInit(path, settings);\n\t\t\tthis.strings = new Strings(this);\n\t\t\tthis.toolbar = new Toolbar(this);\n\t\t\tthis.content = new Content(this);\n\t\t\tthis.sidebar = new Sidebar(this);\n\t\t\tif (this.settings.annotations) {\n\t\t\t\tthis.notedlg = new NoteDlg(this);\n\t\t\t}\n\t\t\tthis.init();\n\t\t}\n\n\t\tthis.settings = undefined;\n\t\tthis.isMobile = detectMobile();\n\t\tthis.storage = new Storage();\n\t\tconst openbook = settings && settings.openbook;\n\n\t\tif (this.storage.indexedDB && (!settings || openbook)) {\n\t\t\tthis.storage.init(() => this.storage.get((data) => preinit(data)));\n\t\t} else {\n\t\t\tpreinit();\n\t\t}\n\n\t\twindow.onbeforeunload = this.unload.bind(this);\n\t\twindow.onhashchange = this.hashChanged.bind(this);\n\t\twindow.onkeydown = this.keyboardHandler.bind(this);\n\t\twindow.onwheel = (e) => {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Initialize book.\n\t * @param {*} bookPath\n\t * @param {*} settings\n\t */\n\tinit(bookPath, settings) {\n\n\t\tthis.emit(\"viewercleanup\");\n\t\tthis.navItems = {};\n\n\t\tif (arguments.length > 0) {\n\n\t\t\tthis.cfgInit(bookPath, settings);\n\t\t}\n\n\t\tthis.book = ePub(this.settings.bookPath);\n\t\tthis.rendition = this.book.renderTo(\"viewer\", {\n\t\t\tmanager: this.settings.manager,\n\t\t\tflow: this.settings.flow,\n\t\t\tspread: this.settings.spread.mod,\n\t\t\tminSpreadWidth: this.settings.spread.min,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tsnap: true\n\t\t});\n\n\t\tconst cfi = this.settings.previousLocationCfi;\n\t\tif (cfi) {\n\t\t\tthis.displayed = this.rendition.display(cfi);\n\t\t} else {\n\t\t\tthis.displayed = this.rendition.display();\n\t\t}\n\n\t\tthis.displayed.then((renderer) => {\n\t\t\tthis.emit(\"displayed\", renderer, this.settings);\n\t\t});\n\n\t\tthis.book.ready.then(() => {\n\t\t\tthis.emit(\"bookready\", this.settings);\n\t\t}).then(() => {\n\t\t\tthis.emit(\"bookloaded\");\n\t\t});\n\n\t\tthis.book.loaded.metadata.then((meta) => {\n\t\t\tthis.emit(\"metadata\", meta);\n\t\t});\n\n\t\tthis.book.loaded.navigation.then((toc) => {\n\t\t\tthis.emit(\"navigation\", toc);\n\t\t});\n\n\t\tthis.rendition.on(\"click\", (e) => {\n\t\t\tconst selection = e.view.document.getSelection();\n\t\t\tif (selection.type !== \"Range\") {\n\t\t\t\tthis.emit(\"unselected\");\n\t\t\t}\n\t\t});\n\n\t\tthis.rendition.on(\"layout\", (props) => {\n\t\t\tthis.emit(\"layout\", props);\n\t\t});\n\n\t\tthis.rendition.on(\"selected\", (cfiRange, contents) => {\n\t\t\tthis.setLocation(cfiRange);\n\t\t\tthis.emit(\"selected\", cfiRange, contents);\n\t\t});\n\n\t\tthis.rendition.on(\"relocated\", (location) => {\n\t\t\tthis.setLocation(location.start.cfi);\n\t\t\tthis.emit(\"relocated\", location);\n\t\t});\n\n\t\tthis.rendition.on(\"keydown\", this.keyboardHandler.bind(this));\n\n\t\tthis.on(\"prev\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.next();\n\t\t\t} else {\n\t\t\t\tthis.rendition.prev();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"next\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.prev();\n\t\t\t} else {\n\t\t\t\tthis.rendition.next();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"languagechanged\", (value) => {\n\t\t\tthis.settings.language = value;\n\t\t});\n\n\t\tthis.on(\"flowchanged\", (value) => {\n\t\t\tthis.settings.flow = value;\n\t\t\tthis.rendition.flow(value);\n\t\t});\n\n\t\tthis.on(\"spreadchanged\", (value) => {\n\t\t\tconst mod = value.mod || this.settings.spread.mod;\n\t\t\tconst min = value.min || this.settings.spread.min;\n\t\t\tthis.settings.spread.mod = mod;\n\t\t\tthis.settings.spread.min = min;\n\t\t\tthis.rendition.spread(mod, min);\n\t\t});\n\n\t\tthis.on(\"styleschanged\", (value) => {\n\t\t\tconst fontSize = value.fontSize;\n\t\t\tthis.settings.styles.fontSize = fontSize;\n\t\t\tthis.rendition.themes.fontSize(fontSize + \"%\");\n\t\t});\n\t}\n\n\t/* ------------------------------- Common ------------------------------- */\n\n\tnavItemFromCfi(cfi) {\n\n\t\t// This feature was added to solve the problem of duplicate titles in \n\t\t// bookmarks. But this still has no solution because when reloading the \n\t\t// reader, rendition cannot get the range from the previously saved CFI.\n\t\tconst range = this.rendition.getRange(cfi);\n\t\tconst idref = range ? range.startContainer.parentNode.id : undefined;\n\t\tconst location = this.rendition.currentLocation();\n\t\tconst href = location.start.href;\n\t\treturn this.navItems[href + \"#\" + idref] || this.navItems[href];\n\t}\n\n\t/* ------------------------------ Bookmarks ----------------------------- */\n\n\t/**\n\t * Verifying the current page in bookmarks.\n\t * @param {*} cfi\n\t * @returns The index of the bookmark if it exists, or -1 otherwise.\n\t */\n\tisBookmarked(cfi) {\n\n\t\treturn this.settings.bookmarks.indexOf(cfi);\n\t}\n\n\t/* ----------------------------- Annotations ---------------------------- */\n\n\tisAnnotated(note) {\n\n\t\treturn this.settings.annotations.indexOf(note);\n\t}\n\n\t/* ------------------------------ Settings ------------------------------ */\n\n\t/**\n\t * Initialize book settings.\n\t * @param {any} bookPath\n\t * @param {any} settings\n\t */\n\tcfgInit(bookPath, settings) {\n\n\t\tthis.entryKey = md5(bookPath).toString();\n\t\tthis.settings = {\n\t\t\tbookPath: bookPath,\n\t\t\tarrows: this.isMobile ? \"none\" : \"content\", // none | content | toolbar\n\t\t\tmanager: this.isMobile ? \"continuous\" : \"default\",\n\t\t\trestore: true,\n\t\t\thistory: true,\n\t\t\topenbook: this.storage.indexedDB ? true : false,\n\t\t\tlanguage: \"en\",\n\t\t\tsectionId: undefined,\n\t\t\tbookmarks: [], // array | false\n\t\t\tannotations: [], // array | false\n\t\t\tflow: \"paginated\", // paginated | scrolled\n\t\t\tspread: {\n\t\t\t\tmod: \"auto\", // auto | none\n\t\t\t\tmin: 800\n\t\t\t},\n\t\t\tstyles: {\n\t\t\t\tfontSize: 100\n\t\t\t},\n\t\t\tpagination: undefined, // not implemented\n\t\t\tfullscreen: document.fullscreenEnabled\n\t\t};\n\n\t\textend(settings || {}, this.settings);\n\n\t\tif (this.settings.restore) {\n\t\t\tthis.applySavedSettings(settings || {});\n\t\t} else {\n\t\t\tthis.removeSavedSettings();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the book setting can be retrieved from localStorage.\n\t * @returns true if the book key exists, or false otherwise.\n\t */\n\tisSaved() {\n\n\t\treturn localStorage && localStorage.getItem(this.entryKey) !== null;\n\t}\n\n\t/**\n\t * Removing the current book settings from local storage.\n\t * @returns true if the book settings were deleted successfully, or false\n\t * otherwise.\n\t */\n\tremoveSavedSettings() {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlocalStorage.removeItem(this.entryKey);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Applies saved settings from local storage.\n\t * @param {*} external External settings\n\t * @returns True if the settings were applied successfully, false otherwise.\n\t */\n\tapplySavedSettings(external) {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlet stored;\n\t\ttry {\n\t\t\tstored = JSON.parse(localStorage.getItem(this.entryKey));\n\t\t} catch (e) {\n\t\t\tconsole.exception(e);\n\t\t}\n\n\t\tif (stored) {\n\t\t\textend(stored, this.settings, external);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Saving the current book settings in local storage.\n\t */\n\tsaveSettings() {\n\n\t\tthis.settings.previousLocationCfi = this.rendition.location.start.cfi;\n\t\tconst cfg = Object.assign({}, this.settings);\n\t\tdelete cfg.arrows;\n\t\tdelete cfg.manager;\n\t\tdelete cfg.history;\n\t\tdelete cfg.restore;\n\t\tdelete cfg.openbook;\n\t\tdelete cfg.pagination;\n\t\tdelete cfg.fullscreen;\n\t\tlocalStorage.setItem(this.entryKey, JSON.stringify(cfg));\n\t}\n\n\tsetLocation(cfi) {\n\n\t\tconst baseUrl = this.book.archived ? undefined : this.book.url;\n\t\tconst url = new URL(window.location, baseUrl);\n\t\turl.hash = \"#\" + cfi;\n\n\t\t// Update the History Location\n\t\tif (this.settings.history && window.location.hash !== url.hash) {\n\t\t\t// Add CFI fragment to the history\n\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\tthis.currentLocationCfi = cfi;\n\t\t}\n\t}\n\n\t//-- event handlers --//\n\n\tunload() {\n\n\t\tif (this.settings.restore && localStorage) {\n\t\t\tthis.saveSettings();\n\t\t}\n\t}\n\n\thashChanged() {\n\n\t\tconst hash = window.location.hash.slice(1);\n\t\tthis.rendition.display(hash);\n\t}\n\n\tkeyboardHandler(e) {\n\n\t\tconst step = 2;\n\t\tlet value = this.settings.styles.fontSize;\n\n\t\tswitch (e.key) {\n\n\t\t\tcase \"=\":\n\t\t\tcase \"+\":\n\t\t\t\tvalue += step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"-\":\n\t\t\t\tvalue -= step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"0\":\n\t\t\t\tvalue = 100;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tthis.emit(\"prev\");\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tthis.emit(\"next\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nEventEmitter(Reader.prototype);"],"names":["isValue","isPlainFunction","assign","normalizeOpts","contains","module","exports","dscr","value","c","e","w","options","desc","arguments","length","call","configurable","enumerable","writable","gs","get","set","undefined","Object","obj","foo","bar","trzy","keys","max","Math","dest","src","error","i","key","forEach","_undefined","val","object","Array","prototype","create","opts1","result","process","fn","TypeError","String","str","indexOf","searchString","this","on","once","off","emit","methods","descriptors","base","d","callable","apply","Function","defineProperty","defineProperties","hasOwnProperty","descriptor","type","listener","self","__eeOnceListener__","data","__ee__","push","listeners","candidate","splice","l","args","slice","o","isPrototype","possibleTypes","isFunction","classRe","functionToString","toString","test","isObject","constructor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","prop","r","Symbol","toStringTag","q","dst","ext","extend","uuid","Date","getTime","replace","random","floor","Storage","name","version","db","indexedDB","window","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","console","init","callback","time","now","onerror","request","open","onupgradeneeded","target","objectStoreNames","createObjectStore","onsuccess","log","transaction","objectStore","put","clear","Strings","reader","language","settings","values","en","fr","ja","ru","ERROR_MSG","UIElement","tag","dom","document","createElement","add","argument","appendChild","isArray","j","element","remove","removeChild","Number","isInteger","childNodes","children","lastChild","setId","id","getId","removeAttribute","setClass","className","addClass","classList","removeClass","setStyle","style","getTitle","title","setTitle","getTextContent","textContent","setTextContent","text","getBoundingClientRect","UISpan","super","UIDiv","UIRow","UIPanel","UILabel","htmlFor","UILink","href","setHref","url","UIText","getValue","setValue","UISelect","setMultiple","boolean","multiple","setOptions","selected","option","UIInput","onkeydown","stopPropagation","getName","setName","getType","setType","UINumber","step","min","precision","onchange","setPrecision","setRange","setStep","parseFloat","toFixed","UITabbedPanel","align","tabs","panels","selector","menuDiv","tabsDiv","panelsDiv","addMenu","items","addTab","label","tab","UITab","panel","select","transformSelector","display","setLabel","size","rect","width","transform","height","parent","button","onclick","preventDefault","UIList","expanded","expand","collaps","UIItem","len","box","unselect","UIBox","Toolbar","strings","container","menu1","openerBox","openerBtn","prevBox","prevBtn","nextBox","nextBtn","blur","arrows","menu2","openbookBtn","bookmarkBox","bookmarkBtn","fullscreenBtn","openbook","onload","storage","unload","URL","location","origin","history","pushState","openbookBox","accept","files","FileReader","readAsArrayBuffer","alert","bookmarks","cfi","locationCfi","isBookmarked","fullscreen","fullscreenBox","toggleFullScreen","onfullscreenchange","screen","clientWidth","h","clientHeight","body","start","atStart","atEnd","activeElement","fullscreenElement","documentElement","requestFullscreen","exitFullscreen","Content","prev","viewer","next","loader","divider","overlay","cfg","flow","props","spread","spreadWidth","setTimeout","TocPanel","toc","generateToc","list","chapter","link","item","ibtn","sectionId","rendition","navItems","subitems","subItems","BookmarksPanel","headerLabel","clearBtn","clearBookmarks","update","disabled","renderer","setBookmark","appendBookmark","removeBookmark","_cfi","index","btnr","navItem","navItemFromCfi","idref","spineItem","book","spine","AnnotationsPanel","clearNotes","notes","annotations","note","removeNote","SearchPanel","searchQuery","search","placeholder","onsearch","doSearch","then","results","Promise","all","spineItems","map","load","bind","find","finally","resolve","concat","excerpt","SettingsPanel","languageLabel","languageRow","fontSizeLabel","fontSizeRow","fontSize","parseInt","flowLabel","flowRow","paginated","scrolled","mod","minSpreadWidth","spreadLabel","spreadRow","none","auto","minSpreadWidthLabel","minSpreadWidthRow","paginationStr","paginationRow","pagination","styles","MetadataPanel","labels","meta","toUpperCase","innerHTML","Sidebar","controls","NoteDlg","textBox","oninput","addBtn","date","range","contents","Reader","bookPath","preinit","path","cfgInit","toolbar","content","sidebar","notedlg","isMobile","some","navigator","userAgent","match","onbeforeunload","onhashchange","hashChanged","keyboardHandler","onwheel","ctrlKey","ePub","renderTo","manager","snap","previousLocationCfi","displayed","ready","loaded","metadata","navigation","view","getSelection","cfiRange","setLocation","package","direction","themes","getRange","startContainer","parentNode","currentLocation","isAnnotated","entryKey","md5","restore","fullscreenEnabled","applySavedSettings","removeSavedSettings","isSaved","localStorage","getItem","removeItem","external","stored","JSON","parse","exception","saveSettings","setItem","stringify","baseUrl","archived","hash","currentLocationCfi"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/epubreader.min.js","mappings":"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","sources":["webpack://epubreader-js/./node_modules/d/index.js","webpack://epubreader-js/./node_modules/es5-ext/function/noop.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/assign/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/is-value.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/index.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/object/keys/shim.js","webpack://epubreader-js/./node_modules/es5-ext/object/normalize-options.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-callable.js","webpack://epubreader-js/./node_modules/es5-ext/object/valid-value.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/index.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/is-implemented.js","webpack://epubreader-js/./node_modules/es5-ext/string/\u0000#/contains/shim.js","webpack://epubreader-js/./node_modules/event-emitter/index.js","webpack://epubreader-js/./node_modules/type/function/is.js","webpack://epubreader-js/./node_modules/type/object/is.js","webpack://epubreader-js/./node_modules/type/plain-function/is.js","webpack://epubreader-js/./node_modules/type/prototype/is.js","webpack://epubreader-js/./node_modules/type/value/is.js","webpack://epubreader-js/webpack/bootstrap","webpack://epubreader-js/webpack/runtime/define property getters","webpack://epubreader-js/webpack/runtime/hasOwnProperty shorthand","webpack://epubreader-js/webpack/runtime/make namespace object","webpack://epubreader-js/./src/utils.js","webpack://epubreader-js/./src/storage.js","webpack://epubreader-js/./src/strings.js","webpack://epubreader-js/./src/ui.js","webpack://epubreader-js/./src/sidebar/search.js","webpack://epubreader-js/./src/toolbar.js","webpack://epubreader-js/./src/content.js","webpack://epubreader-js/./src/sidebar/toc.js","webpack://epubreader-js/./src/sidebar/bookmarks.js","webpack://epubreader-js/./src/sidebar/annotations.js","webpack://epubreader-js/./src/sidebar/settings.js","webpack://epubreader-js/./src/sidebar/metadata.js","webpack://epubreader-js/./src/sidebar.js","webpack://epubreader-js/./src/notedlg.js","webpack://epubreader-js/./src/status.js","webpack://epubreader-js/./src/reader.js"],"sourcesContent":["\"use strict\";\n\nvar isValue = require(\"type/value/is\")\n , isPlainFunction = require(\"type/plain-function/is\")\n , assign = require(\"es5-ext/object/assign\")\n , normalizeOpts = require(\"es5-ext/object/normalize-options\")\n , contains = require(\"es5-ext/string/#/contains\");\n\nvar d = (module.exports = function (dscr, value/*, options*/) {\n\tvar c, e, w, options, desc;\n\tif (arguments.length < 2 || typeof dscr !== \"string\") {\n\t\toptions = value;\n\t\tvalue = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[2];\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t\tw = contains.call(dscr, \"w\");\n\t} else {\n\t\tc = w = true;\n\t\te = false;\n\t}\n\n\tdesc = { value: value, configurable: c, enumerable: e, writable: w };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n});\n\nd.gs = function (dscr, get, set/*, options*/) {\n\tvar c, e, options, desc;\n\tif (typeof dscr !== \"string\") {\n\t\toptions = set;\n\t\tset = get;\n\t\tget = dscr;\n\t\tdscr = null;\n\t} else {\n\t\toptions = arguments[3];\n\t}\n\tif (!isValue(get)) {\n\t\tget = undefined;\n\t} else if (!isPlainFunction(get)) {\n\t\toptions = get;\n\t\tget = set = undefined;\n\t} else if (!isValue(set)) {\n\t\tset = undefined;\n\t} else if (!isPlainFunction(set)) {\n\t\toptions = set;\n\t\tset = undefined;\n\t}\n\tif (isValue(dscr)) {\n\t\tc = contains.call(dscr, \"c\");\n\t\te = contains.call(dscr, \"e\");\n\t} else {\n\t\tc = true;\n\t\te = false;\n\t}\n\n\tdesc = { get: get, set: set, configurable: c, enumerable: e };\n\treturn !options ? desc : assign(normalizeOpts(options), desc);\n};\n","\"use strict\";\n\n// eslint-disable-next-line no-empty-function\nmodule.exports = function () {};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.assign : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\tvar assign = Object.assign, obj;\n\tif (typeof assign !== \"function\") return false;\n\tobj = { foo: \"raz\" };\n\tassign(obj, { bar: \"dwa\" }, { trzy: \"trzy\" });\n\treturn obj.foo + obj.bar + obj.trzy === \"razdwatrzy\";\n};\n","\"use strict\";\n\nvar keys = require(\"../keys\")\n , value = require(\"../valid-value\")\n , max = Math.max;\n\nmodule.exports = function (dest, src /*, …srcn*/) {\n\tvar error, i, length = max(arguments.length, 2), assign;\n\tdest = Object(value(dest));\n\tassign = function (key) {\n\t\ttry {\n\t\t\tdest[key] = src[key];\n\t\t} catch (e) {\n\t\t\tif (!error) error = e;\n\t\t}\n\t};\n\tfor (i = 1; i < length; ++i) {\n\t\tsrc = arguments[i];\n\t\tkeys(src).forEach(assign);\n\t}\n\tif (error !== undefined) throw error;\n\treturn dest;\n};\n","\"use strict\";\n\nvar _undefined = require(\"../function/noop\")(); // Support ES3 engines\n\nmodule.exports = function (val) { return val !== _undefined && val !== null; };\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? Object.keys : require(\"./shim\");\n","\"use strict\";\n\nmodule.exports = function () {\n\ttry {\n\t\tObject.keys(\"primitive\");\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\nvar isValue = require(\"../is-value\");\n\nvar keys = Object.keys;\n\nmodule.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nvar forEach = Array.prototype.forEach, create = Object.create;\n\nvar process = function (src, obj) {\n\tvar key;\n\tfor (key in src) obj[key] = src[key];\n};\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = function (opts1 /*, …options*/) {\n\tvar result = create(null);\n\tforEach.call(arguments, function (options) {\n\t\tif (!isValue(options)) return;\n\t\tprocess(Object(options), result);\n\t});\n\treturn result;\n};\n","\"use strict\";\n\nmodule.exports = function (fn) {\n\tif (typeof fn !== \"function\") throw new TypeError(fn + \" is not a function\");\n\treturn fn;\n};\n","\"use strict\";\n\nvar isValue = require(\"./is-value\");\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) throw new TypeError(\"Cannot use null or undefined\");\n\treturn value;\n};\n","\"use strict\";\n\nmodule.exports = require(\"./is-implemented\")() ? String.prototype.contains : require(\"./shim\");\n","\"use strict\";\n\nvar str = \"razdwatrzy\";\n\nmodule.exports = function () {\n\tif (typeof str.contains !== \"function\") return false;\n\treturn str.contains(\"dwa\") === true && str.contains(\"foo\") === false;\n};\n","\"use strict\";\n\nvar indexOf = String.prototype.indexOf;\n\nmodule.exports = function (searchString /*, position*/) {\n\treturn indexOf.call(this, searchString, arguments[1]) > -1;\n};\n","'use strict';\n\nvar d = require('d')\n , callable = require('es5-ext/object/valid-callable')\n\n , apply = Function.prototype.apply, call = Function.prototype.call\n , create = Object.create, defineProperty = Object.defineProperty\n , defineProperties = Object.defineProperties\n , hasOwnProperty = Object.prototype.hasOwnProperty\n , descriptor = { configurable: true, enumerable: false, writable: true }\n\n , on, once, off, emit, methods, descriptors, base;\n\non = function (type, listener) {\n\tvar data;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) {\n\t\tdata = descriptor.value = create(null);\n\t\tdefineProperty(this, '__ee__', descriptor);\n\t\tdescriptor.value = null;\n\t} else {\n\t\tdata = this.__ee__;\n\t}\n\tif (!data[type]) data[type] = listener;\n\telse if (typeof data[type] === 'object') data[type].push(listener);\n\telse data[type] = [data[type], listener];\n\n\treturn this;\n};\n\nonce = function (type, listener) {\n\tvar once, self;\n\n\tcallable(listener);\n\tself = this;\n\ton.call(this, type, once = function () {\n\t\toff.call(self, type, once);\n\t\tapply.call(listener, this, arguments);\n\t});\n\n\tonce.__eeOnceListener__ = listener;\n\treturn this;\n};\n\noff = function (type, listener) {\n\tvar data, listeners, candidate, i;\n\n\tcallable(listener);\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return this;\n\tdata = this.__ee__;\n\tif (!data[type]) return this;\n\tlisteners = data[type];\n\n\tif (typeof listeners === 'object') {\n\t\tfor (i = 0; (candidate = listeners[i]); ++i) {\n\t\t\tif ((candidate === listener) ||\n\t\t\t\t\t(candidate.__eeOnceListener__ === listener)) {\n\t\t\t\tif (listeners.length === 2) data[type] = listeners[i ? 0 : 1];\n\t\t\t\telse listeners.splice(i, 1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ((listeners === listener) ||\n\t\t\t\t(listeners.__eeOnceListener__ === listener)) {\n\t\t\tdelete data[type];\n\t\t}\n\t}\n\n\treturn this;\n};\n\nemit = function (type) {\n\tvar i, l, listener, listeners, args;\n\n\tif (!hasOwnProperty.call(this, '__ee__')) return;\n\tlisteners = this.__ee__[type];\n\tif (!listeners) return;\n\n\tif (typeof listeners === 'object') {\n\t\tl = arguments.length;\n\t\targs = new Array(l - 1);\n\t\tfor (i = 1; i < l; ++i) args[i - 1] = arguments[i];\n\n\t\tlisteners = listeners.slice();\n\t\tfor (i = 0; (listener = listeners[i]); ++i) {\n\t\t\tapply.call(listener, this, args);\n\t\t}\n\t} else {\n\t\tswitch (arguments.length) {\n\t\tcase 1:\n\t\t\tcall.call(listeners, this);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tcall.call(listeners, this, arguments[1]);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tcall.call(listeners, this, arguments[1], arguments[2]);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tl = arguments.length;\n\t\t\targs = new Array(l - 1);\n\t\t\tfor (i = 1; i < l; ++i) {\n\t\t\t\targs[i - 1] = arguments[i];\n\t\t\t}\n\t\t\tapply.call(listeners, this, args);\n\t\t}\n\t}\n};\n\nmethods = {\n\ton: on,\n\tonce: once,\n\toff: off,\n\temit: emit\n};\n\ndescriptors = {\n\ton: d(on),\n\tonce: d(once),\n\toff: d(off),\n\temit: d(emit)\n};\n\nbase = defineProperties({}, descriptors);\n\nmodule.exports = exports = function (o) {\n\treturn (o == null) ? create(base) : defineProperties(Object(o), descriptors);\n};\nexports.methods = methods;\n","\"use strict\";\n\nvar isPrototype = require(\"../prototype/is\");\n\nmodule.exports = function (value) {\n\tif (typeof value !== \"function\") return false;\n\n\tif (!hasOwnProperty.call(value, \"length\")) return false;\n\n\ttry {\n\t\tif (typeof value.length !== \"number\") return false;\n\t\tif (typeof value.call !== \"function\") return false;\n\t\tif (typeof value.apply !== \"function\") return false;\n\t} catch (error) {\n\t\treturn false;\n\t}\n\n\treturn !isPrototype(value);\n};\n","\"use strict\";\n\nvar isValue = require(\"../value/is\");\n\n// prettier-ignore\nvar possibleTypes = { \"object\": true, \"function\": true, \"undefined\": true /* document.all */ };\n\nmodule.exports = function (value) {\n\tif (!isValue(value)) return false;\n\treturn hasOwnProperty.call(possibleTypes, typeof value);\n};\n","\"use strict\";\n\nvar isFunction = require(\"../function/is\");\n\nvar classRe = /^\\s*class[\\s{/}]/, functionToString = Function.prototype.toString;\n\nmodule.exports = function (value) {\n\tif (!isFunction(value)) return false;\n\tif (classRe.test(functionToString.call(value))) return false;\n\treturn true;\n};\n","\"use strict\";\n\nvar isObject = require(\"../object/is\");\n\nmodule.exports = function (value) {\n\tif (!isObject(value)) return false;\n\ttry {\n\t\tif (!value.constructor) return false;\n\t\treturn value.constructor.prototype === value;\n\t} catch (error) {\n\t\treturn false;\n\t}\n};\n","\"use strict\";\n\n// ES3 safe\nvar _undefined = void 0;\n\nmodule.exports = function (value) { return value !== _undefined && value !== null; };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const d = (obj, prop) => obj ? obj[prop] : undefined\n\nconst q = (src, dst, ext, prop) => {\n let val\n if (typeof dst[prop] === \"boolean\") {\n switch (prop) {\n case \"annotations\":\n case \"bookmarks\":\n val = dst[prop] ? src[prop] : dst[prop]\n break;\n default:\n val = dst[prop]\n break;\n }\n } else if (prop === \"arrows\") {\n val = dst[prop]\n } else {\n val = d(ext, prop) === undefined ? src[prop] : dst[prop]\n }\n return val\n}\n\nexport const extend = (src, dst, ext) => {\n for (let prop in src) {\n if (prop === \"bookPath\") {\n continue\n } else if (dst[prop] instanceof Array) {\n dst[prop] = ext ? (src[prop] ? src[prop] : dst[prop]) : src[prop]\n } else if (dst[prop] instanceof Object) {\n extend(src[prop], dst[prop], d(ext, prop)) // recursive call\n } else {\n dst[prop] = ext ? q(src, dst, ext, prop) : src[prop]\n }\n }\n}\n\nexport const uuid = () => {\n let d = new Date().getTime()\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n let r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === \"x\" ? r : (r & 0x7 | 0x8)).toString(16)\n })\n return uuid\n}\n\nexport const detectMobile = () => {\n const matches = [\n /Android/i,\n /BlackBerry/i,\n /iPhone/i,\n /iPad/i,\n /iPod/i,\n /Windows Phone/i,\n /webOS/i\n ]\n return matches.some((i) => navigator.userAgent.match(i))\n}","export class Storage {\n\n\tconstructor() {\n\n\t\tthis.name = \"epubreader-js\";\n\t\tthis.version = 1.0;\n\t\tthis.db;\n\t\tthis.indexedDB = window.indexedDB ||\n\t\t\twindow.webkitIndexedDB ||\n\t\t\twindow.mozIndexedDB ||\n\t\t\twindow.OIndexedDB ||\n\t\t\twindow.msIndexedDB;\n\n\t\tif (this.indexedDB === undefined) {\n\n\t\t\tconsole.error(\"The IndexedDB API not available in your browser.\");\n\t\t}\n\t}\n\n\tinit(callback) {\n\n\t\tif (this.indexedDB === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst onerror = (e) => console.error(\"IndexedDB\", e);\n\t\tconst request = indexedDB.open(this.name, this.version);\n\t\trequest.onupgradeneeded = (e) => {\n\n\t\t\tconst db = e.target.result;\n\t\t\tif (db.objectStoreNames.contains(\"entries\") === false) {\n\t\t\t\tdb.createObjectStore(\"entries\");\n\t\t\t}\n\t\t}\n\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tthis.db = e.target.result;\n\t\t\tthis.db.onerror = onerror;\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.init: ${Date.now() - time} ms`);\n\t\t}\n\n\t\trequest.onerror = onerror;\n\t}\n\n\tget(callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.get(0);\n\t\trequest.onsuccess = (e) => {\n\n\t\t\tcallback(e.target.result);\n\t\t\tconsole.log(`storage.get: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tset(data, callback) {\n\n\t\tif (this.db === undefined) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.put(data, 0);\n\t\trequest.onsuccess = () => {\n\n\t\t\tcallback();\n\t\t\tconsole.log(`storage.set: ${Date.now() - time} ms`);\n\t\t}\n\t}\n\n\tclear() {\n\n\t\tif (this.db === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst time = Date.now();\n\t\tconst transaction = this.db.transaction([\"entries\"], \"readwrite\");\n\t\tconst objectStore = transaction.objectStore(\"entries\");\n\t\tconst request = objectStore.clear();\n\t\trequest.onsuccess = () => {\n\n\t\t\tconsole.log(`storage.clear: ${Date.now() - time} ms`);\n\t\t}\n\t}\n}","export class Strings {\n\n\tconstructor(reader) {\n\n\t\tthis.language = reader.settings.language || \"en\";\n\t\tthis.values = {\n\t\t\ten: {\n\t\t\t\t\"toolbar/sidebar\": \"Sidebar\",\n\t\t\t\t\"toolbar/prev\": \"Previous page\",\n\t\t\t\t\"toolbar/next\": \"Next page\",\n\t\t\t\t\"toolbar/openbook\": \"Open book\",\n\t\t\t\t\"toolbar/openbook/error\": \"Your browser does not support the required features.\\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Add this page to bookmarks\",\n\t\t\t\t\"toolbar/fullscreen\": \"Fullscreen\",\n\t\t\t\t\"toolbar/background\": \"Change background\",\n\n\t\t\t\t\"sidebar/close\": \"Close Sidebar\",\n\t\t\t\t\"sidebar/contents\": \"Contents\",\n\t\t\t\t\"sidebar/bookmarks\": \"Bookmarks\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Add\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Remove\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Add\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Remove\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Clear\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Anchor\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Cancel\",\n\t\t\t\t\"sidebar/search\": \"Search\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Search\",\n\t\t\t\t\"sidebar/settings\": \"Settings\",\n\t\t\t\t\"sidebar/settings/language\": \"Language\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Font size (%)\",\n\t\t\t\t\"sidebar/settings/flow\": \"Flow\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Generate pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Spread\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Minimum spread width\",\n\t\t\t\t\"sidebar/metadata\": \"Metadata\",\n\t\t\t\t\"sidebar/metadata/title\": \"Title\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Creator\",\n\t\t\t\t\"sidebar/metadata/description\": \"Description\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Pubdate\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Publisher\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Identifier\",\n\t\t\t\t\"sidebar/metadata/language\": \"Language\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Rights\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Modified date\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Layout\", // rendition:layout\n\t\t\t\t\"sidebar/metadata/flow\": \"Flow\", // rendition:flow\n\t\t\t\t\"sidebar/metadata/spread\": \"Spread\", // rendition:spread\n\t\t\t\t\"sidebar/metadata/direction\": \"Direction\", // page-progression-direction\n\n\t\t\t\t\"notedlg/label\": \"Note\",\n\t\t\t\t\"notedlg/add\": \"Add\",\n\n\t\t\t\t\"status/fullscreen\": \"Fullscreen\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\t\"toolbar/sidebar\": \"Barre latérale\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"Ouvrir un livre local\",\n\t\t\t\t\"toolbar/openbook/error\": \"Votre navigateur ne prend pas en charge les fonctions nécessaires.\\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Insérer un marque page ici\",\n\t\t\t\t\"toolbar/fullscreen\": \"Plein écran\",\n\t\t\t\t\"toolbar/background\": \"Changer l'arrière-plan\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"Sommaire\",\n\t\t\t\t\"sidebar/bookmarks\": \"Marque-pages\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations\": \"Annotations\",\n\t\t\t\t\"sidebar/annotations/add\": \"Ajouter\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Retirer\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Tout enlever\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Ancre\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Annuler\",\n\t\t\t\t\"sidebar/search\": \"Rechercher\",\n\t\t\t\t\"sidebar/search/placeholder\": \"rechercher\",\n\t\t\t\t\"sidebar/settings\": \"Réglages\",\n\t\t\t\t\"sidebar/settings/language\": \"Langue\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Pagination\", \"Établir une pagination\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"Langue\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"Ajouter\",\n\n\t\t\t\t\"status/fullscreen\": \"\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tja: {\n\t\t\t\t\"toolbar/sidebar\": \"サイドバー\",\n\t\t\t\t\"toolbar/prev\": \"???\",\n\t\t\t\t\"toolbar/next\": \"???\",\n\t\t\t\t\"toolbar/openbook\": \"本を開く\",\n\t\t\t\t\"toolbar/openbook/error\": \"ご利用のブラウザは必要な機能をサポートしていません。\\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。\",\n\t\t\t\t\"toolbar/bookmark\": \"このページに栞を設定する\",\n\t\t\t\t\"toolbar/fullscreen\": \"フルスクリーン\",\n\t\t\t\t\"toolbar/background\": \"背景を変更する\",\n\n\t\t\t\t\"sidebar/close\": \"???\",\n\t\t\t\t\"sidebar/contents\": \"目次\",\n\t\t\t\t\"sidebar/bookmarks\": \"栞\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations\": \"注釈\",\n\t\t\t\t\"sidebar/annotations/add\": \"追加\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"削除\",\n\t\t\t\t\"sidebar/annotations/clear\": \"クリア\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"アンカー\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"キャンセル\",\n\t\t\t\t\"sidebar/search\": \"検索\",\n\t\t\t\t\"sidebar/search/placeholder\": \"検索\",\n\t\t\t\t\"sidebar/settings\": \"設定\",\n\t\t\t\t\"sidebar/settings/language\": \"表示言語\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"???\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"ページネーション\", \"ページネーションを生成します。\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"???\",\n\t\t\t\t\"sidebar/metadata\": \"???\",\n\t\t\t\t\"sidebar/metadata/title\": \"???\",\n\t\t\t\t\"sidebar/metadata/creator\": \"???\",\n\t\t\t\t\"sidebar/metadata/description\": \"???\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"???\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"???\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"???\",\n\t\t\t\t\"sidebar/metadata/language\": \"表示言語\",\n\t\t\t\t\"sidebar/metadata/rights\": \"???\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"???\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\",\n\t\t\t\t\"sidebar/metadata/flow\": \"???\",\n\t\t\t\t\"sidebar/metadata/spread\": \"???\",\n\t\t\t\t\"sidebar/metadata/direction\": \"???\",\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"追加\",\n\n\t\t\t\t\"status/fullscreen\": \"\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tru: {\n\t\t\t\t\"toolbar/sidebar\": \"Боковая панель\",\n\t\t\t\t\"toolbar/prev\": \"Предыдущая страница\",\n\t\t\t\t\"toolbar/next\": \"Следущая страница\",\n\t\t\t\t\"toolbar/openbook\": \"Открыть книгу\",\n\t\t\t\t\"toolbar/openbook/error\": \"Ваш браузер не поддерживает необходимые функции.\\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Добавить эту страницу в закладки\",\n\t\t\t\t\"toolbar/fullscreen\": \"Полноэкранный режим\",\n\t\t\t\t\"toolbar/background\": \"изменить фон\",\n\n\t\t\t\t\"sidebar/close\": \"Закрыть боковую панель\",\n\t\t\t\t\"sidebar/contents\": \"Содержание\",\n\t\t\t\t\"sidebar/bookmarks\": \"Закладки\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Добавить\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations\": \"Аннотации\",\n\t\t\t\t\"sidebar/annotations/add\": \"Добавить\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Удалить\",\n\t\t\t\t\"sidebar/annotations/clear\": \"Очистить\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"Метка\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"Отмена\",\n\t\t\t\t\"sidebar/search\": \"Поиск\",\n\t\t\t\t\"sidebar/search/placeholder\": \"Поиск\",\n\t\t\t\t\"sidebar/settings\": \"Настройки\",\n\t\t\t\t\"sidebar/settings/language\": \"Язык\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Размер шрифта\",\n\t\t\t\t\"sidebar/settings/flow\": \"Поток\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"Нумерация страниц\", \"Генерировать нумерацию страниц\"],\n\t\t\t\t\"sidebar/settings/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"Мин. ширина колонки\",\n\t\t\t\t\"sidebar/metadata\": \"Метаданные\",\n\t\t\t\t\"sidebar/metadata/title\": \"Заголовок\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Автор\",\n\t\t\t\t\"sidebar/metadata/description\": \"Описание\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Дата публикации\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Издатель\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Идентификатор\",\n\t\t\t\t\"sidebar/metadata/language\": \"Язык\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Лицензия\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Дата изменения\",\n\t\t\t\t\"sidebar/metadata/layout\": \"Макет\",\n\t\t\t\t\"sidebar/metadata/flow\": \"Поток\",\n\t\t\t\t\"sidebar/metadata/spread\": \"Разворот\",\n\t\t\t\t\"sidebar/metadata/direction\": \"Направление\",\n\n\t\t\t\t\"notedlg/label\": \"Заметка\",\n\t\t\t\t\"notedlg/add\": \"Добавить\",\n\n\t\t\t\t\"status/fullscreen\": \"\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t},\n\t\t\tvi: {\n\t\t\t\t\"toolbar/sidebar\": \"Thanh bên\",\n\t\t\t\t\"toolbar/prev\": \"Trang trước\",\n\t\t\t\t\"toolbar/next\": \"Trang kế tiếp\",\n\t\t\t\t\"toolbar/openbook\": \"Mở sách\",\n\t\t\t\t\"toolbar/openbook/error\": \"Trình duyệt của bạn không hỗ trợ các tính năng cần thiết. Vui lòng sử dụng trình duyệt hiện đại như Google Chrome hoặc Mozilla Firefox.\",\n\t\t\t\t\"toolbar/bookmark\": \"Thêm trang này vào dấu trang\",\n\t\t\t\t\"toolbar/fullscreen\": \"Toàn màn hình\",\n\t\t\t\t\"toolbar/background\": \"Đổi màu nền\",\n\n\t\t\t\t\"sidebar/close\": \"Đóng thanh bên\",\n\t\t\t\t\"sidebar/contents\": \"Nội dung\",\n\t\t\t\t\"sidebar/bookmarks\": \"Dấu trang\",\n\t\t\t\t\"sidebar/bookmarks/add\": \"Thêm dấu trang\",\n\t\t\t\t\"sidebar/bookmarks/remove\": \"Xóa dấu trang\",\n\t\t\t\t\"sidebar/bookmarks/clear\": \"???\",\n\t\t\t\t\"sidebar/annotations\": \"Chú thích\",\n\t\t\t\t\"sidebar/annotations/add\": \"Thêm chú thích\",\n\t\t\t\t\"sidebar/annotations/remove\": \"Xóa chú thích\",\n\t\t\t\t\"sidebar/annotations/clear\": \"???\",\n\t\t\t\t\"sidebar/annotations/anchor\": \"???\",\n\t\t\t\t\"sidebar/annotations/cancel\": \"???\",\n\t\t\t\t\"sidebar/search\": \"Tìm kiếm\",\n\t\t\t\t\"sidebar/search/placeholder\": \"???\",\n\t\t\t\t\"sidebar/settings\": \"Cài đặt\",\n\t\t\t\t\"sidebar/settings/language\": \"Ngôn ngữ\",\n\t\t\t\t\"sidebar/settings/fontsize\": \"Cỡ chữ (%)\",\n\t\t\t\t\"sidebar/settings/flow\": \"???\",\n\t\t\t\t\"sidebar/settings/pagination\": [\"???\", \"???\"],\n\t\t\t\t\"sidebar/settings/spread\": \"???\",\n\t\t\t\t\"sidebar/settings/spread/minwidth\": \"????\",\n\t\t\t\t\"sidebar/metadata\": \"Metadata\",\n\t\t\t\t\"sidebar/metadata/title\": \"Chủ đề\",\n\t\t\t\t\"sidebar/metadata/creator\": \"Người sáng tạo\",\n\t\t\t\t\"sidebar/metadata/description\": \"Mô tả\",\n\t\t\t\t\"sidebar/metadata/pubdate\": \"Ngày tạo\",\n\t\t\t\t\"sidebar/metadata/publisher\": \"Nhà xuất bản\",\n\t\t\t\t\"sidebar/metadata/identifier\": \"Định dạng\",\n\t\t\t\t\"sidebar/metadata/language\": \"Ngôn ngữ\",\n\t\t\t\t\"sidebar/metadata/rights\": \"Quyền\",\n\t\t\t\t\"sidebar/metadata/modified_date\": \"Ngày sửa đổi\",\n\t\t\t\t\"sidebar/metadata/layout\": \"???\", // rendition:layout\n\t\t\t\t\"sidebar/metadata/flow\": \"???\", // rendition:flow\n\t\t\t\t\"sidebar/metadata/spread\": \"???\", // rendition:spread\n\t\t\t\t\"sidebar/metadata/direction\": \"???\", // page-progression-direction\n\n\t\t\t\t\"notedlg/label\": \"???\",\n\t\t\t\t\"notedlg/add\": \"???\",\n\n\t\t\t\t\"status/fullscreen\": \"Toàn màn hình\",\n\t\t\t\t\"status/\": \"\",\n\t\t\t}\n\t\t};\n\n\t\treader.on(\"languagechanged\", (value) => {\n\t\t\tthis.language = value;\n\t\t});\n\t}\n\n\tget(key) { return this.values[this.language][key] || \"???\"; }\n}","/**\n * @author mrdoob https://github.com/mrdoob/ui.js\n */\n\nconst ERROR_MSG = \"is not an instance of UIElement.\";\n\n/**\n * UIElement\n * @param {string} tag\n */\nexport class UIElement {\n\n\tconstructor(tag) {\n\n\t\tthis.dom = document.createElement(tag);\n\t}\n\n\tadd() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.appendChild(argument.dom);\n\n\t\t\t} else if (Array.isArray(argument)) {\n\n\t\t\t\tfor (let j = 0; j < argument.length; j++) {\n\n\t\t\t\t\tconst element = argument[j];\n\n\t\t\t\t\tif (element instanceof UIElement) {\n\n\t\t\t\t\t\tthis.dom.appendChild(element.dom);\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error(\"UIElement:\", element, ERROR_MSG);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tremove() {\n\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\n\t\t\tconst argument = arguments[i];\n\n\t\t\tif (argument instanceof UIElement) {\n\n\t\t\t\tthis.dom.removeChild(argument.dom);\n\n\t\t\t} else if (Number.isInteger(argument)) {\n\n\t\t\t\tthis.dom.removeChild(this.dom.childNodes[argument]);\n\t\t\t} else {\n\n\t\t\t\tconsole.error(\"UIElement:\", argument, ERROR_MSG);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tclear() {\n\n\t\twhile (this.dom.children.length) {\n\n\t\t\tthis.dom.removeChild(this.dom.lastChild);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetId(id) {\n\n\t\tthis.dom.id = id;\n\t\treturn this;\n\t}\n\n\tgetId() {\n\n\t\treturn this.dom.id;\n\t}\n\n\tremoveAttribute(name) {\n\n\t\tthis.dom.removeAttribute(name);\n\t\treturn this;\n\t}\n\n\tsetClass(name) {\n\n\t\tthis.dom.className = name;\n\t\treturn this;\n\t}\n\n\taddClass(name) {\n\n\t\tthis.dom.classList.add(name);\n\t\treturn this;\n\t}\n\n\tremoveClass(name) {\n\n\t\tthis.dom.classList.remove(name);\n\t\treturn this;\n\t}\n\n\tsetStyle(key, value) {\n\n\t\tthis.dom.style[key] = value;\n\t\treturn this;\n\t}\n\n\tgetTitle() {\n\n\t\treturn this.dom.title;\n\t}\n\n\tsetTitle(title) {\n\n\t\tif (this.dom.title !== title && title)\n\t\t\tthis.dom.title = title;\n\t\treturn this;\n\t}\n\n\tgetTextContent() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetTextContent(text) {\n\n\t\tif (this.dom.textContent !== text && text)\n\t\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n\n\tgetBoundingClientRect() {\n\n\t\treturn this.dom.getBoundingClientRect();\n\t}\n}\n\n/**\n * UISpan\n * @param {string} text\n */\nexport class UISpan extends UIElement {\n\n\tconstructor(text) {\n\n\t\tsuper(\"span\");\n\t\tthis.setTextContent(text);\n\t}\n}\n\n/**\n * UIDiv\n */\nexport class UIDiv extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"div\");\n\t}\n\n\tsetClass(className) {\n\t\tthis.dom.className = className;\n\t\treturn this;\n\t}\n\n\taddClass(className) {\n\t\tthis.dom.classList.add(className);\n\t\treturn this;\n\t}\n}\n\n/**\n * UIRow\n */\nexport class UIRow extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"row\";\n\t}\n}\n\n/**\n * UIPanel\n */\nexport class UIPanel extends UIDiv {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.dom.className = \"panel\";\n\t}\n}\n\n/**\n * UILabel\n * @param {string} text\n * @param {string} id\n */\nexport class UILabel extends UIElement {\n\n\tconstructor(text, id) {\n\n\t\tsuper(\"label\");\n\n\t\tthis.dom.textContent = text;\n\t\tif (id) this.dom.htmlFor = id;\n\t}\n}\n\n/**\n * UILink\n * @param {string} href\n * @param {string} text\n */\nexport class UILink extends UIElement {\n\n\tconstructor(href, text) {\n\n\t\tsuper(\"a\");\n\n\t\tthis.dom.href = href || \"#\";\n\t\tthis.dom.textContent = text || \"\";\n\t}\n\n\tsetHref(url) {\n\n\t\tthis.dom.href = url;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIText\n * @param {string} text\n */\nexport class UIText extends UISpan {\n\n\tconstructor(text) {\n\n\t\tsuper();\n\n\t\tthis.dom.textContent = text;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.textContent;\n\t}\n\n\tsetValue(text) {\n\n\t\tthis.dom.textContent = text;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITextArea\n */\nexport class UITextArea extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"textarea\");\n\n\t\tthis.dom.spellcheck = false;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UISelect\n */\nexport class UISelect extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"select\");\n\t}\n\n\tsetMultiple(boolean) {\n\n\t\tthis.dom.multiple = boolean || false;\n\t\treturn this;\n\t}\n\n\tsetOptions(options) {\n\n\t\tconst selected = this.dom.value;\n\t\tthis.clear();\n\n\t\tfor (const key in options) {\n\n\t\t\tconst option = document.createElement(\"option\");\n\t\t\toption.value = key;\n\t\t\toption.text = options[key];\n\t\t\tthis.dom.appendChild(option);\n\t\t}\n\t\tthis.dom.value = selected;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tvalue = String(value);\n\n\t\tif (this.dom.value !== value)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIInput\n * @param {*} type\n * @param {*} value\n * @param {*} title\n */\nexport class UIInput extends UIElement {\n\n\tconstructor(type, value, title) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = type;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.setValue(value);\n\t\tthis.setTitle(title);\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tgetType() {\n\n\t\treturn this.dom.type;\n\t}\n\n\tsetType(type) {\n\n\t\tthis.dom.type = type;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tsetValue(value) {\n\n\t\tif (this.dom.value !== value && value !== undefined)\n\t\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UIColor\n */\nexport class UIColor extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"input\");\n\n\t\ttry {\n\n\t\t\tthis.dom.type = \"color\";\n\t\t\tthis.dom.value = \"#ffffff\";\n\n\t\t} catch (e) {\n\n\t\t\tconsole.exception(e);\n\t\t}\n\t}\n\n\tgetValue() {\n\n\t\treturn this.dom.value;\n\t}\n\n\tgetHexValue() {\n\n\t\treturn parseInt(this.dom.value.substr(1), 16);\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n\n\tsetHexValue(hex) {\n\n\t\tthis.dom.value = \"#\" + (\"000000\" + hex.toString(16)).slice(-6);\n\t\treturn this;\n\t}\n}\n\n/**\n * UINumber\n * @param {number} value\n * @param {number} step\n * @param {number} min\n * @param {number} max\n * @param {number} precision\n */\nexport class UINumber extends UIElement {\n\n\tconstructor(value, step, min, max, precision) {\n\n\t\tsuper(\"input\");\n\n\t\tthis.dom.type = \"number\";\n\t\tthis.dom.step = step || 1;\n\t\tthis.dom.onkeydown = (e) => {\n\n\t\t\te.stopPropagation();\n\t\t};\n\t\tthis.value = value || 0;\n\t\tthis.min = min || -Infinity;\n\t\tthis.max = max || +Infinity;\n\t\tthis.precision = precision || 0;\n\t\tthis.setValue(value);\n\t\tthis.dom.onchange = (e) => {\n\n\t\t\tthis.setValue(this.value);\n\t\t};\n\t}\n\n\tgetName() {\n\n\t\treturn this.dom.name;\n\t}\n\n\tsetName(name) {\n\n\t\tthis.dom.name = name;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision) {\n\n\t\tthis.precision = precision;\n\t\tthis.setValue(this.value);\n\t\treturn this;\n\t}\n\n\tsetRange(min, max) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\t\tthis.dom.min = min;\n\t\tthis.dom.max = max;\n\t\treturn this;\n\t}\n\n\tsetStep(step) {\n\n\t\tthis.dom.step = step;\n\t\treturn this;\n\t}\n\n\tgetValue() {\n\n\t\treturn parseFloat(this.dom.value);\n\t}\n\n\tsetValue(value) {\n\n\t\tif (value !== undefined) {\n\t\t\tvalue = parseFloat(value);\n\n\t\t\tif (value < this.min)\n\t\t\t\tvalue = this.min;\n\t\t\tif (value > this.max)\n\t\t\t\tvalue = this.max;\n\n\t\t\tthis.value = value;\n\t\t\tthis.dom.value = value.toFixed(this.precision);\n\t\t}\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBreak\n */\nexport class UIBreak extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"br\");\n\t}\n}\n\n/**\n * UIHorizontalRule\n */\nexport class UIHorizontalRule extends UIElement {\n\n\tconstructor() {\n\n\t\tsuper(\"hr\");\n\t}\n}\n\n/**\n * UIProgress\n * @param {*} value\n */\nexport class UIProgress extends UIElement {\n\n\tconstructor(value) {\n\n\t\tsuper(\"progress\");\n\n\t\tthis.dom.value = value;\n\t}\n\n\tsetValue(value) {\n\n\t\tthis.dom.value = value;\n\t\treturn this;\n\t}\n}\n\n/**\n * UITabbedPanel\n * @param {string} align (horizontal | vertical)\n */\nexport class UITabbedPanel extends UIDiv {\n\n\tconstructor(align) {\n\n\t\tsuper();\n\n\t\tthis.align = align || \"horizontal\";\n\t\tthis.tabs = [];\n\t\tthis.panels = [];\n\t\tthis.selector = new UISpan().setClass(\"tab-selector\");\n\t\tthis.menuDiv = new UIDiv().setClass(\"menu\");\n\t\tthis.tabsDiv = new UIDiv().setClass(\"tabs\");\n\t\tthis.tabsDiv.add(this.selector);\n\t\tthis.panelsDiv = new UIDiv().setClass(\"panels\");\n\t\tthis.selected = \"\";\n\t\tthis.add(this.menuDiv);\n\t\tthis.add(this.tabsDiv);\n\t\tthis.add(this.panelsDiv);\n\t}\n\n\taddMenu(items) {\n\t\tthis.menuDiv.add(items);\n\t}\n\n\taddTab(id, label, items) {\n\n\t\tconst tab = new UITab(label, this);\n\t\ttab.setId(id);\n\t\ttab.setClass(\"box\");\n\t\tthis.tabs.push(tab);\n\t\tthis.tabsDiv.add(tab);\n\n\t\tconst panel = new UIDiv();\n\t\tpanel.setId(id);\n\t\tpanel.add(items);\n\t\tthis.panels.push(panel);\n\t\tthis.panelsDiv.add(panel);\n\t\tthis.select(id);\n\t}\n\n\tselect(id) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.addClass(\"selected\");\n\t\t\t\tthis.transformSelector(tab);\n\t\t\t} else if (tab.dom.id === this.selected) {\n\t\t\t\ttab.removeClass(\"selected\");\n\t\t\t}\n\t\t}\n\n\t\tfor (let panel of this.panels) {\n\t\t\tif (panel.dom.id === id) {\n\t\t\t\tpanel.dom.style.display = \"block\";\n\t\t\t} else if (panel.dom.id === this.selected) {\n\t\t\t\tpanel.dom.style.display = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tthis.selected = id;\n\t\treturn this;\n\t}\n\n\tsetLabel(id, text) {\n\n\t\tfor (let tab of this.tabs) {\n\t\t\tif (tab.dom.id === id) {\n\t\t\t\ttab.setTitle(text);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\ttransformSelector(tab) {\n\n\t\tlet size;\n\t\tconst rect = tab.getBoundingClientRect();\n\t\tif (this.align === \"horizontal\") {\n\t\t\tsize = rect.width * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateX(${size}px)`;\n\t\t} else {\n\t\t\tsize = rect.height * this.tabs.indexOf(tab);\n\t\t\tthis.selector.dom.style.transform = `translateY(${size}px)`;\n\t\t}\n\t}\n}\n\n/**\n * UITab\n * @param {string} text\n * @param {UITabbedPanel} parent\n */\nexport class UITab extends UIDiv {\n\n\tconstructor(text, parent) {\n\n\t\tsuper();\n\t\tthis.button = new UIInput(\"button\");\n\t\tthis.button.dom.title = text;\n\t\tthis.dom.onclick = (e) => {\n\n\t\t\tparent.select(this.dom.id);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(this.button);\n\t}\n}\n\n/**\n * UIList\n * @param {UIItem} parent\n */\nexport class UIList extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"ul\");\n\t\tthis.parent = parent && parent.parent; // LI->UL\n\t\tthis.expanded = false;\n\t}\n\n\texpand() {\n\n\t\tthis.expanded = true;\n\t\tthis.dom.style.display = \"block\";\n\t\tif (this.parent)\n\t\t\tthis.parent.expand();\n\t\treturn this;\n\t}\n\n\tcollaps() {\n\n\t\tthis.expanded = false;\n\t\tthis.dom.style.display = \"none\";\n\t\treturn this;\n\t}\n}\n\n/**\n * UIItem\n * @param {UIList} parent\n */\nexport class UIItem extends UIElement {\n\n\tconstructor(parent) {\n\n\t\tsuper(\"li\");\n\t\tthis.parent = parent; // UL\n\t\tthis.selected = false;\n\t}\n\n\tadd() {\n\t\tlet len = 0;\n\t\tconst box = new UIDiv().setId(\"item-box\");\n\t\tfor (let i = 0; i < arguments.length; i++) {\n\t\t\tconst argument = arguments[i];\n\t\t\tif (argument instanceof UIList) {\n\t\t\t\tsuper.add(argument);\n\t\t\t} else {\n\t\t\t\tbox.add(argument);\n\t\t\t\tlen++;\n\t\t\t}\n\t\t}\n\t\tif (len) super.add(box);\n\t\treturn this;\n\t}\n\n\tselect() {\n\n\t\tthis.selected = true;\n\t\tthis.setClass(\"selected\");\n\t\treturn this;\n\t}\n\n\tunselect() {\n\n\t\tthis.selected = false;\n\t\tthis.removeAttribute(\"class\");\n\t\treturn this;\n\t}\n}\n\n/**\n * UIBox\n * @param {UIElement} items\n */\nexport class UIBox extends UIElement {\n\n\tconstructor(items) {\n\n\t\tsuper(\"div\");\n\t\tthis.setClass(\"box\");\n\t\tthis.add(items);\n\t}\n}\n\n/**\n * UIButton\n * @param {UIButton} items\n */\nexport class UIButton extends UIElement {\n\tconstructor(items) {\n\t\tsuper(\"button\");\n\t}\n}","import { UIPanel, UIDiv, UIInput, UILink, UIList, UIItem, UIBox } from \"../ui.js\";\n\nexport class SearchPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\n\t\tlet searchQuery = undefined;\n\t\tconst search = new UIInput(\"search\").setId(\"nav-q\");\n\t\tsearch.dom.placeholder = strings.get(\"sidebar/search/placeholder\");\n\t\tsearch.dom.onsearch = () => {\n\n\t\t\tconst value = search.getValue();\n\n\t\t\tif (value.length === 0) {\n\t\t\t\tthis.items.clear();\n\t\t\t} else if (searchQuery !== value) {\n\t\t\t\tthis.items.clear();\n\t\t\t\tthis.doSearch(value).then(results => {\n\n\t\t\t\t\tresults.forEach(data => {\n\t\t\t\t\t\tthis.set(data);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tsearchQuery = value;\n\t\t};\n\n\t\tthis.setId(\"search\");\n\t\tthis.items = new UIList();\n\t\tcontainer.add(this.items);\n\t\tthis.add([new UIBox(search), container]);\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined;\n\t\t//\n\t\t// improvement of the highlighting of keywords is required...\n\t\t//\n\t}\n\n\t/**\n\t * Searching the entire book\n\t * @param {*} q Query keyword\n\t * @returns The search result array.\n\t */\n\tasync doSearch(q) {\n\n\t\tconst book = this.reader.book;\n\t\tconst results = await Promise.all(\n\t\t\tbook.spine.spineItems.map(item => item.load(book.load.bind(book))\n\t\t\t\t.then(item.find.bind(item, q)).finally(item.unload.bind(item))));\n\t\treturn await Promise.resolve([].concat.apply([], results));\n\t}\n\n\tset(data) {\n\n\t\tconst link = new UILink(\"#\" + data.cfi, data.excerpt);\n\t\tconst item = new UIItem();\n\t\tlink.dom.onclick = () => {\n\n\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\tthis.selector.unselect();\n\t\t\t\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(data.cfi);\n\t\t\treturn false;\n\t\t};\n\t\titem.add(link);\n\t\tthis.items.add(item);\n\t}\n}","import { UIButton, UIDiv, UIInput, UILabel, UILink, UISpan, UIText } from \"./ui.js\";\nimport { SearchPanel } from \"./sidebar/search.js\";\n\nexport class Toolbar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst settings = reader.settings;\n\n\t\tconst container = new UIDiv().setId(\"toolbar\");\n\t\tconst keys = [\n\t\t\t\"toolbar/sidebar\",\n\t\t\t\"toolbar/prev\",\n\t\t\t\"toolbar/next\",\n\t\t\t\"toolbar/openbook\",\n\t\t\t\"toolbar/openbook/error\",\n\t\t\t\"toolbar/bookmark\",\n\t\t\t\"toolbar/fullscreen\",\n\t\t\t\"toolbar/background\",\n\t\t\t\"toolbar/search\",\n\t\t\t\"toolbar/close\",\n\t\t];\n\n\t\t/*------------------------ Toolbar Menu 1 --------------------------*/\n\t\tconst menu1 = new UIDiv().setClass(\"menu-1\");\n\t\tconst openerBox = new UIDiv().setId(\"btn-m\").setClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.dom.title = strings.get(keys[0]);\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", true);\n\t\t\topenerBtn.dom.blur();\n\t\t\te.preventDefault();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tmenu1.add(openerBox);\n\n\t\tlet prevBox, prevBtn;\n\t\tlet nextBox, nextBtn;\n\t\tif (settings.arrows === \"toolbar\") {\n\t\t\tprevBox = new UIDiv().setId(\"btn-p\").setClass(\"box\");\n\t\t\tprevBtn = new UIInput(\"button\");\n\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\tprevBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t\tprevBtn.dom.blur();\n\t\t\t};\n\t\t\tprevBox.add(prevBtn);\n\t\t\tmenu1.add(prevBox);\n\n\t\t\tnextBox = new UIDiv().setId(\"btn-n\").setClass(\"box\");\n\t\t\tnextBtn = new UIInput(\"button\");\n\t\t\tnextBtn.dom.title = strings.get(keys[2]);\n\t\t\tnextBtn.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t\tnextBtn.dom.blur();\n\t\t\t};\n\t\t\tnextBox.add(nextBtn);\n\t\t\tmenu1.add(nextBox);\n\t\t}\n\n\t\t/* ------------------------ Button Logo ------------------------- */\n\t\tconst logoBox = new UIDiv().setId(\"btn-logo\").setClass(\"logo\");\n\t\tconst logoLink = new UILink().setId(\"logo-link\").setHref(\"#\").setTextContent(\"LOGO\");\n\n\t\tlogoBox.add(logoLink);\n\t\tmenu1.add(logoBox);\n\n\t\t/* ------------------------ Button Index List (muc luc) -------------------------- */\n\t\tlet tocBox, tocBtn;\n\t\ttocBox = new UIDiv().setId(\"btn-t\").setClass(\"box\");\n\t\ttocBtn = new UIInput(\"button\");\n\n\t\t// load toc content title for toc list\n\t\ttocBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\treader.book.loaded.navigation.then((toc) => {\n\t\t\t\tshowToc(toc);\n\t\t\t})\n\t\t}\n\n\t\ttocBox.add(tocBtn);\n\t\tmenu1.add(tocBox);\n\n\t\t// Function to show the toc list\n\t\tfunction showToc(toc) {\n\t\t\tlet existingToc = document.getElementById(\"toolbar-toc-list\");\n\n\t\t\tif (existingToc) {\n\t\t\t\texistingToc.remove();\n\t\t\t} else {\n\t\t\t\tlet tocList = document.createElement(\"ul\");\n\t\t\t\ttocList.setAttribute(\"id\", \"toolbar-toc-list\");\n\n\t\t\t\tlet tocTitle = document.createElement(\"h3\");\n\t\t\t\ttocTitle.textContent = \"Mục lục\";\n\n\t\t\t\ttocList.appendChild(tocTitle);\n\n\t\t\t\ttoc.forEach((chapter) => {\n\t\t\t\t\tlet tocItem = document.createElement(\"li\");\n\t\t\t\t\tlet tocLink = document.createElement(\"a\");\n\n\t\t\t\t\ttocLink.href = \"#\";\n\t\t\t\t\ttocLink.textContent = chapter.label;\n\n\t\t\t\t\ttocLink.onclick = (e) => {\n\t\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t\tdocument.querySelectorAll(\"#toolbar-toc-list li a\").forEach((link) => {\n\t\t\t\t\t\t\tlink.classList.remove(\"active\");\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\ttocLink.classList.add(\"active\");\n\n\t\t\t\t\t\t// show the chapter with the title chosed in toc list\n\t\t\t\t\t\treader.rendition.display(chapter.href);\n\t\t\t\t\t};\n\n\t\t\t\t\ttocItem.appendChild(tocLink);\n\t\t\t\t\ttocList.appendChild(tocItem);\n\t\t\t\t});\n\n\t\t\t\ttocBox.dom.appendChild(tocList);\n\t\t\t}\n\n\t\t\tlet tocList = document.getElementById(\"toolbar-toc-list\");\n\t\t\ttocList.classList.toggle(\"active\");\n\t\t}\n\n\n\n\t\t/* ------------------------ Button My Bookmark (bookmark cua toi) --------------------------*/\n\t\tlet bookmarksBox, bookmarksBtn;\n\t\tbookmarksBox = new UIDiv().setId(\"btn-d\").setClass(\"box\");\n\t\tbookmarksBtn = new UIInput(\"button\");\n\n\t\tbookmarksBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\tshowBookmarks();\n\t\t}\n\n\t\tbookmarksBox.add(bookmarksBtn);\n\t\tmenu1.add(bookmarksBox);\n\n\t\tfunction showBookmarks() {\n\t\t\tlet bookmarksList = document.getElementById(\"toolbar-bookmarks-list\");\n\n\t\t\tif (!bookmarksList) {\n\t\t\t\tbookmarksList = document.createElement(\"ul\");\n\t\t\t\tbookmarksList.setAttribute(\"id\", \"toolbar-bookmarks-list\");\n\t\t\t\tbookmarkBox.dom.appendChild(bookmarksList);\n\t\t\t}\n\n\t\t\tupdateBookmarksList();\n\t\t\tbookmarksList.classList.toggle(\"active\");\n\t\t}\n\n\t\treader.on(\"bookmarked\", (boolean, cfi) => {\n\t\t\tupdateBookmarksList();\n\t\t})\n\n\t\tfunction updateBookmarksList() {\n\t\t\tlet bookmarksList = document.getElementById(\"toolbar-bookmarks-list\");\n\n\t\t\tif (!bookmarksList) return;\n\n\t\t\tbookmarksList.innerHTML = \"\";\n\n\t\t\tlet title = document.createElement(\"h3\");\n\t\t\ttitle.textContent = \"Bookmarks của tui\";\n\t\t\tbookmarksList.appendChild(title);\n\n\t\t\treader.settings.bookmarks.forEach((cfi, index) => {\n\t\t\t\tlet bookmarkItem = document.createElement(\"li\");\n\t\t\t\tlet bookmarkLink = document.createElement(\"a\");\n\t\t\t\tlet deleteBtn = document.createElement(\"span\");\n\n\t\t\t\tbookmarkLink.href = \"#\";\n\t\t\t\tbookmarkLink.textContent = `Bookmark ${index + 1}`;\n\n\t\t\t\tbookmarkLink.onclick = (e) => {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tdocument.querySelectorAll(\"#toolbar-bookmarks-list li a\").forEach((link) => {\n\t\t\t\t\t\tlink.classList.remove(\"active\");\n\t\t\t\t\t});\n\n\t\t\t\t\tbookmarkLink.classList.add(\"active\");\n\n\t\t\t\t\treader.rendition.display(cfi);\n\t\t\t\t};\n\n\t\t\t\tdeleteBtn.innerHTML = '';\n\t\t\t\tdeleteBtn.onclick = (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\treader.removeBookmarkFromToolbar(cfi);\n\t\t\t\t};\n\n\t\t\t\tbookmarkItem.appendChild(bookmarkLink);\n\t\t\t\tbookmarkItem.appendChild(deleteBtn);\n\t\t\t\tbookmarksList.appendChild(bookmarkItem);\n\t\t\t})\n\t\t}\n\n\t\t// Hàm xóa bookmark từ toolbar\n\t\treader.removeBookmarkFromToolbar = function (cfi) {\n\n\t\t\tlet bookmarksList = document.getElementById(\"toolbar-bookmarks-list\");\n\t\t\tif (!bookmarksList) return;\n\n\t\t\tlet bookmarkItems = bookmarksList.querySelectorAll(\"li\");\n\t\t\tlet targetItem = Array.from(bookmarkItems).find(item => {\n\t\t\t\treturn item.querySelector(\"a\").textContent.includes(cfi);\n\t\t\t});\n\n\t\t\tif (targetItem) {\n\t\t\t\ttargetItem.remove();\n\t\t\t}\n\n\t\t\tconst index = reader.settings.bookmarks.indexOf(cfi);\n\t\t\tif (index !== -1) {\n\t\t\t\treader.settings.bookmarks.splice(index, 1);\n\t\t\t}\n\n\t\t\treader.emit(\"bookmarked\", false, cfi);\n\t\t\treader.bookmarksPanel.removeBookmark(cfi);\n\t\t};\n\n\n\n\t\t/* ------------------------ Button Highlight And Note ---------------------------- */\n\t\tlet annotationsBox, annotationsBtn;\n\t\tannotationsBox = new UIDiv().setId(\"btn-a\").setClass(\"box\");\n\t\tannotationsBtn = new UIInput(\"button\");\n\n\t\t// show annotations list when click icon on toolbar\n\t\tannotationsBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\tshowAnnotations();\n\t\t}\n\n\t\tannotationsBox.add(annotationsBtn);\n\t\tmenu1.add(annotationsBox);\n\n\t\t// Function to show the annotations list\n\t\tfunction showAnnotations() {\n\t\t\tlet existingList = document.getElementById(\"toolbar-annotations-list\");\n\n\t\t\tif (!existingList) {\n\t\t\t\tlet annotationsList = document.createElement(\"ul\");\n\t\t\t\tannotationsList.setAttribute(\"id\", \"toolbar-annotations-list\");\n\n\t\t\t\tlet title = document.createElement(\"h3\");\n\t\t\t\ttitle.textContent = \"Highlights & Ghi chú\";\n\n\t\t\t\tannotationsList.appendChild(title);\n\n\t\t\t\treader.settings.annotations.forEach((note) => {\n\t\t\t\t\tlet noteItem = document.createElement(\"li\");\n\t\t\t\t\tlet noteLink = document.createElement(\"a\");\n\t\t\t\t\tlet deleteBtn = document.createElement(\"span\");\n\n\t\t\t\t\tnoteLink.href = \"#\";\n\t\t\t\t\tnoteLink.textContent = note.text;\n\n\t\t\t\t\tnoteLink.onclick = (e) => {\n\t\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t\tdocument.querySelectorAll(\"#toolbar-annotations-list li a\").forEach((link) => {\n\t\t\t\t\t\t\tlink.classList.remove(\"active\");\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tnoteLink.classList.add(\"active\");\n\n\t\t\t\t\t\treader.rendition.display(note.cfi);\n\t\t\t\t\t}\n\n\t\t\t\t\tdeleteBtn.innerHTML = '';\n\t\t\t\t\t// emit event to delete annotation items\n\t\t\t\t\tdeleteBtn.onclick = (e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treader.removeNoteFromToolbar(note);\n\t\t\t\t\t}\n\n\t\t\t\t\tnoteItem.appendChild(noteLink);\n\t\t\t\t\tnoteItem.appendChild(deleteBtn);\n\t\t\t\t\tannotationsList.appendChild(noteItem);\n\t\t\t\t})\n\n\t\t\t\tannotationsBox.dom.appendChild(annotationsList);\n\t\t\t}\n\n\t\t\tlet annotationsList = document.getElementById(\"toolbar-annotations-list\");\n\t\t\tannotationsList.classList.toggle(\"active\");\n\t\t}\n\n\t\treader.removeNoteFromToolbar = function (note) {\n\t\t\tlet annotationsList = document.getElementById(\"toolbar-annotations-list\");\n\t\t\tif (!annotationsList) return;\n\n\t\t\tlet noteItems = annotationsList.querySelectorAll(\"li\");\n\t\t\tlet targetItem = Array.from(noteItems).find(item => {\n\t\t\t\titem.querySelector('a').textContent === note.text;\n\t\t\t})\n\n\t\t\tif (targetItem) {\n\t\t\t\ttargetItem.remove();\n\t\t\t}\n\n\t\t\tconst annotationsPanel = reader.annotationsPanel;\n\t\t\tif (annotationsPanel) {\n\t\t\t\tannotationsPanel.removeNote(note);\n\t\t\t\tannotationsPanel.update();\n\t\t\t}\n\n\t\t\tconst index = reader.settings.annotations.findIndex((n) => n.cfi === note.cfi);\n\t\t\tif (index !== -1) {\n\t\t\t\treader.settings.annotations.splice(index, 1);\n\t\t\t}\n\n\t\t\treader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\t}\n\n\n\n\n\t\t/* ----------------------------- Current Page -------------------------------- */\n\t\tconst centerPageCount = new UIDiv().setClass(\"menu-center\");\n\n\t\tconst centerLabel = new UILabel().setClass(\"toolbar-center-label\");\n\t\tcenterLabel.setTextContent(\"Determined\");\n\n\t\tconst curOfTotal = new UIDiv().setClass(\"page-map\");\n\t\tconst curPageIndex = new UISpan().setClass(\"current-page-index\").setTextContent(\"1\");\n\t\tconst separator = new UIText().setTextContent(\" của \");\n\t\tconst totalPage = new UISpan().setClass(\"total-pages\").setTextContent(\"200\");\n\n\t\tcurOfTotal.add(curPageIndex);\n\t\tcurOfTotal.add(separator);\n\t\tcurOfTotal.add(totalPage);\n\n\t\tcenterPageCount.add(centerLabel);\n\t\tcenterPageCount.add(curOfTotal);\n\n\n\n\t\t/*------------------------ Toolbar Menu 2 --------------------------*/\n\t\tconst menu2 = new UIDiv().setClass(\"menu-2\");\n\t\t// Button change background\n\t\tlet backgroundBox, colorPicker;\n\t\tif (settings.background) {\n\t\t\t// Init elements: background box div, input color picker\n\t\t\tbackgroundBox = new UIDiv().setId(\"btn-bg\").setClass(\"box\");\n\t\t\tcolorPicker = new UIInput(\"color\").setClass(\"color-picker\");\n\t\t\tcolorPicker.dom.title = strings.get(keys[7]);\n\n\t\t\t// Handle event get color from color table of input color\n\t\t\tcolorPicker.dom.oninput = (e) => {\n\t\t\t\tconst selectedColor = e.target.value;\n\n\t\t\t\t// Emit 'colorchanged' event with selected color\n\t\t\t\treader.emit(\"colorchanged\", selectedColor);\n\t\t\t}\n\n\t\t\tbackgroundBox.add(colorPicker);\n\t\t\tmenu2.add(backgroundBox);\n\t\t}\n\n\n\t\t// Button \"A-\", \"A+\" and input (hidden) for font-size\n\t\tlet fontLabel = new UILabel().setClass(\"font-size-px\").setTextContent(\"Fontsize (px):\")\n\t\tlet fontSizeBox = new UIDiv().setId(\"btn-fontsize\").setClass(\"box\");\n\t\tlet decreaseFontBtn = new UIInput(\"button\").setClass(\"btn-font-decrease\");\n\t\tlet increaseFontBtn = new UIInput(\"button\").setClass(\"btn-font-increase\");\n\t\tlet fontSizeInput = new UIInput(\"text\").setClass(\"input-font-size\");\n\n\t\tlet fontSize = settings.fontSize || 16;\n\t\tfontSizeInput.dom.value = fontSize;\n\n\t\tdecreaseFontBtn.dom.textContent = \"-\";\n\t\tdecreaseFontBtn.dom.onclick = () => {\n\t\t\tfontSize = Math.max(8, fontSize - 1);\n\t\t\tfontSizeInput.dom.value = fontSize;\n\n\t\t\treader.emit(\"styleschanged\", { fontSize: fontSize });\n\t\t};\n\n\t\tincreaseFontBtn.dom.textContent = \"+\";\n\t\tincreaseFontBtn.dom.onclick = () => {\n\t\t\tfontSize = Math.min(72, fontSize + 1);\n\t\t\tfontSizeInput.dom.value = fontSize;\n\n\t\t\treader.emit(\"styleschanged\", { fontSize: fontSize });\n\t\t};\n\n\t\tfontSizeInput.dom.onchange = () => {\n\t\t\tlet newSize = parseInt(fontSizeInput.dom.value, 10);\n\t\t\tif (!isNaN(newSize) && newSize >= 8 && newSize <= 72) {\n\t\t\t\tfontSize = newSize;\n\n\t\t\t\treader.emit(\"styleschanged\", { fontSize: fontSize });\n\t\t\t} else {\n\t\t\t\tfontSizeInput.dom.value = fontSize;\n\t\t\t}\n\t\t};\n\n\t\tfontSizeBox.add(fontLabel);\n\t\tfontSizeBox.add(decreaseFontBtn);\n\t\tfontSizeBox.add(fontSizeInput);\n\t\tfontSizeBox.add(increaseFontBtn);\n\t\tmenu2.add(fontSizeBox);\n\n\n\t\t// Button open file\n\t\tlet openbookBtn;\n\t\tif (settings.openbook) {\n\t\t\tconst onload = (e) => {\n\n\t\t\t\treader.storage.clear();\n\t\t\t\treader.storage.set(e.target.result, () => {\n\t\t\t\t\treader.unload();\n\t\t\t\t\treader.init(e.target.result);\n\t\t\t\t\tconst url = new URL(window.location.origin);\n\t\t\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\t\t});\n\t\t\t};\n\t\t\tconst onerror = (e) => {\n\t\t\t\tconsole.error(e);\n\t\t\t};\n\t\t\tconst openbookBox = new UIDiv().setId(\"btn-o\").setClass(\"box\");\n\t\t\topenbookBtn = new UIInput(\"file\");\n\t\t\topenbookBtn.dom.title = strings.get(keys[3]);\n\t\t\topenbookBtn.dom.accept = \"application/epub+zip\";\n\t\t\topenbookBtn.dom.onchange = (e) => {\n\n\t\t\t\tif (e.target.files.length === 0)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (window.FileReader) {\n\n\t\t\t\t\tconst fr = new FileReader();\n\t\t\t\t\tfr.onload = onload;\n\t\t\t\t\tfr.readAsArrayBuffer(e.target.files[0]);\n\t\t\t\t\tfr.onerror = onerror;\n\t\t\t\t} else {\n\t\t\t\t\talert(strings.get(keys[4]));\n\t\t\t\t}\n\n\t\t\t};\n\t\t\topenbookBtn.dom.onclick = (e) => {\n\n\t\t\t\topenbookBtn.dom.blur();\n\t\t\t};\n\t\t\topenbookBox.add(openbookBtn);\n\t\t\tmenu2.add(openbookBox);\n\t\t}\n\n\n\t\t// Button search \n\t\tlet searchBox, searchBtn;\n\t\tlet searchInput, searchResults;\n\t\tsearchBox = new UIDiv().setId(\"btn-s\").setClass(\"box\");\n\t\tsearchBtn = new UIInput(\"button\");\n\t\tsearchBtn.setTitle(strings.get(keys[8]));\n\n\t\tsearchBtn.dom.onclick = (e) => {\n\t\t\te.stopPropagation();\n\t\t\tshowSearchPopup();\n\t\t}\n\n\t\tsearchBox.add(searchBtn);\n\t\tmenu2.add(searchBox);\n\n\t\tfunction showSearchPopup() {\n\t\t\tlet existingPopup = document.getElementById(\"toolbar-search-list\");\n\t\t\tif (!existingPopup) {\n\t\t\t\tlet searchPopup = document.createElement(\"div\");\n\t\t\t\tsearchPopup.setAttribute(\"id\", \"toolbar-search-list\");\n\t\t\t\tsearchPopup.classList.add(\"search-popup\");\n\n\t\t\t\tlet searchContainer = document.createElement(\"div\");\n\t\t\t\tsearchContainer.classList.add(\"search-container\");\n\n\t\t\t\tlet searchIcon = document.createElement(\"span\");\n\t\t\t\tsearchIcon.classList.add(\"search-icon\");\n\t\t\t\tsearchIcon.innerHTML = '';\n\n\t\t\t\tlet searchInput = document.createElement(\"input\");\n\t\t\t\tsearchInput.setAttribute(\"type\", \"search\");\n\t\t\t\tsearchInput.setAttribute(\"placeholder\", \"Search\");\n\t\t\t\tsearchInput.setAttribute(\"id\", \"nav-q\");\n\t\t\t\tsearchInput.setAttribute(\"class\", \"toolbar-search-input\");\n\n\t\t\t\tsearchContainer.appendChild(searchIcon);\n\t\t\t\tsearchContainer.appendChild(searchInput);\n\n\t\t\t\tlet resultContainer = document.createElement(\"ul\");\n\t\t\t\tresultContainer.setAttribute('id', 'toolbar-search-results');\n\n\t\t\t\tlet searchPanel = new SearchPanel(reader);\n\t\t\t\tsearchInput.oninput = async () => {\n\t\t\t\t\tlet query = searchInput.value.trim();\n\t\t\t\t\tif (query.length > 0) {\n\t\t\t\t\t\tlet results = await searchPanel.doSearch(query);\n\t\t\t\t\t\tresultContainer.innerHTML = \"\";\n\n\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\tlet noResultItem = document.createElement(\"li\");\n\t\t\t\t\t\t\tnoResultItem.innerText = \"Không tìm thấy kết quả trùng khớp\";\n\t\t\t\t\t\t\tnoResultItem.style.color = \"gray\";\n\t\t\t\t\t\t\tnoResultItem.style.padding = \"8px\";\n\t\t\t\t\t\t\tresultContainer.appendChild(noResultItem);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresults.forEach((data) => {\n\t\t\t\t\t\t\tlet item = document.createElement(\"li\");\n\t\t\t\t\t\t\tlet link = document.createElement(\"a\");\n\t\t\t\t\t\t\tlink.href = \"#\" + data.cfi;\n\t\t\t\t\t\t\tlink.textContent = data.excerpt;\n\t\t\t\t\t\t\tlink.onclick = (e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsearchPanel.reader.rendition.display(data.cfi);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem.appendChild(link);\n\t\t\t\t\t\t\tresultContainer.appendChild(item);\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresultContainer.innerHTML = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsearchPopup.appendChild(searchContainer);\n\t\t\t\tsearchPopup.appendChild(resultContainer);\n\t\t\t\tsearchBox.dom.appendChild(searchPopup);\n\t\t\t}\n\n\t\t\tlet searchPopup = document.getElementById(\"toolbar-search-list\");\n\t\t\tsearchPopup.classList.toggle(\"active\");\n\t\t}\n\n\n\t\t// Button Bookmark\n\t\tlet bookmarkBox, bookmarkBtn;\n\t\tif (settings.bookmarks) {\n\t\t\tbookmarkBox = new UIDiv().setId(\"btn-b\").setClass(\"box\");\n\t\t\tbookmarkBtn = new UIInput(\"button\");\n\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\tbookmarkBtn.dom.onclick = (e) => {\n\n\t\t\t\tconst cfi = this.locationCfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\treader.emit(\"bookmarked\", val);\n\t\t\t\te.preventDefault();\n\t\t\t\tbookmarkBtn.dom.blur();\n\t\t\t};\n\t\t\tbookmarkBox.add(bookmarkBtn);\n\t\t\tmenu2.add(bookmarkBox);\n\t\t}\n\n\t\t// Button Full Screen\n\t\tlet fullscreenBtn;\n\t\tif (settings.fullscreen) {\n\n\t\t\tconst fullscreenBox = new UIDiv().setId(\"btn-f\").setClass(\"box\");\n\t\t\tfullscreenBtn = new UIInput(\"button\");\n\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\tfullscreenBtn.dom.onclick = (e) => {\n\n\t\t\t\tthis.toggleFullScreen();\n\t\t\t\te.preventDefault();\n\t\t\t};\n\n\t\t\tdocument.onkeydown = (e) => {\n\n\t\t\t\tif (e.key === \"F11\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.toggleFullScreen();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.onfullscreenchange = (e) => {\n\n\t\t\t\tconst w = window.screen.width === e.target.clientWidth;\n\t\t\t\tconst h = window.screen.height === e.target.clientHeight;\n\n\t\t\t\tif (w && h) {\n\t\t\t\t\tfullscreenBox.addClass(\"resize-small\");\n\t\t\t\t} else {\n\t\t\t\t\tfullscreenBox.removeClass(\"resize-small\");\n\t\t\t\t}\n\t\t\t};\n\t\t\tfullscreenBox.add(fullscreenBtn);\n\t\t\tmenu2.add(fullscreenBox);\n\t\t}\n\n\t\tcontainer.add([menu1, centerPageCount, menu2]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t// Button Close\n\t\tlet closeBox, closeBtn;\n\t\tcloseBox = new UIDiv().setId(\"btn-close\").setClass(\"box\");\n\t\tcloseBtn = new UIInput(\"button\").setClass(\"active\");\n\t\tcloseBtn.setTitle(strings.get(keys[9]));\n\n\n\n\t\tcloseBox.add(closeBtn);\n\t\tmenu2.add(closeBox);\n\n\n\t\t//-- events --//\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tconst cfi = location.start.cfi;\n\t\t\t\tconst val = reader.isBookmarked(cfi) === -1;\n\t\t\t\tif (val) {\n\t\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t\t} else {\n\t\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t\t}\n\t\t\t\tthis.locationCfi = cfi; // save location cfi\n\t\t\t}\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBox.dom.style.display = location.atStart ? \"none\" : \"block\";\n\t\t\t\tnextBox.dom.style.display = location.atEnd ? \"none\" : \"block\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean) => {\n\n\t\t\tif (boolean) {\n\t\t\t\tbookmarkBox.addClass(\"bookmarked\");\n\t\t\t} else {\n\t\t\t\tbookmarkBox.removeClass(\"bookmarked\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\n\t\t\tif (settings.arrows === \"toolbar\") {\n\t\t\t\tprevBtn.setTitle(strings.get(keys[1]));\n\t\t\t\tnextBtn.setTitle(strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (settings.openbook) {\n\t\t\t\topenbookBtn.setTitle(strings.get(keys[3]));\n\t\t\t}\n\t\t\tif (settings.bookmarks) {\n\t\t\t\tbookmarkBtn.setTitle(strings.get(keys[5]));\n\t\t\t}\n\t\t\tif (settings.fullscreen) {\n\t\t\t\tfullscreenBtn.setTitle(strings.get(keys[6]));\n\t\t\t}\n\t\t\tif (settings.background) {\n\t\t\t\tbackgroundBtn.setTitle(strings.get(keys[7]));\n\t\t\t}\n\n\t\t});\n\t}\n\n\ttoggleFullScreen() {\n\n\t\tdocument.activeElement.blur();\n\n\t\tif (document.fullscreenElement === null) {\n\t\t\tdocument.documentElement.requestFullscreen();\n\t\t} else if (document.exitFullscreen) {\n\t\t\tdocument.exitFullscreen();\n\t\t}\n\t}\n}","import { UIDiv, UISpan } from \"./ui.js\";\n\nexport class Content {\n\n\tconstructor(reader) {\n\n\t\tconst settings = reader.settings;\n\t\tconst container = new UIDiv().setId(\"content\");\n\n\t\tlet prev;\n\t\tif (settings.arrows === \"content\") {\n\n\t\t\tprev = new UIDiv().setId(\"prev\").setClass(\"arrow\");\n\t\t\tprev.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"prev\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tconst iconLeft = new UISpan();\n\t\t\ticonLeft.dom.innerHTML = '';\n\t\t\tprev.add(iconLeft);\n\t\t\tcontainer.add(prev);\n\t\t}\n\n\t\tconst viewer = new UIDiv().setId(\"viewer\");\n\t\tcontainer.add(viewer);\n\n\t\t// Handle the 'colorchanged' event to change background of 'viewer'\n\t\treader.on(\"colorchanged\", (color) => {\n\t\t\tviewer.dom.style.backgroundColor = color;\n\t\t});\n\n\t\tlet next;\n\t\tif (settings.arrows === \"content\") {\n\t\t\tnext = new UIDiv().setId(\"next\").setClass(\"arrow\");\n\t\t\tnext.dom.onclick = (e) => {\n\n\t\t\t\treader.emit(\"next\");\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\tconst iconRight = new UISpan();\n\t\t\ticonRight.dom.innerHTML = '';\n\t\t\tnext.add(iconRight);\n\t\t\tcontainer.add(next);\n\t\t}\n\n\t\tconst loader = new UIDiv().setId(\"loader\");\n\t\tconst divider = new UIDiv().setId(\"divider\");\n\t\tconst overlay = new UIDiv().setId(\"overlay\");\n\t\toverlay.dom.onclick = (e) => {\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tcontainer.add([loader, divider, overlay]);\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tviewer.setClass(cfg.flow);\n\t\t\tloader.dom.style.display = \"block\";\n\t\t});\n\n\t\treader.on(\"bookloaded\", () => {\n\n\t\t\tloader.dom.style.display = \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.spread && props.width > props.spreadWidth) {\n\t\t\t\tdivider.dom.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tdivider.dom.style.display = \"none\";\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"flowchanged\", (value) => {\n\n\t\t\tviewer.setClass(value);\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tif (location.atStart) {\n\t\t\t\t\tprev.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tprev.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t\tif (location.atEnd) {\n\t\t\t\t\tnext.addClass(\"disabled\");\n\t\t\t\t} else {\n\t\t\t\t\tnext.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"prev\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tprev.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { prev.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"next\", () => {\n\n\t\t\tif (settings.arrows === \"content\") {\n\t\t\t\tnext.addClass(\"active\");\n\t\t\t\tsetTimeout(() => { next.removeClass(\"active\"); }, 100);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\toverlay.dom.style.display = value ? \"block\" : \"none\";\n\t\t});\n\n\t\treader.on(\"viewercleanup\", () => {\n\n\t\t\tviewer.clear();\n\t\t});\n\t}\n}","import { UIPanel, UIDiv, UIItem, UIList, UILink, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class TocPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/contents\"\n\t\t];\n\t\tconst label = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.reader = reader;\n\t\tthis.selector = undefined; // save reference to selected tree item\n\t\tthis.setId(\"contents\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", () => {\n\t\t\treader.book.loaded.navigation.then((toc) => {\n\t\t\t\tcontainer.clear();\n\t\t\t\tcontainer.add(this.generateToc(toc));\n\t\t\t\tthis.add(container);\n\t\t\t\tconsole.log(toc);\n\t\t\t\t\n\t\t\t})\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tlabel.setValue(strings.get(keys[0]));\n\t\t});\n\t}\n\n\tgenerateToc(toc, parent) {\n\n\t\tconst list = new UIList(parent);\n\n\t\ttoc.forEach((chapter) => {\n\n\t\t\tconst link = new UILink(chapter.href, chapter.label);\n\t\t\tconst item = new UIItem(list).setId(chapter.id);\n\t\t\tconst ibtn = new UISpan();\n\n\t\t\tlink.dom.onclick = (e) => {\n\n\t\t\t\tif (this.selector && this.selector !== item)\n\t\t\t\t\tthis.selector.unselect();\n\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t\tthis.reader.settings.sectionId = chapter.id;\n\t\t\t\tthis.reader.rendition.display(chapter.href);\n\t\t\t\te.preventDefault();\n\t\t\t};\n\t\t\titem.add([ibtn, link]);\n\t\t\tthis.reader.navItems[chapter.href] = {\n\t\t\t\tid: chapter.id,\n\t\t\t\tlabel: chapter.label\n\t\t\t};\n\n\t\t\tif (this.reader.settings.sectionId === chapter.id) {\n\t\t\t\tlist.expand();\n\t\t\t\titem.select();\n\t\t\t\tthis.selector = item;\n\t\t\t}\n\n\t\t\tif (chapter.subitems && chapter.subitems.length > 0) {\n\n\t\t\t\tconst subItems = this.generateToc(chapter.subitems, item);\n\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\tibtn.dom.onclick = () => {\n\n\t\t\t\t\tif (subItems.expanded) {\n\t\t\t\t\t\tsubItems.collaps();\n\t\t\t\t\t\tibtn.setClass(\"toggle-collapsed\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubItems.expand();\n\t\t\t\t\t\tibtn.setClass(\"toggle-expanded\");\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t\titem.add(subItems);\n\t\t\t}\n\n\t\t\tlist.add(item);\n\t\t});\n\n\t\treturn list;\n\t}\n}","import { UIPanel, UIDiv, UIRow, UIInput, UILink, UIList, UIItem, UIText, UIBox, UISpan } from \"../ui.js\";\n\nexport class BookmarksPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/bookmarks/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearBookmarks();\n\t\t\treader.emit(\"bookmarked\", false);\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.bookmarks = new UIList();\n\t\tcontainer.add(this.bookmarks);\n\t\tthis.setId(\"bookmarks\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\n\t\tconst update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.bookmarks.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"displayed\", (renderer, cfg) => {\n\n\t\t\tcfg.bookmarks.forEach((cfi) => {\n\n\t\t\t\tthis.setBookmark(cfi);\n\t\t\t});\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"relocated\", (location) => {\n\n\t\t\tthis.locationCfi = location.start.cfi; // save location cfi\n\t\t});\n\n\t\treader.on(\"bookmarked\", (boolean, cfi) => {\n\t\t\tif (boolean) {\n\t\t\t\tthis.appendBookmark();\n\t\t\t} else {\n\t\t\t\tthis.removeBookmark(cfi);\n\t\t\t}\n\t\t\tupdate();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tappendBookmark() {\n\n\t\tconst cfi = this.locationCfi;\n\n\t\tif (this.reader.isBookmarked(cfi) > -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.setBookmark(cfi);\n\t\tthis.reader.settings.bookmarks.push(cfi);\n\n\t}\n\n\tremoveBookmark(cfi) {\n\t\tconst _cfi = cfi || this.locationCfi;\n\t\tconst index = this.reader.isBookmarked(_cfi);\n\t\tif (index === -1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.bookmarks.remove(index);\n\t\tthis.reader.settings.bookmarks.splice(index, 1);\n\t}\n\n\tclearBookmarks() {\n\n\t\tthis.bookmarks.clear();\n\t\tthis.reader.settings.bookmarks = [];\n\t}\n\n\tsetBookmark(cfi) {\n\t\tconst link = new UILink();\n\t\tconst item = new UIItem();\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst navItem = this.reader.navItemFromCfi(cfi);\n\t\tlet idref;\n\t\tlet label;\n\n\t\tif (navItem === undefined) {\n\t\t\tconst spineItem = this.reader.book.spine.get(cfi);\n\t\t\tidref = spineItem.idref;\n\t\t\tlabel = spineItem.idref\n\t\t} else {\n\t\t\tidref = navItem.id;\n\t\t\tlabel = navItem.label;\n\t\t}\n\n\t\tlink.setHref(\"#\" + cfi);\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(cfi);\n\t\t\te.preventDefault();\n\t\t};\n\t\tlink.setTextContent(label);\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.reader.emit(\"bookmarked\", false, cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\titem.setId(idref);\n\t\tthis.bookmarks.add(item);\n\t}\n}","import { UIPanel, UIDiv, UITextArea, UIInput, UILink, UIList, UIItem, UISpan, UIText, UIBox } from \"../ui.js\";\n\nexport class AnnotationsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/annotations/clear\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tconst clearBtn = new UIInput(\"button\", strings.get(keys[1]));\n\t\tclearBtn.dom.onclick = (e) => {\n\n\t\t\tthis.clearNotes();\n\t\t\te.preventDefault();\n\t\t};\n\t\tthis.add(new UIBox([headerLabel, clearBtn]).addClass(\"header\"));\n\t\tthis.selector = undefined;\n\t\tthis.notes = new UIList();\n\t\tcontainer.add(this.notes);\n\t\tthis.setId(\"annotations\");\n\t\tthis.add(container);\n\t\tthis.reader = reader;\n\t\tthis.update = () => {\n\n\t\t\tclearBtn.dom.disabled = reader.settings.annotations.length === 0;\n\t\t};\n\n\t\t//-- events --//\n\n\t\treader.on(\"navigation\", (cfg) => {\n\n\t\t\tcfg.annotations.forEach((note) => {\n\n\t\t\t\tthis.set(note);\n\t\t\t});\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"noteadded\", (note) => {\n\t\t\tthis.set(note);\n\t\t\tthis.update();\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setValue(strings.get(keys[0]));\n\t\t\tclearBtn.setValue(strings.get(keys[1]));\n\t\t});\n\t}\n\n\tset(note) {\n\n\t\tconst link = new UILink(\"#\" + note.cfi, note.text);\n\t\tconst item = new UIItem().setId(\"note-\" + note.uuid);\n\t\tconst btnr = new UISpan().setClass(\"btn-remove\");\n\t\tconst call = () => { };\n\n\t\tlink.dom.onclick = (e) => {\n\n\t\t\tif (this.selector && this.selector !== item) {\n\t\t\t\tthis.selector.unselect();\n\t\t\t}\n\t\t\titem.select();\n\t\t\tthis.selector = item;\n\t\t\tthis.reader.rendition.display(note.cfi);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tbtnr.dom.onclick = (e) => {\n\n\t\t\tthis.removeNote(note);\n\t\t\te.preventDefault();\n\t\t};\n\n\t\titem.add([link, btnr]);\n\t\tthis.notes.add(item);\n\t\tthis.reader.rendition.annotations.add(\n\t\t\t\"highlight\", note.cfi, {}, call, \"note-highlight\", {});\n\t\tthis.update();\n\n\t\tconst toolbarList = document.getElementById(\"toolbar-annotations-list\");\n\t\tif (toolbarList) {\n\t\t\tconst toolbarNoteItem = document.createElement(\"li\");\n\t\t\tconst toolbarNoteLink = document.createElement(\"a\");\n\t\t\ttoolbarNoteLink.href = \"#\";\n\t\t\ttoolbarNoteLink.textContent = note.text; // sửa lại nếu cần\n\t\t\ttoolbarNoteLink.onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.reader.rendition.display(note.cfi);\n\t\t\t};\n\t\t\ttoolbarNoteItem.appendChild(toolbarNoteLink);\n\n\t\t\tconst deleteBtn = document.createElement(\"span\");\n\t\t\tdeleteBtn.innerHTML = '';\n\n\t\t\tdeleteBtn.onclick = (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.reader.removeNoteFromToolbar(note);\n\t\t\t}\n\t\t\ttoolbarNoteItem.appendChild(deleteBtn);\n\t\t\ttoolbarList.appendChild(toolbarNoteItem);\n\t\t}\n\t}\n\n\tremoveNote(note) {\n\n\t\tconst index = this.reader.settings.annotations.indexOf(note);\n\t\tif (index === -1)\n\t\t\treturn;\n\n\t\tthis.notes.remove(index);\n\t\tthis.reader.settings.annotations.splice(index, 1);\n\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\tthis.update();\n\n\t\tconst toolbarList = document.getElementById(\"toolbar-annotations-list\");\n\t\tif (toolbarList) {\n\t\t\tconst toolbarItems = toolbarList.querySelectorAll(\"li\");\n\t\t\ttoolbarItems.forEach(item => {\n\t\t\t\tif (item.querySelector(\"a\").textContent === note.text) {\n\t\t\t\t\titem.remove();\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tclearNotes() {\n\n\t\tthis.reader.settings.annotations.forEach(note => {\n\t\t\tthis.reader.rendition.annotations.remove(note.cfi, \"highlight\");\n\t\t});\n\t\tthis.notes.clear();\n\t\tthis.reader.settings.annotations = [];\n\t\tthis.update();\n\t}\n}","import { UIPanel, UIRow, UISelect, UIInput, UILabel, UINumber, UIText, UIBox, UIDiv } from \"../ui.js\";\n\nexport class SettingsPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tsuper.setId(\"settings\");\n\n\t\tconst strings = reader.strings;\n\t\tconst keys = [\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/settings/language\",\n\t\t\t\"sidebar/settings/fontsize\",\n\t\t\t\"sidebar/settings/flow\",\n\t\t\t\"sidebar/settings/spread\",\n\t\t\t\"sidebar/settings/spread/minwidth\"\n\t\t];\n\t\tconst headerLabel = new UIText(strings.get(keys[0])).setClass(\"label\");\n\t\tthis.add(new UIBox(headerLabel).addClass(\"header\"));\n\n\t\tconst languageLabel = new UILabel(strings.get(keys[1]), \"language-ui\");\n\t\tconst languageRow = new UIRow();\n\t\tconst language = new UISelect().setOptions({\n\t\t\ten: \"English\",\n\t\t\tfr: \"French\",\n\t\t\tja: \"Japanese\",\n\t\t\tru: \"Russian\",\n\t\t\tvi: \"Vietnamese\"\n\t\t});\n\t\tlanguage.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"languagechanged\", e.target.value);\n\t\t};\n\t\tlanguage.setId(\"language-ui\");\n\t\tlanguageRow.add(languageLabel);\n\t\tlanguageRow.add(language);\n\n\t\tconst fontSizeLabel = new UILabel(strings.get(keys[2]), \"fontsize\");\n\t\tconst fontSizeRow = new UIRow();\n\t\tconst fontSize = new UINumber(16, 1);\n\n\t\tfontSize.dom.onchange = (e) => {\n\t\t\tconst newSize = parseInt(e.target.value);\n\n\t\t\tif (newSize >= 8 && newSize <= 72) {\n\t\t\t\treader.emit(\"styleschanged\", {\n\t\t\t\t\tfontSize: newSize\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tfontSize.setId(\"fontsize\");\n\t\tfontSizeRow.add(fontSizeLabel);\n\t\tfontSizeRow.add(fontSize);\n\t\tfontSize.dom.disabled = true;\n\n\t\t//-- flow configure --//\n\n\t\tconst flowLabel = new UILabel(strings.get(keys[3]), \"flow\");\n\t\tconst flowRow = new UIRow();\n\t\tconst flow = new UISelect().setOptions({\n\t\t\tpaginated: \"Paginated\",\n\t\t\tscrolled: \"Scrolled\"\n\t\t});\n\t\tflow.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"flowchanged\", e.target.value);\n\n\t\t\tif (e.target.value === \"scrolled\") {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: \"none\",\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\t\tmod: undefined,\n\t\t\t\t\tmin: undefined\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tflow.setId(\"flow\");\n\t\tflowRow.add(flowLabel);\n\t\tflowRow.add(flow);\n\n\t\t//-- spdead configure --//\n\n\t\tconst minSpreadWidth = new UINumber(800, 1);\n\t\tconst spreadLabel = new UILabel(strings.get(keys[4]), \"spread\");\n\t\tconst spreadRow = new UIRow();\n\t\tconst spread = new UISelect().setOptions({\n\t\t\tnone: \"None\",\n\t\t\tauto: \"Auto\"\n\t\t});\n\t\tspread.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: e.target.value,\n\t\t\t\tmin: undefined\n\t\t\t});\n\t\t\tminSpreadWidth.dom.disabled = e.target.value === \"none\";\n\t\t};\n\t\tspread.setId(\"spread\");\n\n\t\tspreadRow.add(spreadLabel);\n\t\tspreadRow.add(spread);\n\n\t\tconst minSpreadWidthLabel = new UILabel(strings.get(keys[5]), \"min-spread-width\");\n\t\tconst minSpreadWidthRow = new UIRow();\n\t\tminSpreadWidth.dom.onchange = (e) => {\n\n\t\t\treader.emit(\"spreadchanged\", {\n\t\t\t\tmod: undefined,\n\t\t\t\tmin: parseInt(e.target.value)\n\t\t\t});\n\t\t};\n\t\tminSpreadWidth.setId(\"min-spread-width\");\n\t\tminSpreadWidthRow.add(minSpreadWidthLabel);\n\t\tminSpreadWidthRow.add(minSpreadWidth);\n\n\t\t//-- pagination --//\n\n\t\tconst paginationStr = strings.get(\"sidebar/settings/pagination\");\n\t\tconst paginationRow = new UIRow();\n\t\tconst pagination = new UIInput(\"checkbox\", false, paginationStr[1]);\n\t\tpagination.setId(\"pagination\");\n\t\tpagination.dom.onclick = (e) => {\n\n\t\t\t// not implemented\n\t\t};\n\n\t\tpaginationRow.add(new UILabel(paginationStr[0], \"pagination\"));\n\t\tpaginationRow.add(pagination);\n\n\t\tthis.add(new UIBox([\n\t\t\tlanguageRow,\n\t\t\tfontSizeRow,\n\t\t\tflowRow,\n\t\t\tspreadRow,\n\t\t\tminSpreadWidthRow,\n\t\t\t//paginationRow\n\t\t]));\n\n\t\t//-- events --//\n\n\t\treader.on(\"bookready\", (cfg) => {\n\n\t\t\tlanguage.setValue(cfg.language);\n\t\t\tfontSize.setValue(cfg.styles.fontSize);\n\t\t\tflow.setValue(cfg.flow);\n\t\t\tspread.setValue(cfg.spread.mod);\n\t\t\tminSpreadWidth.setValue(cfg.spread.min);\n\t\t\tminSpreadWidth.dom.disabled = cfg.spread.mod === \"none\";\n\t\t});\n\n\t\treader.on(\"layout\", (props) => {\n\n\t\t\tif (props.flow === \"scrolled\") {\n\t\t\t\tspread.setValue(\"none\");\n\t\t\t\tspread.dom.disabled = true;\n\t\t\t\tminSpreadWidth.dom.disabled = true;\n\t\t\t} else {\n\t\t\t\tspread.dom.disabled = false;\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\theaderLabel.setTextContent(strings.get(keys[0]));\n\t\t\tlanguageLabel.setTextContent(strings.get(keys[1]));\n\t\t\tfontSizeLabel.setTextContent(strings.get(keys[2]));\n\t\t\tflowLabel.setTextContent(strings.get(keys[3]));\n\t\t\tspreadLabel.setTextContent(strings.get(keys[4]));\n\t\t\tminSpreadWidthLabel.setTextContent(strings.get(keys[5]));\n\t\t});\n\t}\n}","import { UIBox, UIDiv, UIItem, UIList, UIPanel, UIText } from \"../ui.js\";\n\nexport class MetadataPanel extends UIPanel {\n\n\tconstructor(reader) {\n\n\t\tsuper();\n\t\tconst container = new UIDiv().setClass(\"list-container\");\n\t\tconst strings = reader.strings;\n\t\tconst labels = {};\n\t\tconst key = \"sidebar/metadata\";\n\t\tconst label = new UIText(strings.get(key)).setClass(\"label\");\n\t\tthis.add(new UIBox(label).addClass(\"header\"));\n\t\tlabels[key] = label;\n\n\t\tthis.items = new UIList();\n\t\tthis.setId(\"metadata\");\n\t\tthis.add(container);\n\n\t\tconst init = (prop, meta) => {\n\t\t\tif (meta[prop] === undefined ||\n\t\t\t\tmeta[prop] === null || (typeof meta[prop] === \"string\" && meta[prop].length === 0)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst item = new UIItem();\n\t\t\tconst label = new UIText().setClass(\"label\");\n\t\t\tconst value = new UIText().setClass(\"value\");\n\t\t\tlabel.setValue(strings.get(key + \"/\" + prop).toUpperCase());\n\t\t\tif (prop === \"description\") {\n\t\t\t\tvalue.dom.innerHTML = meta[prop];\n\t\t\t} else {\n\t\t\t\tvalue.setValue(meta[prop]);\n\t\t\t}\n\t\t\tlabels[key + \"/\" + prop] = label;\n\t\t\titem.add([label, value]);\n\t\t\tthis.items.add(item);\n\t\t}\n\n\t\t//-- events --//\n\n\t\treader.on(\"metadata\", (meta) => {\n\n\t\t\tthis.items.clear();\n\t\t\tcontainer.clear();\n\t\t\tcontainer.add(this.items);\n\t\t\tdocument.title = meta.title;\n\t\t\tfor (const prop in meta) {\n\t\t\t\tinit(prop, meta);\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\tfor (const prop in labels) {\n\t\t\t\tlet text;\n\t\t\t\tif (prop === key) {\n\t\t\t\t\ttext = strings.get(prop);\n\t\t\t\t} else {\n\t\t\t\t\ttext = strings.get(prop).toUpperCase();\n\t\t\t\t}\n\t\t\t\tlabels[prop].setValue(text);\n\t\t\t}\n\t\t});\n\t}\n}","import { UITabbedPanel, UIInput, UIDiv } from \"./ui.js\";\nimport { TocPanel } from \"./sidebar/toc.js\";\nimport { BookmarksPanel } from \"./sidebar/bookmarks.js\";\nimport { AnnotationsPanel } from \"./sidebar/annotations.js\";\nimport { SearchPanel } from \"./sidebar/search.js\";\nimport { SettingsPanel } from \"./sidebar/settings.js\";\nimport { MetadataPanel } from \"./sidebar/metadata.js\";\n\nexport class Sidebar {\n\n\tconstructor(reader) {\n\n\t\tconst strings = reader.strings;\n\t\tconst controls = reader.settings;\n\t\tconst keys = [\n\t\t\t\"sidebar/close\",\n\t\t\t\"sidebar/contents\",\n\t\t\t\"sidebar/bookmarks\",\n\t\t\t\"sidebar/annotations\",\n\t\t\t\"sidebar/search\",\n\t\t\t\"sidebar/settings\",\n\t\t\t\"sidebar/metadata\"\n\t\t];\n\n\t\tconst container = new UITabbedPanel(\"vertical\").setId(\"sidebar\");\n\n\t\tconst openerBox = new UIDiv().setId(\"btn-p\").addClass(\"box\");\n\t\tconst openerBtn = new UIInput(\"button\");\n\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\topenerBtn.dom.onclick = (e) => {\n\n\t\t\treader.emit(\"sidebaropener\", false);\n\t\t\te.preventDefault();\n\t\t\topenerBtn.dom.blur();\n\t\t};\n\t\topenerBox.add(openerBtn);\n\t\tcontainer.addMenu(openerBox);\n\n\t\tcontainer.addTab(\"btn-t\", strings.get(keys[1]), new TocPanel(reader));\n\t\tif (controls.bookmarks) {\n\t\t\tconst bookmarkPanel = new BookmarksPanel(reader);\n\t\t\tcontainer.addTab(\"btn-d\", strings.get(keys[2]), bookmarkPanel);\n\t\t\treader.bookmarksPanel = bookmarkPanel;\n\t\t}\n\t\tif (controls.annotations) {\n\t\t\tconst annotationPanel = new AnnotationsPanel(reader);\n\t\t\tcontainer.addTab(\"btn-a\", strings.get(keys[3]), annotationPanel);\n\t\t\treader.annotationsPanel = annotationPanel;\n\t\t}\n\n\t\tcontainer.addTab(\"btn-s\", strings.get(keys[4]), new SearchPanel(reader));\n\t\tcontainer.addTab(\"btn-c\", strings.get(keys[5]), new SettingsPanel(reader));\n\t\tcontainer.addTab(\"btn-i\", strings.get(keys[6]), new MetadataPanel(reader));\n\t\tcontainer.select(\"btn-t\");\n\n\t\tdocument.body.appendChild(container.dom);\n\n\t\t//-- events --//\n\n\t\treader.on(\"sidebaropener\", (value) => {\n\n\t\t\tif (value) {\n\t\t\t\tcontainer.setClass(\"open\");\n\t\t\t} else {\n\t\t\t\tcontainer.removeAttribute(\"class\");\n\t\t\t}\n\t\t});\n\n\t\treader.on(\"languagechanged\", (value) => {\n\n\t\t\topenerBtn.setTitle(strings.get(keys[0]));\n\t\t\tcontainer.setLabel(\"btn-t\", strings.get(keys[1]));\n\t\t\tif (controls.bookmarks) {\n\t\t\t\tcontainer.setLabel(\"btn-d\", strings.get(keys[2]));\n\t\t\t}\n\t\t\tif (controls.annotations) {\n\t\t\t\tcontainer.setLabel(\"btn-a\", strings.get(keys[3]));\n\t\t\t}\n\t\t\tcontainer.setLabel(\"btn-s\", strings.get(keys[4]));\n\t\t\tcontainer.setLabel(\"btn-c\", strings.get(keys[5]));\n\t\t\tcontainer.setLabel(\"btn-i\", strings.get(keys[6]));\n\t\t});\n\t}\n}","import { uuid } from \"./utils.js\";\nimport { UIBox, UIDiv, UIInput, UILabel } from \"./ui.js\";\n\nexport class NoteDlg {\n\n constructor(reader) {\n\n const container = new UIDiv().setId(\"notedlg\");\n const strings = reader.strings;\n const keys = [\n \"notedlg/label\",\n \"notedlg/add\"\n ];\n const label = new UILabel(strings.get(keys[0]), \"note-input\");\n const textBox = new UIInput(\"text\", \"\").setId(\"note-input\");\n textBox.dom.oninput = (e) => {\n\n this.update();\n e.preventDefault();\n };\n\n const addBtn = new UIInput(\"button\", strings.get(keys[1]));\n addBtn.dom.disabled = true;\n addBtn.dom.onclick = (e) => {\n\n const note = {\n cfi: this.cfi,\n date: new Date(),\n text: textBox.getValue(),\n uuid: uuid()\n };\n this.range = undefined;\n reader.settings.annotations.push(note);\n reader.emit(\"noteadded\", note);\n container.removeAttribute(\"class\");\n e.preventDefault();\n addBtn.dom.blur();\n };\n\n this.update = () => {\n\n addBtn.dom.disabled = !(this.range && textBox.getValue().length > 0);\n };\n\n container.add(new UIBox([label, textBox, addBtn]).addClass(\"control\"));\n document.body.appendChild(container.dom);\n\n //-- events --//\n\n reader.on(\"selected\", (cfi, contents) => {\n\n this.cfi = cfi;\n this.range = contents.range(cfi);\n this.update();\n container.setClass(\"open\");\n textBox.setValue(\"\");\n });\n\n reader.on(\"unselected\", () => {\n\n this.range = undefined;\n this.update();\n container.removeAttribute(\"class\");\n });\n\n reader.on(\"languagechanged\", (value) => {\n\n label.setTextContent(strings.get(keys[0]));\n addBtn.setValue(strings.get(keys[1]));\n });\n }\n}","import { UIDiv, UILabel, UIInput } from \"./ui.js\";\r\n\r\nexport class Status {\r\n constructor(reader) {\r\n const strings = reader.strings;\r\n const settings = reader.settings;\r\n\r\n const container = new UIDiv().setId(\"status-bar\");\r\n const keys = [\r\n \"status/fullscreen\",\r\n \"status/apprec\",\r\n ];\r\n\r\n /* ---------------------------- Status Bar ----------------------------- */\r\n const leftText = new UIDiv().setClass(\"status-title\");\r\n const rightAction = new UIDiv().setClass(\"status-action\");\r\n\r\n let text = new UILabel().setClass(\"status-text\").setTextContent(\"Trang cuối của chương\");\r\n leftText.add(text);\r\n\r\n\r\n // Button apps rectangle\r\n let appRecBtn;\r\n const appRecBox = new UIDiv().setId(\"btn-ar\").setClass(\"box\");\r\n appRecBtn = new UIInput(\"button\");\r\n appRecBtn.setTitle(strings.get(keys[1]));\r\n\r\n appRecBtn.dom.onclick = (e) => {\r\n e.preventDefault();\r\n toggleBookList();\r\n };\r\n\r\n appRecBox.add(appRecBtn);\r\n rightAction.add(appRecBox);\r\n\r\n function toggleBookList() {\r\n const bookList = [\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 1 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 2 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 3 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 4 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 5 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 6 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 7 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 8 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 9 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 10 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 11 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 12 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 13 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 14 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 15 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 16 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 17 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 18 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 19 },\r\n { title: \"Determined\", author: \"Robert M. Sapolsky\", page: 20 },\r\n ];\r\n\r\n let existingModal = document.getElementById('book-list-modal');\r\n if (!existingModal) {\r\n let modal = document.createElement('div');\r\n modal.setAttribute('id', 'book-list-modal');\r\n modal.setAttribute('class', 'book-modal');\r\n\r\n let modalContent = document.createElement('div');\r\n modalContent.setAttribute('class', 'book-modal-content');\r\n\r\n let bookGrid = document.createElement('div');\r\n bookGrid.setAttribute('class', 'book-grid');\r\n bookList.forEach((book) => {\r\n let bookItem = document.createElement('div');\r\n bookItem.setAttribute('class', 'book-item');\r\n bookItem.innerHTML = `\r\n
\r\n

${book.title}

\r\n

${book.author}

\r\n
\r\n
${book.page}
\r\n `;\r\n bookGrid.appendChild(bookItem);\r\n });\r\n\r\n modalContent.appendChild(bookGrid);\r\n modal.appendChild(modalContent);\r\n\r\n container.dom.appendChild(modal);\r\n }\r\n\r\n let modal = document.getElementById('book-list-modal');\r\n modal.classList.toggle(\"active\");\r\n }\r\n\r\n\r\n // Button Full Screen\r\n let fullscreenBtn;\r\n if (settings.fullscreen) {\r\n\r\n const fullscreenBox = new UIDiv().setId(\"btn-f\").setClass(\"box\");\r\n fullscreenBtn = new UIInput(\"button\");\r\n fullscreenBtn.setTitle(strings.get(keys[0]));\r\n fullscreenBtn.dom.onclick = (e) => {\r\n\r\n this.toggleFullScreen();\r\n e.preventDefault();\r\n };\r\n\r\n document.onkeydown = (e) => {\r\n\r\n if (e.key === \"F11\") {\r\n e.preventDefault();\r\n this.toggleFullScreen();\r\n }\r\n };\r\n\r\n document.onfullscreenchange = (e) => {\r\n\r\n // const w = window.screen.width === e.target.clientWidth;\r\n // const h = window.screen.height === e.target.clientHeight;\r\n\r\n if (document.fullscreenElement) {\r\n fullscreenBox.addClass(\"resize-small\");\r\n } else {\r\n fullscreenBox.removeClass(\"resize-small\");\r\n }\r\n };\r\n\r\n\r\n fullscreenBox.add(fullscreenBtn);\r\n rightAction.add(fullscreenBox);\r\n }\r\n\r\n reader.on(\"languagechanged\", (value) => {\r\n if (settings.fullscreen) {\r\n fullscreenBtn.setTitle(strings.get(keys[0]));\r\n }\r\n });\r\n\r\n\r\n container.add([leftText, rightAction]);\r\n document.body.appendChild(container.dom);\r\n }\r\n\r\n toggleFullScreen() {\r\n\r\n document.activeElement.blur();\r\n\r\n if (document.fullscreenElement === null) {\r\n document.documentElement.requestFullscreen();\r\n } else if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n }\r\n }\r\n}\r\n","import EventEmitter from \"event-emitter\";\n\nimport { extend, detectMobile } from \"./utils.js\";\nimport { Storage } from \"./storage.js\";\nimport { Strings } from \"./strings.js\";\nimport { Toolbar } from \"./toolbar.js\";\nimport { Content } from \"./content.js\";\nimport { Sidebar } from \"./sidebar.js\";\nimport { NoteDlg } from \"./notedlg.js\";\nimport { Status } from \"./status.js\";\n\nexport class Reader {\n\n\tconstructor(bookPath, settings) {\n\n\t\tconst preinit = (data) => {\n\t\t\tconst url = new URL(window.location);\n\t\t\tlet path = bookPath;\n\t\t\tif (settings && !settings.openbook) {\n\t\t\t\tpath = bookPath;\n\t\t\t\tif (data) this.storage.clear();\n\t\t\t} else if (data && url.search.length === 0) {\n\t\t\t\tpath = data;\n\t\t\t}\n\t\t\tthis.cfgInit(path, settings);\n\t\t\tthis.strings = new Strings(this);\n\t\t\tthis.toolbar = new Toolbar(this);\n\t\t\tthis.content = new Content(this);\n\t\t\tthis.status = new Status(this);\n\t\t\tthis.sidebar = new Sidebar(this);\n\t\t\tif (this.settings.annotations) {\n\t\t\t\tthis.notedlg = new NoteDlg(this);\n\t\t\t}\n\t\t\tthis.init();\n\t\t}\n\n\t\tthis.settings = undefined;\n\t\tthis.isMobile = detectMobile();\n\t\tthis.storage = new Storage();\n\t\tconst openbook = settings && settings.openbook;\n\n\t\tif (this.storage.indexedDB && (!settings || openbook)) {\n\t\t\tthis.storage.init(() => this.storage.get((data) => preinit(data)));\n\t\t} else {\n\t\t\tpreinit();\n\t\t}\n\n\t\twindow.onbeforeunload = this.unload.bind(this);\n\t\twindow.onhashchange = this.hashChanged.bind(this);\n\t\twindow.onkeydown = this.keyboardHandler.bind(this);\n\t\twindow.onwheel = (e) => {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Initialize book.\n\t * @param {*} bookPath\n\t * @param {*} settings\n\t */\n\tinit(bookPath, settings) {\n\n\t\tthis.emit(\"viewercleanup\");\n\t\tthis.navItems = {};\n\n\t\tif (arguments.length > 0) {\n\n\t\t\tthis.cfgInit(bookPath, settings);\n\t\t}\n\n\t\tthis.book = ePub(this.settings.bookPath);\n\t\tthis.rendition = this.book.renderTo(\"viewer\", {\n\t\t\tmanager: this.settings.manager,\n\t\t\tflow: this.settings.flow,\n\t\t\tspread: this.settings.spread.mod,\n\t\t\tminSpreadWidth: this.settings.spread.min,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tsnap: true\n\t\t});\n\n\t\tconst cfi = this.settings.previousLocationCfi;\n\t\tif (cfi) {\n\t\t\tthis.displayed = this.rendition.display(cfi);\n\t\t} else {\n\t\t\tthis.displayed = this.rendition.display();\n\t\t}\n\n\t\tthis.displayed.then((renderer) => {\n\t\t\tthis.emit(\"displayed\", renderer, this.settings);\n\t\t});\n\n\t\tthis.book.ready.then(() => {\n\t\t\tthis.emit(\"bookready\", this.settings);\n\t\t}).then(() => {\n\t\t\tthis.emit(\"bookloaded\");\n\t\t});\n\n\t\tthis.book.loaded.metadata.then((meta) => {\n\t\t\tthis.emit(\"metadata\", meta);\n\t\t});\n\n\t\tthis.book.loaded.navigation.then((toc) => {\n\t\t\tthis.emit(\"bookready\", toc);\n\t\t});\n\n\t\tthis.rendition.on(\"click\", (e) => {\n\t\t\tconst selection = e.view.document.getSelection();\n\t\t\tif (selection.type !== \"Range\") {\n\t\t\t\tthis.emit(\"unselected\");\n\t\t\t}\n\t\t});\n\n\t\tthis.rendition.on(\"layout\", (props) => {\n\t\t\tthis.emit(\"layout\", props);\n\t\t});\n\n\t\tthis.rendition.on(\"selected\", (cfiRange, contents) => {\n\t\t\tthis.setLocation(cfiRange);\n\t\t\tthis.emit(\"selected\", cfiRange, contents);\n\t\t});\n\n\t\tthis.rendition.on(\"relocated\", (location) => {\n\t\t\tthis.setLocation(location.start.cfi);\n\t\t\tthis.emit(\"relocated\", location);\n\t\t});\n\n\t\tthis.rendition.on(\"keydown\", this.keyboardHandler.bind(this));\n\n\t\tthis.on(\"prev\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.next();\n\t\t\t} else {\n\t\t\t\tthis.rendition.prev();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"next\", () => {\n\t\t\tif (this.book.package.metadata.direction === \"rtl\") {\n\t\t\t\tthis.rendition.prev();\n\t\t\t} else {\n\t\t\t\tthis.rendition.next();\n\t\t\t}\n\t\t});\n\n\t\tthis.on(\"languagechanged\", (value) => {\n\t\t\tthis.settings.language = value;\n\t\t});\n\n\t\tthis.on(\"flowchanged\", (value) => {\n\t\t\tthis.settings.flow = value;\n\t\t\tthis.rendition.flow(value);\n\t\t});\n\n\t\tthis.on(\"spreadchanged\", (value) => {\n\t\t\tconst mod = value.mod || this.settings.spread.mod;\n\t\t\tconst min = value.min || this.settings.spread.min;\n\t\t\tthis.settings.spread.mod = mod;\n\t\t\tthis.settings.spread.min = min;\n\t\t\tthis.rendition.spread(mod, min);\n\t\t});\n\n\t\tthis.on(\"styleschanged\", (value) => {\n\t\t\tconst fontSize = value.fontSize;\n\t\t\tthis.settings.styles.fontSize = fontSize;\n\t\t\tthis.rendition.themes.fontSize(fontSize + \"px\");\n\t\t});\n\t}\n\n\t/* ------------------------------- Common ------------------------------- */\n\n\tnavItemFromCfi(cfi) {\n\n\t\t// This feature was added to solve the problem of duplicate titles in \n\t\t// bookmarks. But this still has no solution because when reloading the \n\t\t// reader, rendition cannot get the range from the previously saved CFI.\n\t\tconst range = this.rendition.getRange(cfi);\n\t\tconst idref = range ? range.startContainer.parentNode.id : undefined;\n\t\tconst location = this.rendition.currentLocation();\n\t\tconst href = location.start.href;\n\t\treturn this.navItems[href + \"#\" + idref] || this.navItems[href];\n\t}\n\n\t/* ------------------------------ Bookmarks ----------------------------- */\n\n\t/**\n\t * Verifying the current page in bookmarks.\n\t * @param {*} cfi\n\t * @returns The index of the bookmark if it exists, or -1 otherwise.\n\t */\n\tisBookmarked(cfi) {\n\t\treturn this.settings.bookmarks.indexOf(cfi);\n\t}\n\n\t/* ----------------------------- Annotations ---------------------------- */\n\n\tisAnnotated(note) {\n\n\t\treturn this.settings.annotations.indexOf(note);\n\t}\n\n\t/* ------------------------------ Settings ------------------------------ */\n\n\t/**\n\t * Initialize book settings.\n\t * @param {any} bookPath\n\t * @param {any} settings\n\t */\n\tcfgInit(bookPath, settings) {\n\n\t\tthis.entryKey = md5(bookPath).toString();\n\t\tthis.settings = {\n\t\t\tbookPath: bookPath,\n\t\t\tarrows: this.isMobile ? \"none\" : \"content\", // none | content | toolbar\n\t\t\tmanager: this.isMobile ? \"continuous\" : \"default\",\n\t\t\trestore: true,\n\t\t\thistory: true,\n\t\t\topenbook: this.storage.indexedDB ? true : false,\n\t\t\tlanguage: \"en\",\n\t\t\tsectionId: undefined,\n\t\t\tbookmarks: [], // array | false\n\t\t\tannotations: [], // array | false\n\t\t\tflow: \"paginated\", // paginated | scrolled\n\t\t\tspread: {\n\t\t\t\tmod: \"auto\", // auto | none\n\t\t\t\tmin: 800\n\t\t\t},\n\t\t\tstyles: {\n\t\t\t\tfontSize: 16\t// Default fontsize by 'px'\n\t\t\t},\n\t\t\tpagination: undefined, // not implemented\n\t\t\tfullscreen: document.fullscreenEnabled,\n\t\t\tbackground: [],\t// Setting for change background \"viewer\"\n\t\t};\n\n\t\textend(settings || {}, this.settings);\n\n\t\tif (this.settings.restore) {\n\t\t\tthis.applySavedSettings(settings || {});\n\t\t} else {\n\t\t\tthis.removeSavedSettings();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the book setting can be retrieved from localStorage.\n\t * @returns true if the book key exists, or false otherwise.\n\t */\n\tisSaved() {\n\n\t\treturn localStorage && localStorage.getItem(this.entryKey) !== null;\n\t}\n\n\t/**\n\t * Removing the current book settings from local storage.\n\t * @returns true if the book settings were deleted successfully, or false\n\t * otherwise.\n\t */\n\tremoveSavedSettings() {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlocalStorage.removeItem(this.entryKey);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Applies saved settings from local storage.\n\t * @param {*} external External settings\n\t * @returns True if the settings were applied successfully, false otherwise.\n\t */\n\tapplySavedSettings(external) {\n\n\t\tif (!this.isSaved())\n\t\t\treturn false;\n\n\t\tlet stored;\n\t\ttry {\n\t\t\tstored = JSON.parse(localStorage.getItem(this.entryKey));\n\t\t} catch (e) {\n\t\t\tconsole.exception(e);\n\t\t}\n\n\t\tif (stored) {\n\t\t\textend(stored, this.settings, external);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Saving the current book settings in local storage.\n\t */\n\tsaveSettings() {\n\n\t\tthis.settings.previousLocationCfi = this.rendition.location.start.cfi;\n\t\tconst cfg = Object.assign({}, this.settings);\n\t\tdelete cfg.arrows;\n\t\tdelete cfg.manager;\n\t\tdelete cfg.history;\n\t\tdelete cfg.restore;\n\t\tdelete cfg.openbook;\n\t\tdelete cfg.pagination;\n\t\tdelete cfg.fullscreen;\n\t\tdelete cfg.background;\n\t\tlocalStorage.setItem(this.entryKey, JSON.stringify(cfg));\n\t}\n\n\tsetLocation(cfi) {\n\n\t\tconst baseUrl = this.book.archived ? undefined : this.book.url;\n\t\tconst url = new URL(window.location, baseUrl);\n\t\turl.hash = \"#\" + cfi;\n\n\t\t// Update the History Location\n\t\tif (this.settings.history && window.location.hash !== url.hash) {\n\t\t\t// Add CFI fragment to the history\n\t\t\twindow.history.pushState({}, \"\", url);\n\t\t\tthis.currentLocationCfi = cfi;\n\t\t}\n\t}\n\n\t//-- event handlers --//\n\n\tunload() {\n\n\t\tif (this.settings.restore && localStorage) {\n\t\t\tthis.saveSettings();\n\t\t}\n\t}\n\n\thashChanged() {\n\n\t\tconst hash = window.location.hash.slice(1);\n\t\tthis.rendition.display(hash);\n\t}\n\n\tkeyboardHandler(e) {\n\n\t\tconst step = 1;\n\t\tlet value = this.settings.styles.fontSize;\n\n\t\tswitch (e.key) {\n\n\t\t\tcase \"=\":\n\t\t\tcase \"+\":\n\t\t\t\tvalue += step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"-\":\n\t\t\t\tvalue -= step;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"0\":\n\t\t\t\tvalue = 16;\n\t\t\t\tthis.emit(\"styleschanged\", { fontSize: value });\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tthis.emit(\"prev\");\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tthis.emit(\"next\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nEventEmitter(Reader.prototype);"],"names":["isValue","isPlainFunction","assign","normalizeOpts","contains","module","exports","dscr","value","c","e","w","options","desc","arguments","length","call","configurable","enumerable","writable","gs","get","set","undefined","Object","obj","foo","bar","trzy","keys","max","Math","dest","src","error","i","key","forEach","_undefined","val","object","Array","prototype","create","opts1","result","process","fn","TypeError","String","str","indexOf","searchString","this","on","once","off","emit","methods","descriptors","base","d","callable","apply","Function","defineProperty","defineProperties","hasOwnProperty","descriptor","type","listener","self","__eeOnceListener__","data","__ee__","push","listeners","candidate","splice","l","args","slice","o","isPrototype","possibleTypes","isFunction","classRe","functionToString","toString","test","isObject","constructor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","prop","r","Symbol","toStringTag","q","dst","ext","extend","uuid","Date","getTime","replace","random","floor","Storage","name","version","db","indexedDB","window","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","console","init","callback","time","now","onerror","request","open","onupgradeneeded","target","objectStoreNames","createObjectStore","onsuccess","log","transaction","objectStore","put","clear","Strings","reader","language","settings","values","en","fr","ja","ru","vi","ERROR_MSG","UIElement","tag","dom","document","createElement","add","argument","appendChild","isArray","j","element","remove","removeChild","Number","isInteger","childNodes","children","lastChild","setId","id","getId","removeAttribute","setClass","className","addClass","classList","removeClass","setStyle","style","getTitle","title","setTitle","getTextContent","textContent","setTextContent","text","getBoundingClientRect","UISpan","super","UIDiv","UIRow","UIPanel","UILabel","htmlFor","UILink","href","setHref","url","UIText","getValue","setValue","UISelect","setMultiple","boolean","multiple","setOptions","selected","option","UIInput","onkeydown","stopPropagation","getName","setName","getType","setType","UINumber","step","min","precision","onchange","setPrecision","setRange","setStep","parseFloat","toFixed","UITabbedPanel","align","tabs","panels","selector","menuDiv","tabsDiv","panelsDiv","addMenu","items","addTab","label","tab","UITab","panel","select","transformSelector","display","setLabel","size","rect","width","transform","height","parent","button","onclick","preventDefault","UIList","expanded","expand","collaps","UIItem","len","box","unselect","UIBox","SearchPanel","container","strings","searchQuery","search","placeholder","onsearch","doSearch","then","results","book","Promise","all","spine","spineItems","map","item","load","bind","find","finally","unload","resolve","concat","link","cfi","excerpt","rendition","Toolbar","menu1","openerBox","openerBtn","prevBox","prevBtn","nextBox","nextBtn","blur","arrows","logoBox","logoLink","tocBox","tocBtn","bookmarksBox","bookmarksBtn","annotationsBox","annotationsBtn","updateBookmarksList","bookmarksList","getElementById","innerHTML","bookmarks","index","bookmarkItem","bookmarkLink","deleteBtn","querySelectorAll","removeBookmarkFromToolbar","loaded","navigation","toc","existingToc","tocList","setAttribute","tocTitle","chapter","tocItem","tocLink","toggle","showToc","bookmarkBox","showBookmarks","bookmarkItems","targetItem","from","querySelector","includes","bookmarksPanel","removeBookmark","annotationsList","annotations","note","noteItem","noteLink","removeNoteFromToolbar","showAnnotations","noteItems","annotationsPanel","removeNote","update","findIndex","n","centerPageCount","centerLabel","curOfTotal","curPageIndex","separator","totalPage","menu2","backgroundBox","colorPicker","background","oninput","selectedColor","openbookBtn","searchBox","searchBtn","bookmarkBtn","fullscreenBtn","closeBox","closeBtn","fontLabel","fontSizeBox","decreaseFontBtn","increaseFontBtn","fontSizeInput","fontSize","newSize","parseInt","isNaN","openbook","onload","storage","URL","location","origin","history","pushState","openbookBox","accept","files","FileReader","readAsArrayBuffer","alert","searchPopup","searchContainer","searchIcon","searchInput","resultContainer","searchPanel","async","query","trim","noResultItem","innerText","color","padding","showSearchPopup","locationCfi","isBookmarked","fullscreen","fullscreenBox","toggleFullScreen","onfullscreenchange","screen","clientWidth","h","clientHeight","body","start","atStart","atEnd","backgroundBtn","activeElement","fullscreenElement","documentElement","requestFullscreen","exitFullscreen","Content","prev","iconLeft","viewer","next","backgroundColor","iconRight","loader","divider","overlay","cfg","flow","props","spread","spreadWidth","setTimeout","TocPanel","generateToc","list","ibtn","sectionId","navItems","subitems","subItems","BookmarksPanel","headerLabel","clearBtn","clearBookmarks","disabled","renderer","setBookmark","appendBookmark","_cfi","btnr","navItem","navItemFromCfi","idref","spineItem","AnnotationsPanel","clearNotes","notes","toolbarList","toolbarNoteItem","toolbarNoteLink","SettingsPanel","languageLabel","languageRow","fontSizeLabel","fontSizeRow","flowLabel","flowRow","paginated","scrolled","mod","minSpreadWidth","spreadLabel","spreadRow","none","auto","minSpreadWidthLabel","minSpreadWidthRow","paginationStr","paginationRow","pagination","styles","MetadataPanel","labels","meta","toUpperCase","Sidebar","controls","bookmarkPanel","annotationPanel","NoteDlg","textBox","addBtn","date","range","contents","Status","leftText","rightAction","appRecBtn","appRecBox","bookList","author","page","modal","modalContent","bookGrid","bookItem","toggleBookList","Reader","bookPath","preinit","path","cfgInit","toolbar","content","status","sidebar","notedlg","isMobile","some","navigator","userAgent","match","onbeforeunload","onhashchange","hashChanged","keyboardHandler","onwheel","ctrlKey","ePub","renderTo","manager","snap","previousLocationCfi","displayed","ready","metadata","view","getSelection","cfiRange","setLocation","package","direction","themes","getRange","startContainer","parentNode","currentLocation","isAnnotated","entryKey","md5","restore","fullscreenEnabled","applySavedSettings","removeSavedSettings","isSaved","localStorage","getItem","removeItem","external","stored","JSON","parse","exception","saveSettings","setItem","stringify","baseUrl","archived","hash","currentLocationCfi"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/js/eventProcess.js b/dist/js/eventProcess.js new file mode 100644 index 0000000..08af0df --- /dev/null +++ b/dist/js/eventProcess.js @@ -0,0 +1,55 @@ +// Xu ly su kien khi click vao bat cu vi tri nao tren man hinh ngoai tocList thi se dong muc luc +document.addEventListener("click", (e) => { + const tocBtn = document.querySelector("#btn-t.box input"); + const tocList = document.querySelector("#toolbar-toc-list"); + + if (tocList && !tocList.contains(e.target) && !tocBtn.contains(e.target)) { + tocList.classList.remove("active"); + } +}) + +// Xy ly su kien khi click vao bat cu vi tri nao tren man hinh ngoai annotationsList thi se dong danh sach ghi chu +document.addEventListener("click", (e) => { + const annotationBtn = document.querySelector("#btn-a.box input"); + const annotationList = document.querySelector("#toolbar-annotations-list"); + + if (annotationList && !annotationList.contains(e.target) && !annotationBtn.contains(e.target)) { + annotationList.classList.remove("active"); + } +}) + + +// Xy ly su kien khi click vao bat cu vi tri nao tren man hinh ngoai bookmarkList thi se dong danh sach bookmark +document.addEventListener("click", (e) => { + const bookmarkBtn = document.querySelector("#btn-d.box input"); + const bookmarkList = document.querySelector("#toolbar-bookmarks-list"); + + if (bookmarkList && !bookmarkList.contains(e.target) && !bookmarkBtn.contains(e.target)) { + bookmarkList.classList.remove("active"); + } +}) + + +// +document.addEventListener("click", (e) => { + const searchBtn = document.querySelector("#btn-s.box input"); + const searchPopup = document.querySelector("#toolbar-search-list"); + + if (searchPopup && !searchPopup.contains(e.target) && !searchBtn.contains(e.target)) { + searchPopup.classList.remove("active"); + } +}) + + +// +document.querySelectorAll(".book-item").forEach((item) => { + item.addEventListener("click", () => { + document.querySelectorAll(".book-item").forEach((el) => { + el.classList.remove("clicked"); + el.querySelector(".book-cover").classList.remove("clicked"); + }) + + item.classList.add("clicked"); + item.querySelector(".book-cover").classList.add("clicked"); + }) +}) \ No newline at end of file diff --git a/package.json b/package.json index 0e0907d..46508e0 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,9 @@ "build": "webpack --mode=production --progress", "serve": "webpack serve", "minify": "webpack --mode=production --optimization-minimize --progress", - "prepare": "npm run build && npm run minify" + "prepare": "npm run build && npm run minify", + "start": "npm run build && npm run minify && npm run serve", + "vercel-build": "npm run build" }, "author": "fchasen@gmail.com", "license": "MIT", diff --git a/public/epub-book/alice.epub b/public/epub-book/alice.epub new file mode 100644 index 0000000..9ac6ba3 Binary files /dev/null and b/public/epub-book/alice.epub differ diff --git a/public/epub-book/luoc-su-van-vat.epub b/public/epub-book/luoc-su-van-vat.epub new file mode 100644 index 0000000..a794827 Binary files /dev/null and b/public/epub-book/luoc-su-van-vat.epub differ diff --git a/public/epub-book/nghe-thuat-tu-duy.epub b/public/epub-book/nghe-thuat-tu-duy.epub new file mode 100644 index 0000000..6cdf891 Binary files /dev/null and b/public/epub-book/nghe-thuat-tu-duy.epub differ diff --git a/public/epub-book/thuat-doc-tam.epub b/public/epub-book/thuat-doc-tam.epub new file mode 100644 index 0000000..d360fbe Binary files /dev/null and b/public/epub-book/thuat-doc-tam.epub differ diff --git a/src/content.js b/src/content.js index d2f3bfa..f7b28f5 100644 --- a/src/content.js +++ b/src/content.js @@ -16,13 +16,20 @@ export class Content { reader.emit("prev"); e.preventDefault(); }; - prev.add(new UISpan("<")); + const iconLeft = new UISpan(); + iconLeft.dom.innerHTML = ''; + prev.add(iconLeft); container.add(prev); } const viewer = new UIDiv().setId("viewer"); container.add(viewer); + // Handle the 'colorchanged' event to change background of 'viewer' + reader.on("colorchanged", (color) => { + viewer.dom.style.backgroundColor = color; + }); + let next; if (settings.arrows === "content") { next = new UIDiv().setId("next").setClass("arrow"); @@ -31,7 +38,9 @@ export class Content { reader.emit("next"); e.preventDefault(); }; - next.add(new UISpan(">")); + const iconRight = new UISpan(); + iconRight.dom.innerHTML = ''; + next.add(iconRight); container.add(next); } @@ -69,7 +78,7 @@ export class Content { }); reader.on("flowchanged", (value) => { - + viewer.setClass(value); }); diff --git a/src/reader.js b/src/reader.js index 5cdcd7d..2a2c205 100644 --- a/src/reader.js +++ b/src/reader.js @@ -7,6 +7,7 @@ import { Toolbar } from "./toolbar.js"; import { Content } from "./content.js"; import { Sidebar } from "./sidebar.js"; import { NoteDlg } from "./notedlg.js"; +import { Status } from "./status.js"; export class Reader { @@ -25,6 +26,7 @@ export class Reader { this.strings = new Strings(this); this.toolbar = new Toolbar(this); this.content = new Content(this); + this.status = new Status(this); this.sidebar = new Sidebar(this); if (this.settings.annotations) { this.notedlg = new NoteDlg(this); @@ -101,7 +103,7 @@ export class Reader { }); this.book.loaded.navigation.then((toc) => { - this.emit("navigation", toc); + this.emit("bookready", toc); }); this.rendition.on("click", (e) => { @@ -163,7 +165,7 @@ export class Reader { this.on("styleschanged", (value) => { const fontSize = value.fontSize; this.settings.styles.fontSize = fontSize; - this.rendition.themes.fontSize(fontSize + "%"); + this.rendition.themes.fontSize(fontSize + "px"); }); } @@ -189,7 +191,6 @@ export class Reader { * @returns The index of the bookmark if it exists, or -1 otherwise. */ isBookmarked(cfi) { - return this.settings.bookmarks.indexOf(cfi); } @@ -227,10 +228,11 @@ export class Reader { min: 800 }, styles: { - fontSize: 100 + fontSize: 16 // Default fontsize by 'px' }, pagination: undefined, // not implemented - fullscreen: document.fullscreenEnabled + fullscreen: document.fullscreenEnabled, + background: [], // Setting for change background "viewer" }; extend(settings || {}, this.settings); @@ -304,6 +306,7 @@ export class Reader { delete cfg.openbook; delete cfg.pagination; delete cfg.fullscreen; + delete cfg.background; localStorage.setItem(this.entryKey, JSON.stringify(cfg)); } @@ -338,7 +341,7 @@ export class Reader { keyboardHandler(e) { - const step = 2; + const step = 1; let value = this.settings.styles.fontSize; switch (e.key) { @@ -353,7 +356,7 @@ export class Reader { this.emit("styleschanged", { fontSize: value }); break; case "0": - value = 100; + value = 16; this.emit("styleschanged", { fontSize: value }); break; case "ArrowLeft": diff --git a/src/sidebar.js b/src/sidebar.js index 78d169e..9510f2b 100644 --- a/src/sidebar.js +++ b/src/sidebar.js @@ -38,11 +38,16 @@ export class Sidebar { container.addTab("btn-t", strings.get(keys[1]), new TocPanel(reader)); if (controls.bookmarks) { - container.addTab("btn-d", strings.get(keys[2]), new BookmarksPanel(reader)); + const bookmarkPanel = new BookmarksPanel(reader); + container.addTab("btn-d", strings.get(keys[2]), bookmarkPanel); + reader.bookmarksPanel = bookmarkPanel; } if (controls.annotations) { - container.addTab("btn-a", strings.get(keys[3]), new AnnotationsPanel(reader)); + const annotationPanel = new AnnotationsPanel(reader); + container.addTab("btn-a", strings.get(keys[3]), annotationPanel); + reader.annotationsPanel = annotationPanel; } + container.addTab("btn-s", strings.get(keys[4]), new SearchPanel(reader)); container.addTab("btn-c", strings.get(keys[5]), new SettingsPanel(reader)); container.addTab("btn-i", strings.get(keys[6]), new MetadataPanel(reader)); diff --git a/src/sidebar/annotations.js b/src/sidebar/annotations.js index 08ed884..41bce23 100644 --- a/src/sidebar/annotations.js +++ b/src/sidebar/annotations.js @@ -32,7 +32,7 @@ export class AnnotationsPanel extends UIPanel { //-- events --// - reader.on("bookready", (cfg) => { + reader.on("navigation", (cfg) => { cfg.annotations.forEach((note) => { @@ -42,7 +42,6 @@ export class AnnotationsPanel extends UIPanel { }); reader.on("noteadded", (note) => { - this.set(note); this.update(); }); @@ -83,6 +82,29 @@ export class AnnotationsPanel extends UIPanel { this.reader.rendition.annotations.add( "highlight", note.cfi, {}, call, "note-highlight", {}); this.update(); + + const toolbarList = document.getElementById("toolbar-annotations-list"); + if (toolbarList) { + const toolbarNoteItem = document.createElement("li"); + const toolbarNoteLink = document.createElement("a"); + toolbarNoteLink.href = "#"; + toolbarNoteLink.textContent = note.text; // sửa lại nếu cần + toolbarNoteLink.onclick = (e) => { + e.preventDefault(); + this.reader.rendition.display(note.cfi); + }; + toolbarNoteItem.appendChild(toolbarNoteLink); + + const deleteBtn = document.createElement("span"); + deleteBtn.innerHTML = ''; + + deleteBtn.onclick = (e) => { + e.stopPropagation(); + this.reader.removeNoteFromToolbar(note); + } + toolbarNoteItem.appendChild(deleteBtn); + toolbarList.appendChild(toolbarNoteItem); + } } removeNote(note) { @@ -95,6 +117,16 @@ export class AnnotationsPanel extends UIPanel { this.reader.settings.annotations.splice(index, 1); this.reader.rendition.annotations.remove(note.cfi, "highlight"); this.update(); + + const toolbarList = document.getElementById("toolbar-annotations-list"); + if (toolbarList) { + const toolbarItems = toolbarList.querySelectorAll("li"); + toolbarItems.forEach(item => { + if (item.querySelector("a").textContent === note.text) { + item.remove(); + } + }) + } } clearNotes() { diff --git a/src/sidebar/bookmarks.js b/src/sidebar/bookmarks.js index 7fcd372..9c0c985 100644 --- a/src/sidebar/bookmarks.js +++ b/src/sidebar/bookmarks.js @@ -49,7 +49,6 @@ export class BookmarksPanel extends UIPanel { }); reader.on("bookmarked", (boolean, cfi) => { - if (boolean) { this.appendBookmark(); } else { @@ -68,15 +67,16 @@ export class BookmarksPanel extends UIPanel { appendBookmark() { const cfi = this.locationCfi; + if (this.reader.isBookmarked(cfi) > -1) { return; } this.setBookmark(cfi); this.reader.settings.bookmarks.push(cfi); + } removeBookmark(cfi) { - const _cfi = cfi || this.locationCfi; const index = this.reader.isBookmarked(_cfi); if (index === -1) { @@ -93,7 +93,6 @@ export class BookmarksPanel extends UIPanel { } setBookmark(cfi) { - const link = new UILink(); const item = new UIItem(); const btnr = new UISpan().setClass("btn-remove"); diff --git a/src/sidebar/settings.js b/src/sidebar/settings.js index 51e2422..f1b63c3 100644 --- a/src/sidebar/settings.js +++ b/src/sidebar/settings.js @@ -25,7 +25,8 @@ export class SettingsPanel extends UIPanel { en: "English", fr: "French", ja: "Japanese", - ru: "Russian" + ru: "Russian", + vi: "Vietnamese" }); language.dom.onchange = (e) => { @@ -37,16 +38,22 @@ export class SettingsPanel extends UIPanel { const fontSizeLabel = new UILabel(strings.get(keys[2]), "fontsize"); const fontSizeRow = new UIRow(); - const fontSize = new UINumber(100, 1); + const fontSize = new UINumber(16, 1); + fontSize.dom.onchange = (e) => { + const newSize = parseInt(e.target.value); - reader.emit("styleschanged", { - fontSize: parseInt(e.target.value) - }); + if (newSize >= 8 && newSize <= 72) { + reader.emit("styleschanged", { + fontSize: newSize + }); + } }; - fontSize.setId("fontsize") + + fontSize.setId("fontsize"); fontSizeRow.add(fontSizeLabel); fontSizeRow.add(fontSize); + fontSize.dom.disabled = true; //-- flow configure --// diff --git a/src/sidebar/toc.js b/src/sidebar/toc.js index 26dedbe..82ac89f 100644 --- a/src/sidebar/toc.js +++ b/src/sidebar/toc.js @@ -18,11 +18,14 @@ export class TocPanel extends UIPanel { //-- events --// - reader.on("navigation", (toc) => { - - container.clear(); - container.add(this.generateToc(toc)); - this.add(container); + reader.on("bookready", () => { + reader.book.loaded.navigation.then((toc) => { + container.clear(); + container.add(this.generateToc(toc)); + this.add(container); + console.log(toc); + + }) }); reader.on("languagechanged", (value) => { diff --git a/src/status.js b/src/status.js new file mode 100644 index 0000000..95220ef --- /dev/null +++ b/src/status.js @@ -0,0 +1,154 @@ +import { UIDiv, UILabel, UIInput } from "./ui.js"; + +export class Status { + constructor(reader) { + const strings = reader.strings; + const settings = reader.settings; + + const container = new UIDiv().setId("status-bar"); + const keys = [ + "status/fullscreen", + "status/apprec", + ]; + + /* ---------------------------- Status Bar ----------------------------- */ + const leftText = new UIDiv().setClass("status-title"); + const rightAction = new UIDiv().setClass("status-action"); + + let text = new UILabel().setClass("status-text").setTextContent("Trang cuối của chương"); + leftText.add(text); + + + // Button apps rectangle + let appRecBtn; + const appRecBox = new UIDiv().setId("btn-ar").setClass("box"); + appRecBtn = new UIInput("button"); + appRecBtn.setTitle(strings.get(keys[1])); + + appRecBtn.dom.onclick = (e) => { + e.preventDefault(); + toggleBookList(); + }; + + appRecBox.add(appRecBtn); + rightAction.add(appRecBox); + + function toggleBookList() { + const bookList = [ + { title: "Determined", author: "Robert M. Sapolsky", page: 1 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 2 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 3 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 4 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 5 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 6 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 7 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 8 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 9 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 10 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 11 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 12 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 13 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 14 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 15 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 16 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 17 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 18 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 19 }, + { title: "Determined", author: "Robert M. Sapolsky", page: 20 }, + ]; + + let existingModal = document.getElementById('book-list-modal'); + if (!existingModal) { + let modal = document.createElement('div'); + modal.setAttribute('id', 'book-list-modal'); + modal.setAttribute('class', 'book-modal'); + + let modalContent = document.createElement('div'); + modalContent.setAttribute('class', 'book-modal-content'); + + let bookGrid = document.createElement('div'); + bookGrid.setAttribute('class', 'book-grid'); + bookList.forEach((book) => { + let bookItem = document.createElement('div'); + bookItem.setAttribute('class', 'book-item'); + bookItem.innerHTML = ` +
+

${book.title}

+

${book.author}

+
+
${book.page}
+ `; + bookGrid.appendChild(bookItem); + }); + + modalContent.appendChild(bookGrid); + modal.appendChild(modalContent); + + container.dom.appendChild(modal); + } + + let modal = document.getElementById('book-list-modal'); + modal.classList.toggle("active"); + } + + + // Button Full Screen + let fullscreenBtn; + if (settings.fullscreen) { + + const fullscreenBox = new UIDiv().setId("btn-f").setClass("box"); + fullscreenBtn = new UIInput("button"); + fullscreenBtn.setTitle(strings.get(keys[0])); + fullscreenBtn.dom.onclick = (e) => { + + this.toggleFullScreen(); + e.preventDefault(); + }; + + document.onkeydown = (e) => { + + if (e.key === "F11") { + e.preventDefault(); + this.toggleFullScreen(); + } + }; + + document.onfullscreenchange = (e) => { + + // const w = window.screen.width === e.target.clientWidth; + // const h = window.screen.height === e.target.clientHeight; + + if (document.fullscreenElement) { + fullscreenBox.addClass("resize-small"); + } else { + fullscreenBox.removeClass("resize-small"); + } + }; + + + fullscreenBox.add(fullscreenBtn); + rightAction.add(fullscreenBox); + } + + reader.on("languagechanged", (value) => { + if (settings.fullscreen) { + fullscreenBtn.setTitle(strings.get(keys[0])); + } + }); + + + container.add([leftText, rightAction]); + document.body.appendChild(container.dom); + } + + toggleFullScreen() { + + document.activeElement.blur(); + + if (document.fullscreenElement === null) { + document.documentElement.requestFullscreen(); + } else if (document.exitFullscreen) { + document.exitFullscreen(); + } + } +} diff --git a/src/strings.js b/src/strings.js index d2adf0e..16d9aa4 100644 --- a/src/strings.js +++ b/src/strings.js @@ -12,6 +12,7 @@ export class Strings { "toolbar/openbook/error": "Your browser does not support the required features.\nPlease use a modern browser such as Google Chrome, or Mozilla Firefox.", "toolbar/bookmark": "Add this page to bookmarks", "toolbar/fullscreen": "Fullscreen", + "toolbar/background": "Change background", "sidebar/close": "Close Sidebar", "sidebar/contents": "Contents", @@ -50,7 +51,10 @@ export class Strings { "sidebar/metadata/direction": "Direction", // page-progression-direction "notedlg/label": "Note", - "notedlg/add": "Add" + "notedlg/add": "Add", + + "status/fullscreen": "Fullscreen", + "status/": "", }, fr: { "toolbar/sidebar": "Barre latérale", @@ -60,6 +64,7 @@ export class Strings { "toolbar/openbook/error": "Votre navigateur ne prend pas en charge les fonctions nécessaires.\nVeuillez utiliser un navigateur moderne tel que Google Chrome ou Mozilla Firefox.", "toolbar/bookmark": "Insérer un marque page ici", "toolbar/fullscreen": "Plein écran", + "toolbar/background": "Changer l'arrière-plan", "sidebar/close": "???", "sidebar/contents": "Sommaire", @@ -98,7 +103,10 @@ export class Strings { "sidebar/metadata/direction": "???", "notedlg/label": "???", - "notedlg/add": "Ajouter" + "notedlg/add": "Ajouter", + + "status/fullscreen": "", + "status/": "", }, ja: { "toolbar/sidebar": "サイドバー", @@ -108,6 +116,7 @@ export class Strings { "toolbar/openbook/error": "ご利用のブラウザは必要な機能をサポートしていません。\nGoogle Chrome、Mozilla Firefox、その他のモダンなブラウザでご利用ください。", "toolbar/bookmark": "このページに栞を設定する", "toolbar/fullscreen": "フルスクリーン", + "toolbar/background": "背景を変更する", "sidebar/close": "???", "sidebar/contents": "目次", @@ -146,7 +155,10 @@ export class Strings { "sidebar/metadata/direction": "???", "notedlg/label": "???", - "notedlg/add": "追加" + "notedlg/add": "追加", + + "status/fullscreen": "", + "status/": "", }, ru: { "toolbar/sidebar": "Боковая панель", @@ -156,6 +168,7 @@ export class Strings { "toolbar/openbook/error": "Ваш браузер не поддерживает необходимые функции.\nПожалуйста, используйте современный браузер, такой как Google Chrome или Mozilla Firefox.", "toolbar/bookmark": "Добавить эту страницу в закладки", "toolbar/fullscreen": "Полноэкранный режим", + "toolbar/background": "изменить фон", "sidebar/close": "Закрыть боковую панель", "sidebar/contents": "Содержание", @@ -194,7 +207,62 @@ export class Strings { "sidebar/metadata/direction": "Направление", "notedlg/label": "Заметка", - "notedlg/add": "Добавить" + "notedlg/add": "Добавить", + + "status/fullscreen": "", + "status/": "", + }, + vi: { + "toolbar/sidebar": "Thanh bên", + "toolbar/prev": "Trang trước", + "toolbar/next": "Trang kế tiếp", + "toolbar/openbook": "Mở sách", + "toolbar/openbook/error": "Trình duyệt của bạn không hỗ trợ các tính năng cần thiết. Vui lòng sử dụng trình duyệt hiện đại như Google Chrome hoặc Mozilla Firefox.", + "toolbar/bookmark": "Thêm trang này vào dấu trang", + "toolbar/fullscreen": "Toàn màn hình", + "toolbar/background": "Đổi màu nền", + + "sidebar/close": "Đóng thanh bên", + "sidebar/contents": "Nội dung", + "sidebar/bookmarks": "Dấu trang", + "sidebar/bookmarks/add": "Thêm dấu trang", + "sidebar/bookmarks/remove": "Xóa dấu trang", + "sidebar/bookmarks/clear": "???", + "sidebar/annotations": "Chú thích", + "sidebar/annotations/add": "Thêm chú thích", + "sidebar/annotations/remove": "Xóa chú thích", + "sidebar/annotations/clear": "???", + "sidebar/annotations/anchor": "???", + "sidebar/annotations/cancel": "???", + "sidebar/search": "Tìm kiếm", + "sidebar/search/placeholder": "???", + "sidebar/settings": "Cài đặt", + "sidebar/settings/language": "Ngôn ngữ", + "sidebar/settings/fontsize": "Cỡ chữ (%)", + "sidebar/settings/flow": "???", + "sidebar/settings/pagination": ["???", "???"], + "sidebar/settings/spread": "???", + "sidebar/settings/spread/minwidth": "????", + "sidebar/metadata": "Metadata", + "sidebar/metadata/title": "Chủ đề", + "sidebar/metadata/creator": "Người sáng tạo", + "sidebar/metadata/description": "Mô tả", + "sidebar/metadata/pubdate": "Ngày tạo", + "sidebar/metadata/publisher": "Nhà xuất bản", + "sidebar/metadata/identifier": "Định dạng", + "sidebar/metadata/language": "Ngôn ngữ", + "sidebar/metadata/rights": "Quyền", + "sidebar/metadata/modified_date": "Ngày sửa đổi", + "sidebar/metadata/layout": "???", // rendition:layout + "sidebar/metadata/flow": "???", // rendition:flow + "sidebar/metadata/spread": "???", // rendition:spread + "sidebar/metadata/direction": "???", // page-progression-direction + + "notedlg/label": "???", + "notedlg/add": "???", + + "status/fullscreen": "Toàn màn hình", + "status/": "", } }; diff --git a/src/toolbar.js b/src/toolbar.js index d2590d7..9bfa7f2 100644 --- a/src/toolbar.js +++ b/src/toolbar.js @@ -1,4 +1,5 @@ -import { UIDiv, UIInput } from "./ui.js"; +import { UIButton, UIDiv, UIInput, UILabel, UILink, UISpan, UIText } from "./ui.js"; +import { SearchPanel } from "./sidebar/search.js"; export class Toolbar { @@ -15,8 +16,13 @@ export class Toolbar { "toolbar/openbook", "toolbar/openbook/error", "toolbar/bookmark", - "toolbar/fullscreen" + "toolbar/fullscreen", + "toolbar/background", + "toolbar/search", + "toolbar/close", ]; + + /*------------------------ Toolbar Menu 1 --------------------------*/ const menu1 = new UIDiv().setClass("menu-1"); const openerBox = new UIDiv().setId("btn-m").setClass("box"); const openerBtn = new UIInput("button"); @@ -58,7 +64,360 @@ export class Toolbar { menu1.add(nextBox); } + /* ------------------------ Button Logo ------------------------- */ + const logoBox = new UIDiv().setId("btn-logo").setClass("logo"); + const logoLink = new UILink().setId("logo-link").setHref("#").setTextContent("LOGO"); + + logoBox.add(logoLink); + menu1.add(logoBox); + + /* ------------------------ Button Index List (muc luc) -------------------------- */ + let tocBox, tocBtn; + tocBox = new UIDiv().setId("btn-t").setClass("box"); + tocBtn = new UIInput("button"); + + // load toc content title for toc list + tocBtn.dom.onclick = (e) => { + e.stopPropagation(); + reader.book.loaded.navigation.then((toc) => { + showToc(toc); + }) + } + + tocBox.add(tocBtn); + menu1.add(tocBox); + + // Function to show the toc list + function showToc(toc) { + let existingToc = document.getElementById("toolbar-toc-list"); + + if (existingToc) { + existingToc.remove(); + } else { + let tocList = document.createElement("ul"); + tocList.setAttribute("id", "toolbar-toc-list"); + + let tocTitle = document.createElement("h3"); + tocTitle.textContent = "Mục lục"; + + tocList.appendChild(tocTitle); + + toc.forEach((chapter) => { + let tocItem = document.createElement("li"); + let tocLink = document.createElement("a"); + + tocLink.href = "#"; + tocLink.textContent = chapter.label; + + tocLink.onclick = (e) => { + e.preventDefault(); + + document.querySelectorAll("#toolbar-toc-list li a").forEach((link) => { + link.classList.remove("active"); + }) + + tocLink.classList.add("active"); + + // show the chapter with the title chosed in toc list + reader.rendition.display(chapter.href); + }; + + tocItem.appendChild(tocLink); + tocList.appendChild(tocItem); + }); + + tocBox.dom.appendChild(tocList); + } + + let tocList = document.getElementById("toolbar-toc-list"); + tocList.classList.toggle("active"); + } + + + + /* ------------------------ Button My Bookmark (bookmark cua toi) --------------------------*/ + let bookmarksBox, bookmarksBtn; + bookmarksBox = new UIDiv().setId("btn-d").setClass("box"); + bookmarksBtn = new UIInput("button"); + + bookmarksBtn.dom.onclick = (e) => { + e.stopPropagation(); + showBookmarks(); + } + + bookmarksBox.add(bookmarksBtn); + menu1.add(bookmarksBox); + + function showBookmarks() { + let bookmarksList = document.getElementById("toolbar-bookmarks-list"); + + if (!bookmarksList) { + bookmarksList = document.createElement("ul"); + bookmarksList.setAttribute("id", "toolbar-bookmarks-list"); + bookmarkBox.dom.appendChild(bookmarksList); + } + + updateBookmarksList(); + bookmarksList.classList.toggle("active"); + } + + reader.on("bookmarked", (boolean, cfi) => { + updateBookmarksList(); + }) + + function updateBookmarksList() { + let bookmarksList = document.getElementById("toolbar-bookmarks-list"); + + if (!bookmarksList) return; + + bookmarksList.innerHTML = ""; + + let title = document.createElement("h3"); + title.textContent = "Bookmarks của tui"; + bookmarksList.appendChild(title); + + reader.settings.bookmarks.forEach((cfi, index) => { + let bookmarkItem = document.createElement("li"); + let bookmarkLink = document.createElement("a"); + let deleteBtn = document.createElement("span"); + + bookmarkLink.href = "#"; + bookmarkLink.textContent = `Bookmark ${index + 1}`; + + bookmarkLink.onclick = (e) => { + e.preventDefault(); + + document.querySelectorAll("#toolbar-bookmarks-list li a").forEach((link) => { + link.classList.remove("active"); + }); + + bookmarkLink.classList.add("active"); + + reader.rendition.display(cfi); + }; + + deleteBtn.innerHTML = ''; + deleteBtn.onclick = (e) => { + e.stopPropagation(); + reader.removeBookmarkFromToolbar(cfi); + }; + + bookmarkItem.appendChild(bookmarkLink); + bookmarkItem.appendChild(deleteBtn); + bookmarksList.appendChild(bookmarkItem); + }) + } + + // Hàm xóa bookmark từ toolbar + reader.removeBookmarkFromToolbar = function (cfi) { + + let bookmarksList = document.getElementById("toolbar-bookmarks-list"); + if (!bookmarksList) return; + + let bookmarkItems = bookmarksList.querySelectorAll("li"); + let targetItem = Array.from(bookmarkItems).find(item => { + return item.querySelector("a").textContent.includes(cfi); + }); + + if (targetItem) { + targetItem.remove(); + } + + const index = reader.settings.bookmarks.indexOf(cfi); + if (index !== -1) { + reader.settings.bookmarks.splice(index, 1); + } + + reader.emit("bookmarked", false, cfi); + reader.bookmarksPanel.removeBookmark(cfi); + }; + + + + /* ------------------------ Button Highlight And Note ---------------------------- */ + let annotationsBox, annotationsBtn; + annotationsBox = new UIDiv().setId("btn-a").setClass("box"); + annotationsBtn = new UIInput("button"); + + // show annotations list when click icon on toolbar + annotationsBtn.dom.onclick = (e) => { + e.stopPropagation(); + showAnnotations(); + } + + annotationsBox.add(annotationsBtn); + menu1.add(annotationsBox); + + // Function to show the annotations list + function showAnnotations() { + let existingList = document.getElementById("toolbar-annotations-list"); + + if (!existingList) { + let annotationsList = document.createElement("ul"); + annotationsList.setAttribute("id", "toolbar-annotations-list"); + + let title = document.createElement("h3"); + title.textContent = "Highlights & Ghi chú"; + + annotationsList.appendChild(title); + + reader.settings.annotations.forEach((note) => { + let noteItem = document.createElement("li"); + let noteLink = document.createElement("a"); + let deleteBtn = document.createElement("span"); + + noteLink.href = "#"; + noteLink.textContent = note.text; + + noteLink.onclick = (e) => { + e.preventDefault(); + + document.querySelectorAll("#toolbar-annotations-list li a").forEach((link) => { + link.classList.remove("active"); + }) + + noteLink.classList.add("active"); + + reader.rendition.display(note.cfi); + } + + deleteBtn.innerHTML = ''; + // emit event to delete annotation items + deleteBtn.onclick = (e) => { + e.stopPropagation(); + reader.removeNoteFromToolbar(note); + } + + noteItem.appendChild(noteLink); + noteItem.appendChild(deleteBtn); + annotationsList.appendChild(noteItem); + }) + + annotationsBox.dom.appendChild(annotationsList); + } + + let annotationsList = document.getElementById("toolbar-annotations-list"); + annotationsList.classList.toggle("active"); + } + + reader.removeNoteFromToolbar = function (note) { + let annotationsList = document.getElementById("toolbar-annotations-list"); + if (!annotationsList) return; + + let noteItems = annotationsList.querySelectorAll("li"); + let targetItem = Array.from(noteItems).find(item => { + item.querySelector('a').textContent === note.text; + }) + + if (targetItem) { + targetItem.remove(); + } + + const annotationsPanel = reader.annotationsPanel; + if (annotationsPanel) { + annotationsPanel.removeNote(note); + annotationsPanel.update(); + } + + const index = reader.settings.annotations.findIndex((n) => n.cfi === note.cfi); + if (index !== -1) { + reader.settings.annotations.splice(index, 1); + } + + reader.rendition.annotations.remove(note.cfi, "highlight"); + } + + + + + /* ----------------------------- Current Page -------------------------------- */ + const centerPageCount = new UIDiv().setClass("menu-center"); + + const centerLabel = new UILabel().setClass("toolbar-center-label"); + centerLabel.setTextContent("Determined"); + + const curOfTotal = new UIDiv().setClass("page-map"); + const curPageIndex = new UISpan().setClass("current-page-index").setTextContent("1"); + const separator = new UIText().setTextContent(" của "); + const totalPage = new UISpan().setClass("total-pages").setTextContent("200"); + + curOfTotal.add(curPageIndex); + curOfTotal.add(separator); + curOfTotal.add(totalPage); + + centerPageCount.add(centerLabel); + centerPageCount.add(curOfTotal); + + + + /*------------------------ Toolbar Menu 2 --------------------------*/ const menu2 = new UIDiv().setClass("menu-2"); + // Button change background + let backgroundBox, colorPicker; + if (settings.background) { + // Init elements: background box div, input color picker + backgroundBox = new UIDiv().setId("btn-bg").setClass("box"); + colorPicker = new UIInput("color").setClass("color-picker"); + colorPicker.dom.title = strings.get(keys[7]); + + // Handle event get color from color table of input color + colorPicker.dom.oninput = (e) => { + const selectedColor = e.target.value; + + // Emit 'colorchanged' event with selected color + reader.emit("colorchanged", selectedColor); + } + + backgroundBox.add(colorPicker); + menu2.add(backgroundBox); + } + + + // Button "A-", "A+" and input (hidden) for font-size + let fontLabel = new UILabel().setClass("font-size-px").setTextContent("Fontsize (px):") + let fontSizeBox = new UIDiv().setId("btn-fontsize").setClass("box"); + let decreaseFontBtn = new UIInput("button").setClass("btn-font-decrease"); + let increaseFontBtn = new UIInput("button").setClass("btn-font-increase"); + let fontSizeInput = new UIInput("text").setClass("input-font-size"); + + let fontSize = settings.fontSize || 16; + fontSizeInput.dom.value = fontSize; + + decreaseFontBtn.dom.textContent = "-"; + decreaseFontBtn.dom.onclick = () => { + fontSize = Math.max(8, fontSize - 1); + fontSizeInput.dom.value = fontSize; + + reader.emit("styleschanged", { fontSize: fontSize }); + }; + + increaseFontBtn.dom.textContent = "+"; + increaseFontBtn.dom.onclick = () => { + fontSize = Math.min(72, fontSize + 1); + fontSizeInput.dom.value = fontSize; + + reader.emit("styleschanged", { fontSize: fontSize }); + }; + + fontSizeInput.dom.onchange = () => { + let newSize = parseInt(fontSizeInput.dom.value, 10); + if (!isNaN(newSize) && newSize >= 8 && newSize <= 72) { + fontSize = newSize; + + reader.emit("styleschanged", { fontSize: fontSize }); + } else { + fontSizeInput.dom.value = fontSize; + } + }; + + fontSizeBox.add(fontLabel); + fontSizeBox.add(decreaseFontBtn); + fontSizeBox.add(fontSizeInput); + fontSizeBox.add(increaseFontBtn); + menu2.add(fontSizeBox); + + + // Button open file let openbookBtn; if (settings.openbook) { const onload = (e) => { @@ -102,6 +461,91 @@ export class Toolbar { menu2.add(openbookBox); } + + // Button search + let searchBox, searchBtn; + let searchInput, searchResults; + searchBox = new UIDiv().setId("btn-s").setClass("box"); + searchBtn = new UIInput("button"); + searchBtn.setTitle(strings.get(keys[8])); + + searchBtn.dom.onclick = (e) => { + e.stopPropagation(); + showSearchPopup(); + } + + searchBox.add(searchBtn); + menu2.add(searchBox); + + function showSearchPopup() { + let existingPopup = document.getElementById("toolbar-search-list"); + if (!existingPopup) { + let searchPopup = document.createElement("div"); + searchPopup.setAttribute("id", "toolbar-search-list"); + searchPopup.classList.add("search-popup"); + + let searchContainer = document.createElement("div"); + searchContainer.classList.add("search-container"); + + let searchIcon = document.createElement("span"); + searchIcon.classList.add("search-icon"); + searchIcon.innerHTML = ''; + + let searchInput = document.createElement("input"); + searchInput.setAttribute("type", "search"); + searchInput.setAttribute("placeholder", "Search"); + searchInput.setAttribute("id", "nav-q"); + searchInput.setAttribute("class", "toolbar-search-input"); + + searchContainer.appendChild(searchIcon); + searchContainer.appendChild(searchInput); + + let resultContainer = document.createElement("ul"); + resultContainer.setAttribute('id', 'toolbar-search-results'); + + let searchPanel = new SearchPanel(reader); + searchInput.oninput = async () => { + let query = searchInput.value.trim(); + if (query.length > 0) { + let results = await searchPanel.doSearch(query); + resultContainer.innerHTML = ""; + + if (results.length === 0) { + let noResultItem = document.createElement("li"); + noResultItem.innerText = "Không tìm thấy kết quả trùng khớp"; + noResultItem.style.color = "gray"; + noResultItem.style.padding = "8px"; + resultContainer.appendChild(noResultItem); + } + + results.forEach((data) => { + let item = document.createElement("li"); + let link = document.createElement("a"); + link.href = "#" + data.cfi; + link.textContent = data.excerpt; + link.onclick = (e) => { + e.preventDefault(); + searchPanel.reader.rendition.display(data.cfi); + } + item.appendChild(link); + resultContainer.appendChild(item); + }) + } else { + resultContainer.innerHTML = ""; + } + } + + searchPopup.appendChild(searchContainer); + searchPopup.appendChild(resultContainer); + searchBox.dom.appendChild(searchPopup); + } + + let searchPopup = document.getElementById("toolbar-search-list"); + searchPopup.classList.toggle("active"); + } + + + // Button Bookmark let bookmarkBox, bookmarkBtn; if (settings.bookmarks) { bookmarkBox = new UIDiv().setId("btn-b").setClass("box"); @@ -119,6 +563,7 @@ export class Toolbar { menu2.add(bookmarkBox); } + // Button Full Screen let fullscreenBtn; if (settings.fullscreen) { @@ -154,9 +599,21 @@ export class Toolbar { menu2.add(fullscreenBox); } - container.add([menu1, menu2]); + container.add([menu1, centerPageCount, menu2]); document.body.appendChild(container.dom); + // Button Close + let closeBox, closeBtn; + closeBox = new UIDiv().setId("btn-close").setClass("box"); + closeBtn = new UIInput("button").setClass("active"); + closeBtn.setTitle(strings.get(keys[9])); + + + + closeBox.add(closeBtn); + menu2.add(closeBox); + + //-- events --// reader.on("relocated", (location) => { @@ -203,6 +660,10 @@ export class Toolbar { if (settings.fullscreen) { fullscreenBtn.setTitle(strings.get(keys[6])); } + if (settings.background) { + backgroundBtn.setTitle(strings.get(keys[7])); + } + }); } diff --git a/src/ui.js b/src/ui.js index 5435462..d2c8957 100644 --- a/src/ui.js +++ b/src/ui.js @@ -9,10 +9,10 @@ const ERROR_MSG = "is not an instance of UIElement."; * @param {string} tag */ export class UIElement { - + constructor(tag) { - this.dom = document.createElement(tag); + this.dom = document.createElement(tag); } add() { @@ -170,6 +170,16 @@ export class UIDiv extends UIElement { super("div"); } + + setClass(className) { + this.dom.className = className; + return this; + } + + addClass(className) { + this.dom.classList.add(className); + return this; + } } /** @@ -761,4 +771,14 @@ export class UIBox extends UIElement { this.setClass("box"); this.add(items); } +} + +/** + * UIButton + * @param {UIButton} items + */ +export class UIButton extends UIElement { + constructor(items) { + super("button"); + } } \ No newline at end of file diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..88e1abb --- /dev/null +++ b/vercel.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "builds": [ + { + "src": "package.json", + "use": "@vercel/static-build" + } + ], + "routes": [ + { + "src": "/(.*)", + "dest": "/dist/index.html" + } + ], + "outputDirectory": "dist" +} \ No newline at end of file diff --git a/webpack.config.cjs b/webpack.config.cjs index 4c99363..098d4d7 100644 --- a/webpack.config.cjs +++ b/webpack.config.cjs @@ -1,5 +1,6 @@ const path = require("path") const CopyPlugin = require("copy-webpack-plugin") +const { webpack } = require("webpack") const config = { mode: "development", @@ -8,7 +9,10 @@ const config = { }, output: { path: path.resolve(__dirname, "dist"), - libraryTarget: "module" + filename: "js/[name].js", + sourceMapFilename: "js/[name].js.map", + publicPath: "/", + libraryTarget: "module", }, externals: { "epubjs": "epubjs" @@ -17,13 +21,19 @@ const config = { usedExports: false }, devServer: { - static: { - directory: path.join(__dirname, "dist") - }, - hot: false, + static: [ + { + directory: path.join(__dirname, "dist") + }, + { + directory: path.join(__dirname, "public") + } + ], + hot: true, liveReload: true, compress: true, - port: 8080 + port: 8088, + open: true }, experiments: { outputModule: true @@ -74,5 +84,9 @@ module.exports = (env, args) => { config.optimization.minimize = false } + if (env.WEBPACK_SERVE) { + config.devServer.hot = true; + } + return config; } \ No newline at end of file