view presen/fig/tgraph/index.html @ 77:2327c951dfb9

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 18 Feb 2019 19:46:14 +0900
parents
children
line wrap: on
line source

<!DOCTYPE html>
<html lang="en">
<head>
<!-- v1.5.1 -->
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="assets/idrviewer.css">
<script src="assets/idrviewer.js" type="text/javascript"></script>
<script src="assets/idrviewer.querystring-navigation.js"></script>
<script src="assets/idrviewer.fullscreen.js"></script>
<script src="assets/idrviewer.search.js"></script>
<!--*-->
<script type="text/javascript">
(function() {
    "use strict";
    var Button = {},
        pageLabels = [];

    /**
     * Shorthand helper function to getElementById
     * @param id
     * @returns {Element}
     */
    var d = function (id) {
        return document.getElementById(id);
    };

    var ClassHelper = (function() {
        return {
            addClass: function(ele, name) {
                var classes = ele.className.length !== 0 ? ele.className.split(" ") : [];
                var index = classes.indexOf(name);
                if (index === -1) {
                    classes.push(name);
                    ele.className = classes.join(" ");
                }
            },

            removeClass: function(ele, name) {
                var classes = ele.className.length !== 0 ? ele.className.split(" ") : [];
                var index = classes.indexOf(name);
                if (index !== -1) {
                    classes.splice(index, 1);
                }
                ele.className = classes.join(" ");
            },

            toggleClass: function(ele, name) {
                var classes = ele.className.length !== 0 ? ele.className.split(" ") : [];
                var index = classes.indexOf(name);
                var wasClassAdded;
                if (index === -1) {
                    classes.push(name);
                    wasClassAdded = true;
                } else {
                    classes.splice(index, 1);
                    wasClassAdded = false;
                }
                ele.className = classes.join(" ");
                return wasClassAdded;
            }
        };
    })();

    /**
     * Encapsulation of sidebar functionality
     */
    var Sidebar = (function () {

        var Sidebar = {},
            loadedThumbsArray = [],
            thumbnailPositions = [],
            lastScroll = 0,
            sidebar,
            thumbnailBar,
            imageType,
            scrollSidebar = true,
            thumbnailPanel,
            bookmarkPanel,
            searchPanel,
            isSearchLoaded,
            searchInput,
            thumbnailScrollPt = 0,
            bookmarkScrollPt = 0,
            searchScrollPt = 0,
            curPg,
            pgCount,
            MAX_THUMBNAIL_WIDTH = 160,
            MAX_THUMBNAIL_HEIGHT = 200;

        /**
         * Performs the setup for the sidebar
         * @param initialPage Current page
         * @param pageCount Page count
         * @param bounds Page bounds array
         * @param thumbnailType Image type used for thumbnails
         * @param bookmarks Object containing any bookmarks
         */
        Sidebar.setup = function (initialPage, pageCount, bounds, thumbnailType, bookmarks) {

            curPg = initialPage;
            pgCount = pageCount;
            Button.outlines = d('btnOutlines');
            Button.thumbnails = d('btnThumbnails');
            Button.search = d('btnSearch');
            d('btnSideToggle').onclick = function () {
                Sidebar.toggleSidebar();
            };
            Button.outlines.onclick = function () {
                Sidebar.switchToBookmarks();
            };
            Button.thumbnails.onclick = function () {
                Sidebar.switchToThumbnails();
            };
            Button.search.onclick = function () {
                Sidebar.switchToSearch();
            };

            thumbnailBar = d('leftContent');
            sidebar = d('left');
            thumbnailPanel = d('thumbnailPanel');
            bookmarkPanel = d('outlinePanel');
            searchPanel = d('searchPanel');
            searchInput = d('searchInput');
            imageType = thumbnailType;

            loadThumbnailFrames(bounds);
            // Initialise loaded array
            for (var i = 0; i < pgCount; i++) {
                loadedThumbsArray[i] = false;
            }

            Sidebar.switchToThumbnails();

            thumbnailBar.addEventListener("scroll", handleThumbnailBarScroll);

            if (bookmarks.length > 0) {
                Sidebar.setBookmarks(bookmarks);
            }
            bookmarkScrollPt = bookmarkPanel.scrollTop;
            searchScrollPt = searchPanel.scrollTop;
            thumbnailBar.scrollTop = thumbnailScrollPt;
        };

        Sidebar.openSidebar = function() {
            if (sidebar.className.indexOf("open") === -1) {
                Sidebar.toggleSidebar();
            }
        };

        /**
         * Toggle the sidebar open and closed
         */
        Sidebar.toggleSidebar = function () {
            if (ClassHelper.toggleClass(sidebar, "open")) {
                loadVisibleThumbnails();
            }
        };

        /**
         * Display the thumbnail panel in the sidebar
         */
        Sidebar.switchToThumbnails = function () {
            if (bookmarkPanel.className == "visible") {
                bookmarkScrollPt = thumbnailBar.scrollTop;
            }
            if (searchPanel.className == "visible") {
                searchScrollPt = thumbnailBar.scrollTop;
            }

            thumbnailPanel.className = "visible";
            bookmarkPanel.className = "hidden";
            searchPanel.className = "hidden";
            if (sidebar.className.indexOf("open") !== -1) {
                loadVisibleThumbnails();
                updateThumbnailPanelToCurrentPage();
            }
            Button.thumbnails.className = 'disabled btn';
            Button.outlines.className = 'btn';
            Button.search.className = 'btn';
        };

        /**
         * Display the bookmarks panel in the sidebar
         */
        Sidebar.switchToBookmarks = function () {
            if (searchPanel.className == "visible") {
                searchScrollPt = thumbnailBar.scrollTop;
            }
            if (thumbnailPanel.className == "visible") {
                thumbnailScrollPt = thumbnailBar.scrollTop;
            }

            thumbnailPanel.className = "hidden";
            bookmarkPanel.className = "visible";
            searchPanel.className = "hidden";
            Button.thumbnails.className = 'btn';
            Button.outlines.className = 'disabled btn';
            Button.search.className = 'btn';
            thumbnailBar.scrollTop = bookmarkScrollPt;
        };

        Sidebar.switchToSearch = function() {
            if (bookmarkPanel.className == "visible") {
                bookmarkScrollPt = thumbnailBar.scrollTop;
            }
            if (thumbnailPanel.className == "visible") {
                thumbnailScrollPt = thumbnailBar.scrollTop;
            }

            thumbnailPanel.className = "hidden";
            bookmarkPanel.className = "hidden";
            searchPanel.className = "visible";
            Button.thumbnails.className = 'btn';
            Button.outlines.className = 'btn';
            Button.search.className = 'disabled btn';

            var loadListener = function(loaded) {
                if (loaded) {
                    searchInput.value = "";
                    searchInput.disabled = "";
                    searchInput.focus();
                } else {
                    searchInput.value = "Search not available.";
                }
            };
            var progressListener = function(percentageLoaded) {
                searchInput.value = "Loading (" + percentageLoaded + "%)";
            };
            if (!isSearchLoaded) {
                IDRViewer.loadSearch(loadListener, progressListener);
            }
            searchInput.focus();
            thumbnailBar.scrollTop = searchScrollPt;
        };

        /**
         * Load the frames for all the thumbnails
         * @param bounds Page bound array
         */
        var loadThumbnailFrames = function (bounds) {
            var heights = [];
            // Calculate height for max width of 160px and max height of 200px
            for (var i = 0; i < bounds.length; i++) {
                var height = Math.floor(bounds[i][1] * (MAX_THUMBNAIL_WIDTH / bounds[i][0]));
                heights[i] = (bounds[i][0] > bounds[i][1] || height <= MAX_THUMBNAIL_HEIGHT) ? height : MAX_THUMBNAIL_HEIGHT;
            }

            function makeThumbnailClickHandler(pg) {
                return function() {
                    scrollSidebar = false;
                    IDRViewer.goToPage(pg);
                    return false;
                };
            }

            for (var page = 1; page <= bounds.length; page++) {
                var ele = document.createElement("a");
                ele.style.height = heights[page - 1] + "px";
                ele.className = "thumbnail";
                ele.href = "?page=" + page;
                ele.id = "thumb" + page;
                ele.onclick = makeThumbnailClickHandler(page);
                ele.setAttribute('title', 'Page ' + page);
                var margin = Math.floor((heights[page - 1] - 42) / 2);
                ele.innerHTML = '<div class="spinner" style="margin-top: ' + margin + 'px;"></div>';
                thumbnailPanel.appendChild(ele);
            }

            for (page = 1; page <= bounds.length; page++) {
                thumbnailPositions[page - 1] = thumbnailPanel.children[page - 1].offsetTop;
            }
        };

        var handleThumbnailBarScroll = function () {
            var scrollTop = thumbnailBar.scrollTop;
            lastScroll = scrollTop;
            showVisibleSpinners();
            setTimeout(function () {
                loadVisibleThumbnails(scrollTop);
            }, 500);
        };

        var showVisibleSpinners = function() {
            var startY = thumbnailBar.scrollTop;
            var endY = startY + thumbnailBar.clientHeight;
            for (var index = 0; index < pgCount; index++) {
                if (!loadedThumbsArray[index]) {
                    if (thumbnailPositions[index] + MAX_THUMBNAIL_WIDTH > startY && thumbnailPositions[index] < endY) {
                        ClassHelper.addClass(thumbnailPanel.children[index].firstChild, "spinning");
                    } else {
                        ClassHelper.removeClass(thumbnailPanel.children[index].firstChild, "spinning");
                    }
                }
            }
        };

        var loadVisibleThumbnails = function (scrollTop) {
            if (typeof scrollTop !== 'undefined' && scrollTop != lastScroll)
                return;

            // load thumbs in view
            for (var thumbIndex = 0; thumbIndex < pgCount; thumbIndex++) {
                if (!loadedThumbsArray[thumbIndex]) {
                    var curThumb = thumbnailPanel.children[thumbIndex];
                    // Bails out of the loop when the next thumbnail is below the viewable area
                    if (curThumb.offsetTop > thumbnailBar.scrollTop + thumbnailBar.clientHeight) {
                        break;
                    }
                    if (curThumb.offsetTop + curThumb.clientHeight > thumbnailBar.scrollTop) {
                        curThumb.innerHTML = '<img src="thumbnails/' + (thumbIndex + 1) + '.' + imageType + '" />';
                        loadedThumbsArray[thumbIndex] = true;
                    }
                }
            }
        };

        /**
         * Scrolls the thumbnail bar to a specific page and adds currentPageThumbnail class.
         * @param page Page to scroll to
         */
        Sidebar.handlePageChange = function (page) {
            curPg = page;
            if (thumbnailPanel.className === "visible") {
                updateThumbnailPanelToCurrentPage();
            }
            scrollSidebar = true;
        };

        var updateThumbnailPanelToCurrentPage = function() {
            var curThumb = thumbnailPanel.children[curPg - 1];
            if (curThumb.className !== "thumbnail currentPageThumbnail") {

                for (var i = 0; i < pgCount; i++) {
                    thumbnailPanel.children[i].className = "thumbnail";
                }

                curThumb.className = "thumbnail currentPageThumbnail";

                if (scrollSidebar) {
                    thumbnailBar.scrollTop = thumbnailBar.scrollTop + curThumb.getBoundingClientRect().top - d('leftContent').getBoundingClientRect().top;
                }
            }
        };

        Sidebar.setBookmarks = function (bookmarks) {
            ClassHelper.addClass(sidebar, 'hasBookmarks');
            addBookmark(bookmarkPanel, bookmarks);
        };

        var addBookmark = function (container, bookmarks) {
            var outer = document.createElement('ul');

            var makeBookmarkClickHandler = function(pg, zoom) {
                return function() {
                    IDRViewer.goToPage(parseInt(pg), zoom);
                };
            };
            for (var i = 0; i < bookmarks.length; i++) {
                var bookmark = bookmarks[i];
                var li = document.createElement('li');
                li.setAttribute('title', 'Page ' + bookmark.page);
                li.innerHTML = bookmark.title;
                li.onclick = makeBookmarkClickHandler(bookmark.page, bookmark.zoom);
                outer.appendChild(li);
                if (typeof(bookmark.children) != 'undefined') {
                    addBookmark(outer, bookmark.children);
                }
            }
            container.appendChild(outer);
        };

        return Sidebar;
    })();

    var populateGoBtn = function (initialPage, pgCount) {
        Button.go.className = "";
        Button.go.innerHTML = "";
        for (var i = 1; i <= pgCount; i++) {
            var opt = document.createElement('option');
            opt.value = i;
            opt.innerHTML = pageLabels.length ? pageLabels[i - 1] : String(i);
            Button.go.appendChild(opt);
        }
        Button.go.selectedIndex = initialPage - 1;
    };

    var handleGoBtn = function () {
        IDRViewer.goToPage(parseInt(Button.go.options[Button.go.selectedIndex].value));
        this.blur();
    };

    var updateSelectionButtons = function (mode) {
        switch (mode) {
            case IDRViewer.SELECT_PAN:
                Button.select.className = 'btn';
                Button.move.className = 'disabled btn';
                break;
            case IDRViewer.SELECT_SELECT:
                Button.select.className = 'disabled btn';
                Button.move.className = 'btn';
                break;
        }
    };

    var handlePageChange = function (data) {
        d('pgCount').innerHTML = getPageString(data.page, data.pagecount);
        Sidebar.handlePageChange(data.page);
        Button.go.selectedIndex = data.page - 1;

        Button.prev.className = data.isFirstPage ? 'disabled btn' : 'btn';
        Button.next.className = data.isLastPage ? 'disabled btn' : 'btn';
    };

    var handleZoomUpdate = function (data) {
        Button.zoom.value = data.zoomType;
        Button.zoom.options[0].innerHTML = Math.floor(data.zoomValue * 100) + "%";

        Button.zoomOut.className = data.isMinZoom ? 'disabled btn' : 'btn';
        Button.zoomIn.className = data.isMaxZoom ? 'disabled btn' : 'btn';
    };

    var handleSelectionChange = function (data) {
        updateSelectionButtons(data.type);
    };

    var handleZoomBtn = function () {
        var zoomType = Button.zoom.value;
        if (zoomType != IDRViewer.ZOOM_SPECIFIC) {
            IDRViewer.setZoom(zoomType);
        }
        this.blur();
    };

    var handleViewBtn = function () {
        IDRViewer.setLayout(Button.View.value);
        this.blur();
    };

    var setupLayoutSwitching = function (pgCount, layout, availableLayouts, isMobile) {

        if (!isMobile) {

            if (availableLayouts.length > 1 && pgCount > 1) {
                Button.View = document.createElement('select');
                Button.View.id = 'viewBtn';

                var temp = document.createElement('option');
                temp.innerHTML = "Presentation";
                temp.value = IDRViewer.LAYOUT_PRESENTATION;
                Button.View.appendChild(temp);

                if (availableLayouts.indexOf(IDRViewer.LAYOUT_MAGAZINE) != -1) {
                    temp = document.createElement('option');
                    temp.innerHTML = "Magazine";
                    temp.value = IDRViewer.LAYOUT_MAGAZINE;
                    Button.View.appendChild(temp);
                }
                if (availableLayouts.indexOf(IDRViewer.LAYOUT_CONTINUOUS) != -1) {
                    temp = document.createElement('option');
                    temp.innerHTML = "Continuous";
                    temp.value = IDRViewer.LAYOUT_CONTINUOUS;
                    Button.View.appendChild(temp);
                }
                Button.View.onchange = handleViewBtn;
                d('controls-center').appendChild(Button.View);
                Button.View.value = layout;
            }

        } else {
            Button.zoom.parentNode.removeChild(Button.zoom);
            Button.move.parentNode.removeChild(Button.move);
            Button.select.parentNode.removeChild(Button.select);
            Button.zoomIn.parentNode.removeChild(Button.zoomIn);
            Button.zoomOut.parentNode.removeChild(Button.zoomOut);
        }
    };

    var handleFullscreenChange = function (data) {
        if (data.isFullscreen) {
            Button.fullscreen.className = "btn open";
        } else {
            Button.fullscreen.className = "btn closed";
        }
    };

    function getPageString(page, pageCount) {
        var result = "/ " + pageCount;
        if (pageLabels.length) {
            result =  "(" + page + " / " + pageCount + ")";
        }
        return result;
    }

    var doSearch = function() {
        var resultDiv = document.getElementById('searchResults');
        resultDiv.innerHTML = "";

        var searchTerm = d('searchInput').value;
        var matchCase = d('cbMatchCase').checked;
        var limitOnePerPage = d('cbLimitResults').checked;

        var results = IDRViewer.search(searchTerm, matchCase, limitOnePerPage);

        d('searchResultsCount').innerHTML = String(results.length) + " results";

        var docFrag = document.createDocumentFragment();
        for (var i = 0; i < results.length && i < 500; i++) {
            var pg = results[i].page;

            var link = document.createElement("a");
            link.href = "?page=" + pg;
            link.innerHTML = results[i].snippet;
            link.className = "result";
            (function(page) {
                link.onclick = function() {
                    IDRViewer.goToPage(page);
                    return false;
                };
            })(pg);

            docFrag.appendChild(link);

        }
        if (results.length >= 500) {
            var element = document.createElement("span");
            element.innerHTML = "Limited to first 500 results.";
            element.className = "result";
            docFrag.appendChild(element);
        }
        resultDiv.appendChild(docFrag);
    };

    /**
     * Main setup function that runs on load
     */
    IDRViewer.on('ready', function (data) {

        // Grab buttons
        Button.go = d('goBtn');
        Button.zoom = d('zoomBtn');
        Button.fullscreen = d('btnFullScreen');
        Button.prev = d('btnPrev');
        Button.next = d('btnNext');
        Button.move = d('btnMove');
        Button.select = d('btnSelect');
        Button.zoomIn = d('btnZoomIn');
        Button.zoomOut = d('btnZoomOut');

        Button.prev.className = data.isFirstPage ? 'disabled btn' : 'btn';
        Button.next.className = data.isLastPage ? 'disabled btn' : 'btn';

        // Set button actions
        Button.go.onchange = handleGoBtn;
        Button.zoom.onchange = handleZoomBtn;
        Button.prev.onclick = function (e) { IDRViewer.prev(); e.preventDefault(); };
        Button.next.onclick = function (e) { IDRViewer.next(); e.preventDefault(); };
        Button.move.onclick = function (e) { IDRViewer.setSelectMode(IDRViewer.SELECT_PAN); e.preventDefault(); };
        Button.select.onclick = function (e) { IDRViewer.setSelectMode(IDRViewer.SELECT_SELECT); e.preventDefault(); };
        Button.zoomIn.onclick = function (e) { IDRViewer.zoomIn(); e.preventDefault(); };
        Button.zoomOut.onclick = function (e) { IDRViewer.zoomOut(); e.preventDefault(); };

        document.onkeydown = function(e) {
            switch (e.keyCode) {
                case 33: // Page Up
                case 37: // Left Arrow
                    IDRViewer.prev();
                    e.preventDefault();
                    break;
                case 34: // Page Down
                case 39: // Right Arrow
                    IDRViewer.next();
                    e.preventDefault();
                    break;
                case 36: // Home
                    IDRViewer.goToPage(1);
                    e.preventDefault();
                    break;
                case 35: // End
                    IDRViewer.goToPage(data.pagecount);
                    e.preventDefault();
                    break;
            }
        };

        // Misc setup
        document.title = data.title ? data.title : data.fileName;
        updateSelectionButtons(data.selectMode);
        pageLabels = data.pageLabels;

        populateGoBtn(data.page, data.pagecount);

        Sidebar.setup(data.page, data.pagecount, data.bounds, data.thumbnailType, data.bookmarks);
        d('pgCount').innerHTML = getPageString(data.page, data.pagecount);

        if (IDRViewer.isFullscreenEnabled()) {
            Button.fullscreen.onclick = function () {
                IDRViewer.toggleFullScreen();
            };
            IDRViewer.on('fullscreenchange', handleFullscreenChange);
        } else {
            Button.fullscreen.parentNode.removeChild(Button.fullscreen);
        }

        setupLayoutSwitching(data.pagecount, data.layout, data.availableLayouts, data.isMobile);
        Button.zoom.value = IDRViewer.ZOOM_AUTO;

        // Add event listeners
        IDRViewer.on('selectchange', handleSelectionChange);
        IDRViewer.on('pagechange', handlePageChange);
        IDRViewer.on('zoomchange', handleZoomUpdate);

        var themeToggle = false;
        d('btnThemeToggle').addEventListener('click', function() {
            ClassHelper.removeClass(document.body, "light-theme");
            ClassHelper.removeClass(document.body, "dark-theme");
            ClassHelper.addClass(document.body, themeToggle ? "light-theme" : "dark-theme");
            themeToggle = !themeToggle;
        });

        var searchInput = d('searchInput');
        searchInput.value = "Loading";
        searchInput.disabled = "disabled";
        searchInput.oninput = doSearch;
        d('cbMatchCase').onclick = doSearch;
        d('cbLimitResults').onclick = doSearch;

        document.addEventListener('keydown', function(event) {
            if (event.keyCode == 70 && (event.ctrlKey || event.metaKey)) {
                Sidebar.openSidebar();
                Sidebar.switchToSearch();
                event.preventDefault();
            }
        });

        (function reticulateSplines() {
            var el = document.createElement("div");
            el.innerHTML = atob("PGRpdiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7cmlnaHQ6MzBweDtib3R0b206MTVweDtib3JkZXItcmFkaXVz" +
              "OjVweDtib3gtc2hhZG93OiAxcHggMXB4IDRweCByZ2JhKDEyMCwxMjAsMTIwLDAuNSk7bGluZS1oZWlnaHQ6MDtvdmVyZmxvdzpoaW" +
              "RkZW47Ij48YSBocmVmPSJodHRwczovL3d3dy5pZHJzb2x1dGlvbnMuY29tL2J1aWxkdnUvIiByZWw9Im5vZm9sbG93IiB0YXJnZXQ9" +
              "Il9ibGFuayI+PGltZyBhbHQ9IkNyZWF0ZWQgd2l0aCBCdWlsZFZ1IiBzdHlsZT0iYm9yZGVyOjA7IiBzcmM9ImRhdGE6aW1hZ2UvcG" +
              "5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSllBQUFBdENBTUFBQUI3MG1KbUFBQUNQVkJNVkVYLy8vLysvdjBkSFJ2" +
              "NysvdjgvUHlJaUlmYjI5di9iMG41d3k3MzkvZjR3aXY0d1NscWFtcng4ZkcwdExQNHZ5WGw1ZVhnNE9EQ3dzSjRlSGR1Ym0zVDA5UD" +
              "R3Q2YzdmlQZTN0MnhzYkZnWUYvNHdpMzN2Qi9yNit1aG9hQ0VoSU9CZ1lCeGNYQlpXVmZvNk9oUlVWRkRRMElwS1NqajQrTm9hR2Ri" +
              "VzFvbEpTUDN1Qlh6OC9QS3lzcGRYVjFKU1VjOFBEdjJ0USs2dXJxNHVMZGtaR1JVVkZQL2NFcjJ1aG42K3ZxcXFxcW1wcVpMUzBwQl" +
              "FUODRPRGI1K2ZuMTlmWFgxOWZIeDhlK3ZyMmVucDZhbXBxWGw1ZU9qbzU4Zkh0MWRYVnpjM05XVmxaSFIwWGxueDM0dXh6Ky9mcnQ3" +
              "ZTMrK2V2aTR1TFkyTmpRME5ERnhjV3VycTJVbEpSUFQwNGdJQi9uNStmT3pzN0J3Y0g4NTYraW9xS0tpb241MG12K256ejltVHMwTk" +
              "RMNHdqSDR2aUhub3lIbm9CLzJ1aHZqblJqZ21CUCsvdnorOE16TXpNejk3Y1gvd0svODVxaWpvNk9Sa1pIL2JVcitxajMrcFQzOGp6" +
              "VXRMU3p1cWgvMXNnais5K1RhMnRyLzI5TC8xc3ovekwvNzNJYUdob1g2Mm9INTBGMzV6RTcvYzA3K2wwSDV5RUQ5a1VEK2RrRC9zRH" +
              "ozeER2OGtqbi93RGoxdVNULysvcisrdkgvOU9ycTZ1ci83T2YvNXQvKzg5Zjg2cjM4NDUveDBwai9wby80eTRML2tYVDUwV1AvZzJI" +
              "NXlVVC9uMFQrYjBQL3REdit0emZ5cERMOGhUTDRzaTdycENJYkd4dnlyeGIvOXZQKzZ0ajk4dFAvMWNyNDU4bisyOFgrM2NQOTRxMy" +
              "91cWYvdUtUKzE1di9ycGo3NEpYL25JTDlwNEQ1MVh6NjFXL3N3R3Y3cm1UK3RtUCtrMkg5cDFQbXFUdnpxQzZaVVdMMEFBQUdYVWxF" +
              "UVZSWXcrMlloMTlTVVJUSHo3czg1WUdBVEJOSUJRRVZBeVFRVXlRMTl5cHpsWmxsYXBxMmQ3YjMzbnZ2dmZjZWYxdm52aWRGRmlPcl" +
              "QzMCsrZnZvdS9kdzEvZWRjKzY5ZklCUmplcS9GQU0vcS9nNEVNRWYxbno0SjdFNnB3SXdJOGRpWWd3SU04eUtOdmJDemdYWTRSZThs" +
              "YW53ZXpKeENvYmgvN0Vtck12Q1YzdFdLaTJEVkFVZW9DcjNSM0Q2Sm83cndMNGp4bHBxelRMWFZuNDNmK1BDVU11d05OUzdGWDVITT" +
              "lZTU15RzhPamlPMnpSU2I3R2djSy9EMHNIS1U5U1pvUFNrQUJRN25RQ1Fwbld3WVBGWXFEdWJVM0piRUVPT2RRbEFBeXVCU3ExU1ZH" +
              "VExkRnJDK3VNNDE4TnhXNmVHdGs5aFl2ZVd6Y2w3UU9Lck5hUjZDbVcyaGFETjlhV0Q0cWJiS3ZlaVBRbVdXYXRzMHhGWGJpc0Nsd2" +
              "JhZlpiY1NXM2Q2ZTNLREUzV3hKSndYRk8zY2FnTDN5WVlFeXRXUzdxRUwyZGs2MENIaTgvV1VxdFd6ZFlXbzIyQlpUVmVxd2owTGtB" +
              "djVzaWJNdXdnbTlXY0pkRmlpQXNNREdncmdRMnpTMTV6bk5GbzdGbnlsZWdNWll3TlM1OHJkQ3kxQTB6TE1NWFovVkJRWXk1c2pMZG" +
              "lTbWVZTnJ2OHVXcUFzaG9BeUhlcHFzczFTaXRVVk1UTDBIdWFWQUN6Tit4Q0p4RkxhcFJ5VzRKNzkxVC8va1ZZeG9SVkVwRHo1YlE0" +
              "VEtmcWZDWDZ5enlqTkFkbXpRYUlNNlBOMU1WanJZTE9iWkxGWmNhNVVrSG1VVlBNNlpodk5tWFlkUmIxY0ZLcE5FRnEzTHFXdCs4UE" +
              "RGemYvNGh5UmNkaXdHeFhNVTFPTUhnQnZMWWpUQU5NTDhOc0FuTVplakJnZ1JUUVZrTjdZUXVncW02cXdMNWFCTlltdnd4RWpweEdp" +
              "QThBS214eUdSRXJJVUc2Y3hHYWh6NE9ES3paZitVcFFFeFlZSExKWEV1aDJrSTNmcnFoSE5RK1U1eVptZW5US3FFODNWQUJTb05Nby" +
              "tWZDZ0K01ma3VGaGtwSGsxV1duRm5wQU9leUNDZndPYzZJVkVsSkNVbFNUTEEzOWYwRGZWY3U3emt6SlRvV3o2WFVLVEdmaFdvSnJt" +
              "OVJnVHdmVkNWRnVCR296ZW9hdnZTbDQxZ0o5dEZKV0d3dnlvOXdKejRYc0JJVEU1T1NOcDJxcjYvdjc3OStlYytLZDRlQm50c1JzTD" +
              "dmdVZHMk14T3RRMmpiQXNTaVZHTlFpUWQ2Ni92cSt6L3RXYkZ5em9jN2YrK3FSazNaeXcxaHpSMDdkdTZCTlgxOTlUZFdJRmJYam9l" +
              "d2VNTmZ3NEpPQVl0U1RaNDNlY0thdnQ3ZWxTdm56T2xhdGVybDh1M3JnWW1LeGJBUjRqR3lucWlUUVN5a21qQmgzTGhidmIxWEw4N3" +
              "AycmZxMmlXeE9HL0RuL0FXRTBPQzNlV01OT1hIVUdjaDFmanh0MjVjdmJpamE5KzFTM2xpc1hqN3ZVaFg5YlJBbmRzZE1IalF5S3kx" +
              "NmVnOVpMQ3BBU1JWYmdVdTJWN25VdzVsZXBtdExoREkwVFJqblFGOWhjQlRVSTZQNU0yODRkQU9QN21NMGlFc1NvVWFYTk8xWTllcT" +
              "NjdkZxRHp4UnB6cHgxajVvQ1ZrOVdwQ3lGTDhtQkRrQVZVR2FVV3NRbEtPbzBvSlNlWUhzMUJGU0hZYjlweE5aMnZLS1FLVUtGZVB6" +
              "Mlk3ZnpNMnVPRmJiYUZZWXhCTGNOYmc0T0RldDd2MkJhbkVRYTd2c0xEUUVKZEUzbVFsMC9HbE04Z2tpaldSNkJFcm5hVGlJRFhKVm" +
              "cxaHBSR1hNcjdVVEVnWm9HUUtRT25TK1djV2p5WFBHWWExaE9POUZZemhnVmNuNE1FdXBCS3dVSXVSS3h5V2pGNkpwQzRHTEJva0hE" +
              "RHhDSTJlZHVncXpRK1BkWHluVVFnaUpueFA1eUo2dmg5K0w4N0x5K094cUI0alZ4Z3NlNHBGN1c2YkZRT1dqRTVpSWNSSkU5R2dRc3" +
              "VIRVE2UHhXemxwSWcxZC9MZXpvN2duWE5zdzhiRlQ1NmRQdjNpN05uejU3ZFRmNFhCNHFXRjJMQ3dZVFh4MHJJR1g2UWxGeUlFY1Fw" +
              "c3dTZ21KblIyclAzQmpqMTQrK2pSWSt2WEh3eUg1YTZjcmMwbWFSUkw4RU1Vckd5aXBxWGV6RUoxUVNTcytYQ0M2em5YY1NqeU1SSU" +
              "9pNzZ4aDVCbWlxV0dJbWpzSnQ1UXJHUVFNUXlQaGFzejRDVnQ4ZnhRWDNLeElWUEFzdlB6eVF1SG4yMVRsNnlGYUlxVThpMkV6SVFV" +
              "RzZtbXlVemFra094TEVKUHhESmo2ZXdtTXNFMnRlcXJnRmRqSVQrZHNpN01tVHNDckJveU1jMms2U1lCQjBBbDVsaVpLWVBZYWF4OH" +
              "BBem5uVWxJYmE3Qkpac0JZQ0xkTlZvN0lXNTZ2dUpmaVYzVENvS3lwZ0hLcElIaFhQT1pFV0pWRTE3dWRseW9PSXV2MXpWU3JGcVN5" +
              "bU1KV2dmb0xhbzJXVXJRQzRWV09RaEt0bFo1RldhREE2SXJ4bStudWxhRlFxOVlLQmhRYWpKWDZWbHFzSk5hVlZpa0tIaDVjTVVTUF" +
              "ZaS0crQ0xkTTRnSUJUN1RTWjAzYTlqeFJKK0p2UkdaaUwvTUlINmpWakFzRlJNMEJMbGk5alFyekRNMTNhK2huUS9KR1ZGb21HTS8r" +
              "WVBTU1BRdXJSL0VrdFpBQ3lNYWxTaitqMzZESlBYRlVmWVU0NDFBQUFBQUVsRlRrU3VRbUNDIiAvPjwvYT48L2Rpdj4=");
            document.body[atob("YXBwZW5kQ2hpbGQ=")](el.firstChild);
        })();
    });
})();
</script>
<style type="text/css">
    #left {
        transition-timing-function: ease;
        transition-duration: 200ms;
        top: 45px;
        bottom: 0;
        position: absolute;
        overflow: hidden;
        z-index: 999;
        left: -350px;
        width: 350px;
    }
    .light-theme #left {
        border-right: 1px solid #7b8793;
    }
    .dark-theme #left {
        border-right: 1px solid #000;
    }
    #left.open {
        left: 0;
    }
    #left-controls {
        height: 44px;
        display: block;
    }
    #leftContent {
        top: 45px;
        bottom: 0;
        left: 0;
        right: 0;
        position: absolute;
        overflow-y: scroll;
        background-color: #eee;
        -webkit-overflow-scrolling: touch;
    }
    #btnOutlines {
        display: none;
    }
    #left.hasBookmarks #btnOutlines {
        display: inline;
    }
    #outlinePanel {
        display: none;
    }

    #pgCount {
        font-family: Arial,serif;
        vertical-align: middle;
        font-size: 15px;
    }
    #btnSelect, #btnZoomOut, #viewBtn {
        margin-left: 20px;
    }


    #goBtn, #zoomBtn, #viewBtn {
        height: 25px;
    }
    #goBtn {
        width: 55px;
    }
    #viewBtn {
        width: 105px;
    }
    #zoomBtn {
        width: 95px;
    }
    .thumbnail {
        cursor: pointer;
        display: block;
        padding: 8px 0;
        margin: 0 auto;
        text-align: center;
    }
    .thumbnail img{
        max-width: 160px;
        border-radius: 5px;
        border: 1px solid #bbb;
    }
    .currentPageThumbnail, .thumbnail:hover {
        background-color: #ddd;
    }
    .currentPageThumbnail img, .thumbnail:hover img {
        border: 1px solid #999;
    }

    #thumbnailPanel.visible, #outlinePanel.visible, #searchPanel.visible {
        display: inline;
    }
    #thumbnailPanel.hidden, #outlinePanel.hidden, #searchPanel.hidden {
        display: none;
    }
    #outlinePanel ul {
        list-style-type: none;
        padding: 0 5px;
    }
    #outlinePanel ul ul {
        padding-left: 15px;
        padding-right: 0;
    }
    #outlinePanel li {
        color: #333;
        padding: 2px;
        font-family: Arial,serif;
        font-size: 15px;
    }
    #outlinePanel li:hover {
        background-color: #ddd;
        cursor: pointer;
    }
    #searchPanel {
        font-family: Arial, sans-serif;
        font-size: 14px;
    }
    #searchPanel * {
        color: #333;
        margin: 5px;
    }
    #searchPanel #searchInput {
        color: black;
        border: 1px solid #666;
        width: 288px;
        display: block;
        padding: 5px;
        margin: 20px auto 10px;
    }
    #searchPanel .searchOption {
        margin: 0 20px;
        display: block;
    }
    #searchPanel hr {
        margin-top: 18px;
    }
    #searchPanel #searchResultsCount {
        text-align: center;
        display: block;
    }
    #searchPanel .result {
        text-decoration: none;
        display: block;
        word-wrap: break-word;
    }
    #searchPanel .result:hover {
        background-color: #ddd;
    }

    body {
        margin: 0;
        padding: 0;
    }

    .btn {
        border: 0 none;
        height: 30px;
        padding: 0;
        width: 30px;
        background-color: transparent;
        display: inline-block;
        margin: 7px 5px 0;
        vertical-align: top;
        cursor: pointer;
    }

    .page {
        box-shadow: 1px 1px 4px rgba(120, 120, 120, 0.5);
    }

    #controls {
        height: 44px;
        position: fixed;
        text-align: center;
        top: 0;
        left: 0;
        right: 0;
        transition: 0.3s ease 0s;
    }
    
    #controls select {
        margin-top: 10px;
    }
    
    #controls-left {
        display: inline-block;
        left: 0;
        position: absolute;
    }
    #controls-center {
        display: inline-block;
    }
    #controls-right {
        display: inline-block;
        right: 0;
        position: absolute;
    }

    .light-theme #idrviewer {
        background: #fafafa none repeat scroll 0 0;
    }
    .light-theme #controls,
    .light-theme #left-controls {
        background: #9eacba none repeat scroll 0 0;
        border-bottom: 1px solid #7b8793;
    }

    .light-theme #pgCount,
    .light-theme .btn {
        color: white;
        text-shadow: 0 0 1px #595959;
    }
    .light-theme .btn:hover {
        opacity: 0.6;
    }
    .light-theme .btn.disabled {
        opacity: 0.4;
    }

    .light-theme #goBtn,
    .light-theme #zoomBtn,
    .light-theme #viewBtn {
        background-color: #9aa8b6;
        color: white;
        border: 1px solid #7b8793;
    }

    .dark-theme #idrviewer {
        background: #666 none repeat scroll 0 0;
    }
    .dark-theme #controls,
    .dark-theme #left-controls {
        background: #444 none repeat scroll 0 0;
        border-bottom: 1px solid #000;
    }
    .dark-theme #pgCount {
        color: white;
        opacity: 0.8;
    }
    .dark-theme .btn {
        opacity: 0.7;
        color: white;
    }
    .dark-theme .btn:hover {
        opacity: 0.95;
    }
    .dark-theme .btn.disabled {
        opacity: 0.2;
    }

    .dark-theme #goBtn,
    .dark-theme #zoomBtn,
    .dark-theme #viewBtn {
        background-color: #656565;
        color: white;
        border: 1px solid #000;
    }

    #idrviewer {
        top: 45px;
        bottom: 0;
        left: 0;
        right: 0;
        position: absolute;
    }

    .spinner {
        border: 6px solid #bbb;
        border-top: 6px solid #3c9fe1;
        border-radius: 50%;
        width: 30px;
        height: 30px;
        margin: 0 auto;
    }

    .spinning {
        animation: spin 1s linear infinite;
    }

    @keyframes spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }

</style>
</head>
<body class="light-theme">
    <div id="left">
        <div id="left-controls">
            <button id="btnThumbnails" title="Thumbnails" class="btn"><i class="fa fa-picture-o fa-lg" aria-hidden="true"></i></button>
            <button id="btnOutlines" title="Bookmarks" class="btn"><i class="fa fa-list-ul fa-lg" aria-hidden="true"></i></button>
            <button id="btnSearch" title="Search" class="btn"><i class="fa fa-search fa-lg" aria-hidden="true"></i></button>
        </div>
        <div id="leftContent">
            <div id="thumbnailPanel"></div>
            <div id="outlinePanel"></div>
            <div id="searchPanel">
                <input id="searchInput" title="Search" type="text">
                <label class="searchOption"><input type="checkbox" id="cbMatchCase"> Match case</label>
                <label class="searchOption"><input type="checkbox" id="cbLimitResults"> Limit results 1 per page</label>
                <hr>
                <span id="searchResultsCount"></span>
                <div id="searchResults"></div>
            </div>
        </div>
    </div>

    <div id="main">
        <div id="controls">
            <div id="controls-left">
                <button id="btnSideToggle" title="Sidebar" class="btn"><i class="fa fa-th fa-lg" aria-hidden="true"></i></button>
                <button id="btnThemeToggle" title="Theme Toggle" class="btn"><i class="fa fa-lightbulb-o fa-lg" aria-hidden="true"></i></button>
            </div>

            <div id="controls-center">
                <button id="btnPrev" title="Previous Page" class="btn"><i class="fa fa-caret-left fa-2x" aria-hidden="true"></i></button>
                <select id="goBtn">

                </select>
                <span id="pgCount"></span>
                <button id="btnNext" title="Next Page" class="btn"><i class="fa fa-caret-right fa-2x" aria-hidden="true"></i></button>

                <button id="btnSelect" title="Select" class="btn"><i class="fa fa-i-cursor fa-lg" aria-hidden="true"></i></button>
                <button id="btnMove" title="Pan" class="btn"><i class="fa fa-arrows fa-lg" aria-hidden="true"></i></button>

                <button id="btnZoomOut" title="Zoom Out" class="btn"><i class="fa fa-minus fa-lg" aria-hidden="true"></i></button>
                <select id="zoomBtn">
                    <option value="specific">100%</option>
                    <option value="actualsize">Actual Size</option>
                    <option value="fitwidth">Fit Width</option>
                    <option value="fitheight">Fit Height</option>
                    <option value="fitpage">Fit Page</option>
                    <option value="auto">Automatic</option>

                </select>
                <button id="btnZoomIn" title="Zoom In" class="btn"><i class="fa fa-plus fa-lg" aria-hidden="true"></i></button>
            </div>
            <div id="controls-right">
                <button id="btnFullScreen" title="Fullscreen" class="btn"><i class="fa fa-arrows-alt fa-lg" aria-hidden="true"></i></button>
            </div>
        </div>

        <div id="idrviewer">

        </div>
    </div>
    <script src="config.js" type="text/javascript"></script>
    <script type="text/javascript">IDRViewer.setup();</script>
</body>
</html>