Linux cesa-www-main 6.1.0-49-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64
Apache/2.4.68 (Debian)
Server IP : 10.218.0.2 & Your IP : 216.73.216.28
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
www /
cesa.co.za /
wp-content /
plugins /
dflip /
Delete
Unzip
Name
Size
Permission
Date
Action
assets
[ DIR ]
drwxr-sr-x
2022-11-22 13:38
freemius
[ DIR ]
drwxr-sr-x
2022-11-22 13:38
inc
[ DIR ]
drwxr-sr-x
2022-11-22 13:38
dflip-core.php
36.13
KB
-rw-r--r--
2025-01-30 10:05
dflip.js
304.83
KB
-rw-r--r--
2025-01-30 10:05
dflip.php
2.17
KB
-rw-r--r--
2025-01-30 10:05
index.php
99
B
-rw-r--r--
2025-01-30 10:05
readme.txt
399
B
-rw-r--r--
2025-01-30 10:05
Save
Rename
/** * @preserve * Plugin Name: dflip * Description: dflip - 3D & 2D FlipBook * * Author: Deepak Ghimire * Author URI: http://dearhive.com */ 'use strict'; var DFLIP = DFLIP || {}; // old fallback // use DFLIP instead of PRESENTATION since v 1.1 var PRESENTATION = DFLIP; (function dFlip(DFLIP, $) { DFLIP.version = "1.7.19"; DFLIP.PAGE_MODE = {SINGLE: 1, DOUBLE: 2, AUTO: null}; DFLIP.SINGLE_PAGE_MODE = {ZOOM: 1, BOOKLET: 2, AUTO: null}; DFLIP.CONTROLSPOSITION = {HIDDEN: 'hide', TOP: 'top', BOTTOM: 'bottom'}; DFLIP.DIRECTION = {LTR: 1, RTL: 2}; DFLIP.LINK_TARGET = {NONE: 0, SELF: 1, BLANK: 2, PARENT: 3, TOP: 4}; DFLIP.CORNERS = {TL: "tl", TR: "tr", BL: "bl", BR: "br", L: "l", R: "r", NONE: null}; DFLIP.SOURCE_TYPE = {IMAGE: "image", PDF: "pdf", HTML: "html"}; DFLIP.DISPLAY_TYPE = {WEBGL: "3D", HTML: "2D"}; DFLIP.PAGE_SIZE = {AUTO: 0, SINGLE: 1, DOUBLEINTERNAL: 2}; //defaults settings var defaults = DFLIP.defaults = { //sets if to use 3d or not (true|false) webgl: true, //if you want to turn of shadow in 3d set it to false webglShadow: true, // if enable sound at start (true|false) soundEnable: true, search: false, // height of the container // value(eg: 320) or percentage (eg: '50%') // calculation limit: minimum 320, max window height height: 'auto', // set to true to show outline on open (true|false) autoEnableOutline: false, // set to true to show thumbnail on open (true|false) autoEnableThumbnail: false, // set to true if PDF inbuilt outline is to be removed (true|false) overwritePDFOutline: false, // enableDownload of PDF files (true|false) enableDownload: true, // duration of page turn in milliseconds duration: 800, //direction of flipbook //DFLIP.DIRECTION.LTR or 1 for left to right(default), //DFLIP.DIRECTION.RTL or 2 for right to left, direction: DFLIP.DIRECTION.LTR, //set as //DFLIP.PAGE_MODE.AUTO for auto-detect(default), //DFLIP.PAGE_MODE.SINGLE or 1 for singleview, //DFLIP.PAGE_MODE.DOUBLE or 2 for doubleview, pageMode: DFLIP.PAGE_MODE.AUTO, //set as //DFLIP.SINGLE_PAGE_MODE.AUTO for auto-detect(default), //DFLIP.SINGLE_PAGE_MODE.ZOOM or 1 for normal zoom single view, //DFLIP.SINGLE_PAGE_MODE.BOOKLET or 2 for Booklet mode, singlePageMode: DFLIP.SINGLE_PAGE_MODE.AUTO, //color value in hexadecimal backgroundColor: "#fff", forceFit: true, //very rare usage leave it as true unless page are not fitting wrong... transparent: false, //true or false hard: "none", //possible values are "hard", "none", "cover" openPage: 1, //the pagenumber where the book should open annotationClass: "", autoPlay: false, autoPlayDuration: 5000, autoPlayStart: false, // texture settings maxTextureSize: 1600, //max page size to be rendered. for pdf files only minTextureSize: 256, //min page size to be rendered. for pdf files only rangeChunkSize: 524288, // icons for the buttons icons: { 'altnext': 'ti-angle-right', 'altprev': 'ti-angle-left', 'next': 'ti-angle-right', 'prev': 'ti-angle-left', 'end': 'ti-angle-double-right', 'start': 'ti-angle-double-left', 'share': 'ti-sharethis', 'help': 'ti-help-alt', 'more': 'ti-more-alt', 'download': 'ti-download', 'zoomin': 'ti-zoom-in', 'zoomout': 'ti-zoom-out', 'fullscreen': 'ti-fullscreen', 'fitscreen': 'ti-arrows-corner', 'thumbnail': 'ti-layout-grid2', 'outline': 'ti-menu-alt', 'close': 'ti-close', 'search': 'ti-search', 'doublepage': 'ti-book', 'singlepage': 'ti-file', 'sound': 'ti-volume', 'facebook': 'ti-facebook', 'google': 'ti-google', 'twitter': 'ti-twitter-alt', 'mail': 'ti-email', 'play': 'ti-control-play', 'pause': 'ti-control-pause' }, // TRANSLATION text to be displayed text: { toggleSound: "Turn on/off Sound", toggleThumbnails: "Toggle Thumbnails", toggleOutline: "Toggle Outline/Bookmark", previousPage: "Previous Page", nextPage: "Next Page", toggleFullscreen: "Toggle Fullscreen", zoomIn: "Zoom In", zoomOut: "Zoom Out", toggleHelp: "Toggle Help", singlePageMode: "Single Page Mode", doublePageMode: "Double Page Mode", downloadPDFFile: "Download PDF File", gotoFirstPage: "Goto First Page", gotoLastPage: "Goto Last Page", play: "Start AutoPlay", pause: "Pause AutoPlay", share: "Share", mailSubject: "I wanted you to see this FlipBook", mailBody: "Check out this site {{url}}", loading: "Loading", }, //valid controlnames: //altPrev,pageNumber,altNext,outline,thumbnail,zoomIn,zoomOut,fullScreen,share //more,download,pageMode,startPage,endPage,sound allControls: "altPrev,pageNumber,altNext,play,outline,thumbnail,zoomIn,zoomOut,fullScreen,share,download,search,more,pageMode,startPage,endPage,sound", moreControls: "download,pageMode,startPage,endPage,sound", hideControls: "", controlsPosition: DFLIP.CONTROLSPOSITION.BOTTOM, paddingTop: 30, paddingLeft: 20, paddingRight: 20, paddingBottom: 30, enableAnalytics: false, //set if the zoom changes on mouse scroll (true|false) scrollWheel: true, // callbacks onCreate: function (flipBook) { // after flip book is created is fired }, onCreateUI: function (flipBook) { // after ui created event is fired }, onFlip: function (flipBook) { // after flip event is fired }, beforeFlip: function (flipBook) { // before flip event is fired }, onReady: function (flipBook) { // after flip book is completely loaded }, zoomRatio: 1.5, pageSize: DFLIP.PAGE_SIZE.AUTO, /** * NON-OPTIONS AREA * These options are not supposed to be sent from options variable */ /** * dependency URLS (NON-OPTION): * Do not set them as options, * Refer to advance-examples */ //(NON-OPTION) source link for PDF.JS file pdfjsSrc: "js/libs/pdf.min.js", //(NON-OPTION) source link for PDFcompatibility.JS file pdfjsCompatibilitySrc: "js/libs/compatibility.js", //(NON-OPTION) source link for PDF.WORKER.JS file pdfjsWorkerSrc: "js/libs/pdf.worker.min.js", //(NON-OPTION) source link for THREE.JS file threejsSrc: "js/libs/three.min.js", //(NON-OPTION) source link for MOCKUP.JS file mockupjsSrc: "js/libs/mockup.min.js", //(NON-OPTION) File path to the trun sound soundFile: "sound/turn2.mp3", imagesLocation: "images", imageResourcesPath: "images/pdfjs/", cMapUrl: "cmaps/", //it's quite wierd how cmaps don't work properly with relative urls like others.. but is relative to pdf.min.js path //(NON-OPTION) developer parameters enableDebugLog: false, canvasToBlob: false,//as of 1.2.9 canvas are better optimized and secure enableAnnotation: true, pdfRenderQuality: 0.90, /** * Let them be, change at your risk */ // if texture fallback override is required // note: if set to anything other than "blank" the first page is changed // recommended : "blank" textureLoadFallback: "blank", //"images/textures/white.jpg", // controls the flexibility of the paper more value for more flexiblilty stiffness: 3, // minTopOffset: 30, // link to the images file that you want as background. // supported files are jpgs,png. smaller files are preffered for performance backgroundImage: "",//"images/textures/el.jpg", // or any number like 5, 500. recommended: "auto" pageRatio: null, //equals to width/height pixelRatio: window.devicePixelRatio || 1, thumbElement: 'div', /*3D settings*/ spotLightIntensity: 0.22, ambientLightColor: "#fff", ambientLightIntensity: 0.8, shadowOpacity: 0.15, linkTarget: DFLIP.LINK_TARGET.BLANK, sharePrefix: 'flipbook-', }; var has3d = 'WebKitCSSMatrix' in window || (document.body && 'MozPerspective' in document.body.style), hasMouse = 'onmousedown' in window, hasTouch = 'ontouchstart' in window; var userAgent = navigator.userAgent; var utils = DFLIP.utils = { drag: { left: 0, right: 1, none: -1 }, mouseEvents: (hasMouse) ? {type: "mouse", start: "mousedown", move: "mousemove", end: "mouseup"} : {type: "touch", start: "touchstart", move: "touchmove", end: "touchend"}, html: { div: "<div/>", img: "<img/>", a: "<a>", input: "<input type='text'/>" }, //functions or so getSharePrefix: function () { //-dflip is used for backward compatibility and safety var prefixes = utils.getSharePrefixes(); return prefixes[0]; }, getSharePrefixes: function () { var prefixes = (DFLIP.defaults.sharePrefix + ',dflip-,flipbook-,dearflip-').split(",").filter( function (e) {return e} ); return prefixes; }, toRad: function (deg) { return deg * Math.PI / 180; }, isset: function (check, fallback) { return check == null ? fallback : check; }, isnull: function (variable) { return variable == null || variable == null; }, toDeg: function (rad) { return rad * 180 / Math.PI; }, transition: function (hasTransition, duration) { return hasTransition ? duration / 1000 + "s ease-out" : "0s none"; }, hasCompatibility: function () { var compatible = false; if (window.dFlipLocation != null) { if (window.dFlipLocation.indexOf('lip-lit') > 0) compatible = true; } return compatible; }, scrollIntoView: function (element, reference, align) { reference = reference || element.parentNode; reference.scrollTop = element.offsetTop - reference.offsetTop + (align === false ? element.offsetHeight - reference.offsetHeight : 0); reference.scrollLeft = element.offsetLeft - reference.offsetLeft; }, display: function (hasDisplay) { return hasDisplay ? "block" : "none"; }, resetTranslate: function () { return translateStr(0, 0); }, translateStr: function (x, y) { return has3d ? ' translate3d(' + x + 'px,' + y + 'px, 0px) ' : ' translate(' + x + 'px, ' + y + 'px) '; }, httpsCorrection: function (url) { var location = window.location; if (location.href.indexOf("https://") > -1 && url.indexOf(location.hostname) > -1) { url = url.replace("http://", "https://"); } if (location.href.indexOf("http://") > -1 && url.indexOf(location.hostname) > -1) { url = url.replace("https://", "http://"); } return url; }, resetBoxShadow: function () { return "rgba(0, 0, 0, 0) 0px 0px 20px"; }, rotateStr: function (deg) { return ' rotateZ(' + deg + 'deg) '; }, bg: function (src) { return '#fff' + bgImage(src); }, bgImage: function (src) { return (src == null || src == "blank" ? '' : ' url(' + src + ')'); }, src: function (src) { return (src != null ? '' + src + '' : ''); }, limitAt: function (x, min, max) { return x < min ? min : x > max ? max : x; }, distOrigin: function (x, y) { return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); }, distPoints: function (x1, y1, x2, y2) { return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); }, calculateScale: function (startTouches, endTouches) { var startDistance = distPoints(startTouches[0].x, startTouches[0].y, startTouches[1].x, startTouches[1].y), endDistance = distPoints(endTouches[0].x, endTouches[0].y, endTouches[1].x, endTouches[1].y); return endDistance / startDistance; }, /** * Calculates the average of multiple vectors (x, y values) */ getVectorAvg: function (vectors) { return { x: vectors.map(function (v) { return v.x; }).reduce(utils.sum) / vectors.length, y: vectors.map(function (v) { return v.y; }).reduce(utils.sum) / vectors.length }; }, sum: function (a, b) { return a + b; }, /** * Returns the touches of an event relative to the container offset * @param event * @return array touches */ getTouches: function (event, position) { position = position || {left: 0, top: 0}; return Array.prototype.slice.call(event.touches).map(function (touch) { return { x: touch.pageX - position.left, y: touch.pageY - position.top }; }); }, angleByDistance: function (distance, fullWidth) { var h = fullWidth / 2; var d = limitAt(distance, 0, fullWidth); return d < h ? toDeg(Math.asin(d / h)) : 90 + toDeg(Math.asin((d - h) / h)); }, log: function (args) { if (defaults.enableDebugLog == true && window.console) console.log(args); }, lowerPowerOfTwo: function (value) { return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); }, nearestPowerOfTwo: function (value, max) { return Math.min(max || 2048, Math.pow(2, Math.ceil(Math.log(value) / Math.LN2))); }, zoomStops: function (value, zoomRatio, ceil, min, max) { if (min == null) min = 256; if (max == null) max = 2048; //Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); var factor = Math.log(value / min) / Math.log(zoomRatio); return min * Math.pow(zoomRatio, ceil == null ? Math.round(factor) : (ceil == true ? Math.ceil(factor) : Math.floor(factor))); }, extendOptions: function (defaults, options) { return $.extend(true, {}, defaults, options); }, getFullscreenElement: function () { return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement }, hasFullscreenEnabled: function () { return document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled }, getBasePage: function (pageNumber) { return Math.floor(pageNumber / 2) * 2; }, loadResources: function loadResources(resourceTag, src, callback) { var doc = document, element = doc.createElement(resourceTag), refElement = doc.getElementsByTagName(resourceTag)[0]; element.async = true; if (callback) { element.addEventListener('load', function (e) { callback(null, e); }, false); } element.src = src; refElement.parentNode.insertBefore(element, refElement); }, getScriptCallbacks: [], getScript: function (source, callback, errorCallback) { var _callbacks = utils.getScriptCallbacks[source], script; function load(_, isAbort) { if (script != null) { //IE 10 doesn't regard if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) { //console.log("aborted loading :" + source); script.onload = script.onreadystatechange = null; script = null; script = null; if (!isAbort) { for (var i = 0; i < _callbacks.length; i++) { if (_callbacks[i]) _callbacks[i](); _callbacks[i] = null; } errorCallback = null; } } } } if ($("script[src='" + source + "']").length === 0) { _callbacks = utils.getScriptCallbacks[source] = []; _callbacks.push(callback); script = document.createElement('script'); var prior = document.body.getElementsByTagName('script')[0]; script.async = 1; script.setAttribute("data-cfasync", false); if (prior != null) { prior.parentNode.insertBefore(script, prior); prior = null; } else { //sometimes if script are loaded in head and no scripts are present in body document.body.appendChild(script); } script.addEventListener("load", load, false); script.addEventListener("readystatechange", load, false); script.addEventListener("complete", load, false); if (errorCallback) { script.addEventListener("error", errorCallback, false); } //script.onload = script.onreadystatechange = load; script.src = source + (prefix.dom == "MS" ? ("?" + Math.random(1)) : ""); } else { _callbacks.push(callback); } }, isHardPage: function (config, pageNumber, pageCount, isBooklet) { if (config != null) { // var config = this.hardConfig; if (config == "cover") { return pageNumber == 0 || (isBooklet && pageNumber == 1) //front cover is 0 || pageNumber == (Math.ceil(pageCount / (isBooklet ? 1 : 2)) - (isBooklet ? 0 : 1)); //start with 0 so 1 minus } else if (config == "all") { return true; } else { var baseTest = ("," + config + ",").indexOf("," + (pageNumber * 2 + 1) + ",") > -1; var nextTest = ("," + config + ",").indexOf("," + (pageNumber * 2 + 2) + ",") > -1; return baseTest || nextTest; } } return false; }, fixMouseEvent: function (event) { if (event) { var originalEvent = event.originalEvent || event; //noinspection JSUnresolvedVariable if (originalEvent.changedTouches && originalEvent.changedTouches.length > 0) { var _event = $.event.fix(event); //noinspection JSUnresolvedVariable var touch = originalEvent.changedTouches[0]; _event.clientX = touch.clientX; _event.clientY = touch.clientY; _event.pageX = touch.pageX; _event.touches = originalEvent.touches; _event.pageY = touch.pageY; _event.movementX = touch.movementX; _event.movementY = touch.movementY; return _event; } else { return event; } } else { return event; } }, //self Execution hasWebgl: (function () { try { var canvas = document.createElement('canvas'); //noinspection JSUnresolvedVariable return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))); } catch (e) { return false; } })(), isBookletMode: function (book) { return book.pageMode == DFLIP.PAGE_MODE.SINGLE && book.singlePageMode == DFLIP.SINGLE_PAGE_MODE.BOOKLET }, isRTLMode: function (book) { return book.direction == DFLIP.DIRECTION.RTL }, isIPad: (function () { return navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform); })(), isMobile: (function () { var check = false; (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true })(userAgent || navigator.vendor || window.opera); return check; })(), isIOS: /(iPad|iPhone|iPod)/g.test(userAgent), isSafari: /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification), prefix: (function () { var styles = window.getComputedStyle(document.documentElement, ''), pre = (Array.prototype.slice .call(styles) .join('') .match(/-(moz|webkit|ms)-/))[1], dom = ('WebKit|Moz|MS').match(new RegExp('(' + pre + ')', 'i'))[1]; return { dom: dom, lowercase: pre, css: '-' + pre + '-', js: pre[0].toUpperCase() + pre.substr(1) }; })(), canSupport3D: function () { var canSupport = true; try { if (userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { canSupport = false; console.log("Proper Support for 3D not detected for IE!"); } else if (isSafari && !isIOS) { canSupport = false; console.log("Proper Support for 3D not detected for IOS!"); } else { var android = userAgent.toString().toLowerCase().match(/android\s([0-9\.]*)/i); android = android ? android[1] : undefined; if (android) { android = parseInt(android, 10); if (!isNaN(android) && android < 9) { canSupport = false; console.log("Proper Support for 3D not detected for Android below 9.0!") } } } } catch (error) { } return canSupport; }, __extends: function (child, parent) { for (var key in parent) if (parent.hasOwnProperty(key)) child[key] = parent[key]; function Ctor() { this.constructor = child; } Ctor.prototype = parent.prototype; child.prototype = new Ctor(); child.__super = parent.prototype; return child; } }; //caching the utils var SOURCE_TYPE = DFLIP.SOURCE_TYPE, DISPLAY_TYPE = DFLIP.DISPLAY_TYPE, drag = utils.drag, mouseEvents = utils.mouseEvents, html = utils.html, isset = utils.isset, isnull = utils.isnull, toRad = utils.toRad, toDeg = utils.toDeg, transition = utils.transition, translateStr = utils.translateStr, resetBoxShadow = utils.resetBoxShadow, rotateStr = utils.rotateStr, bg = utils.bg, bgImage = utils.bgImage, src = utils.src, limitAt = utils.limitAt, distOrigin = utils.distOrigin, distPoints = utils.distPoints, angleByDistance = utils.angleByDistance, log = utils.log, nearestPowerOfTwo = utils.nearestPowerOfTwo, extendOptions = utils.extendOptions, getBasePage = utils.getBasePage, getScript = utils.getScript, fixMouseEvent = utils.fixMouseEvent, prefix = utils.prefix, isBookletMode = utils.isBookletMode, isRTLMode = utils.isRTLMode, isMobile = utils.isMobile, hasWebgl = utils.hasWebgl, isSafari = utils.isSafari, isIOS = utils.isIOS, __extends = utils.__extends; // Support: IE<11, Chrome<21, Android<4.4, Safari<6 (function checkSetPresenceInImageData() { // IE < 11 will use window.CanvasPixelArray which lacks set function. if (window.CanvasPixelArray) { if (typeof window.CanvasPixelArray.prototype.set !== 'function') { window.CanvasPixelArray.prototype.set = function (arr) { for (var i = 0, ii = this.length; i < ii; i++) { this[i] = arr[i]; } }; } } else { // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. // Because we cannot feature detect it, we rely on user agent parsing. var polyfill = false, versionMatch; if (isSafari) { versionMatch = userAgent.match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); // Safari < 6 lacks the set function. polyfill = versionMatch && parseInt(versionMatch[1]) < 6; } if (polyfill) { var contextPrototype = window.CanvasRenderingContext2D.prototype; var createImageData = contextPrototype.createImageData; contextPrototype.createImageData = function (w, h) { var imageData = createImageData.call(this, w, h); imageData.data.set = function (arr) { for (var i = 0, ii = this.length; i < ii; i++) { this[i] = arr[i]; } }; return imageData; }; // this closure will be kept referenced, so clear its vars contextPrototype = null; } } })(); // Support: IE<10, Android<4.0, iOS (function checkRequestAnimationFrame() { function fakeRequestAnimationFrame(callback) { window.setTimeout(callback, 20); } if ('requestAnimationFrame' in window) { return; } window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || fakeRequestAnimationFrame; })(); // Checking if the typed arrays are supported // Support: iOS<6.0 (subarray), IE<10, Android<4.0 (function checkTypedArrayCompatibility() { if (typeof Uint8Array !== 'undefined') { // Support: iOS<6.0 if (typeof Uint8Array.prototype.subarray === 'undefined') { Uint8Array.prototype.subarray = function subarray(start, end) { return new Uint8Array(this.slice(start, end)); }; Float32Array.prototype.subarray = function subarray(start, end) { return new Float32Array(this.slice(start, end)); }; } // Support: Android<4.1 if (typeof Float64Array === 'undefined') { window.Float64Array = Float32Array; } return; } function subarray(start, end) { return new TypedArray(this.slice(start, end)); } function setArrayOffset(array, offset) { if (arguments.length < 2) { offset = 0; } for (var i = 0, n = array.length; i < n; ++i, ++offset) { this[offset] = array[i] & 0xFF; } } function TypedArray(arg1) { var result, i, n; if (typeof arg1 === 'number') { result = []; for (i = 0; i < arg1; ++i) { result[i] = 0; } } else if ('slice' in arg1) { result = arg1.slice(0); } else { result = []; for (i = 0, n = arg1.length; i < n; ++i) { result[i] = arg1[i]; } } result.subarray = subarray; result.buffer = result; result.byteLength = result.length; result.set = setArrayOffset; if (typeof arg1 === 'object' && arg1.buffer) { result.buffer = arg1.buffer; } return result; } window.Uint8Array = TypedArray; window.Int8Array = TypedArray; // we don't need support for set, byteLength for 32-bit array // so we can use the TypedArray as well window.Uint32Array = TypedArray; window.Int32Array = TypedArray; window.Uint16Array = TypedArray; window.Float32Array = TypedArray; window.Float64Array = TypedArray; })(); var extendDFlipOptions = function (options) { return $.extend(true, {}, defaults, options); }; //Creates ui for the flipbook var createUI = function (container, object) { var uiClass = "df-ui"; var wrapperClass = "df-ui-wrapper"; var buttonClass = uiClass + "-" + "btn"; var isRTL = isRTLMode(object.target); var ui = object.ui = $(html.div, {'class': uiClass}); var options = object.options; ui.dispose = function () { container.find("." + buttonClass).each(function () { $(this).off(); }); help.off(); next.off(); prev.off(); play.off(); zoom.off(); zoomIn.off(); zoomOut.off(); page.off(); sound.off(); more.off(); fullScreen.off(); fit.off(); share.off(); start.off(); end.off(); pageModeButton.off(); altPrev.off(); altNext.off(); thumbnail.off(); outline.off(); controls.remove(); sizeControls.remove(); prev.remove(); next.remove(); zoom.remove(); if (ui.shareBox) { if (ui.shareBox.dispose) ui.shareBox.dispose(); ui.shareBox = null; } document.removeEventListener('keyup', onKeyUp, false); window.removeEventListener('click', closeMoreOptions, false); ui.update = null; object = null; }; var validPage = function (pageNumber) { if (isNaN(pageNumber)) pageNumber = object.target._activePage; else if (pageNumber < 1) pageNumber = 1; else if (pageNumber > object.target.pageCount) pageNumber = object.target.pageCount; return pageNumber; }; var next = ui.next = $(html.div, { class: buttonClass + " " + uiClass + "-next " + options.icons['next'], title: isRTL ? options.text.previousPage : options.text.nextPage, html: "<span>" + options.text.nextPage + "</span>" }).on("click", function () { object.next(); }); var prev = ui.prev = $(html.div, { class: buttonClass + " " + uiClass + "-prev " + options.icons['prev'], title: isRTL ? options.text.nextPage : options.text.previousPage, html: "<span>" + options.text.previousPage + "</span>" }).on("click", function () { object.prev(); }); var play = $(html.div, { class: buttonClass + " " + uiClass + "-play " + options.icons['play'], title: options.text.play, html: "<span>" + options.text.play + "</span>" }).on("click", function () { var el = $(this); object.setAutoPlay(!el.hasClass(options.icons['pause'])); }); if (options.autoPlay == true) { ui.play = play; object.setAutoPlay(options.autoPlayStart); } var zoom = $(html.div, { class: wrapperClass + " " + uiClass + "-zoom" }); var zoomIn = ui.zoomIn = $(html.div, { class: buttonClass + " " + uiClass + "-zoomin " + options.icons['zoomin'], title: options.text.zoomIn, html: "<span>" + options.text.zoomIn + "</span>" }).on("click", function () { object.zoom(1); ui.update(); if (object.target.startPoint && object.target.pan) object.target.pan(object.target.startPoint); }); var zoomOut = ui.zoomOut = $(html.div, { class: buttonClass + " " + uiClass + "-zoomout " + options.icons['zoomout'], title: options.text.zoomOut, html: "<span>" + options.text.zoomOut + "</span>" }).on("click", function () { object.zoom(-1); ui.update(); if (object.target.startPoint && object.target.pan) object.target.pan(object.target.startPoint); }); zoom.append(zoomIn).append(zoomOut); var page = ui.pageNumber = $(html.div, { class: buttonClass + " " + uiClass + "-page", }).on("change", function () { var pageNumber = parseInt((ui.pageInput.val()), 10); pageNumber = validPage(pageNumber); object.gotoPage(pageNumber); }).on("keyup", function (event) { if (event.keyCode == 13) { var pageNumber = parseInt((ui.pageInput.val()), 10); pageNumber = validPage(pageNumber); if (pageNumber !== validPage(object.target._activePage || object._activePage)) object.gotoPage(pageNumber); } }); ui.pageInput = $('<input id="df_book_page_number" type="text"/>').appendTo(page); ui.pageLabel = $('<label for="df_book_page_number"/>').appendTo(page); var sizeControls = $(html.div, { class: wrapperClass + " " + uiClass + "-size" }); var help = $(html.div, { class: buttonClass + " " + uiClass + "-help " + options.icons['help'], title: options.text.toggleHelp, html: "<span>" + options.text.toggleHelp + "</span>" }).on("click", function () { }); //Sound Button var sound = ui.sound = $(html.div, { class: buttonClass + " " + uiClass + "-sound " + options.icons['sound'], title: options.text.toggleSound, html: "<span>" + options.text.toggleSound + "</span>" }).on("click", function () { options.soundEnable = !options.soundEnable; ui.updateSound(); }); //Updates sound on click of sound button ui.updateSound = function () { if (options.soundEnable == false || options.soundEnable == 'false') sound.addClass("disabled"); else sound.removeClass("disabled"); }; //immediate check ui.updateSound(); //Search button //closes searchoptions container function closeSearchOptions(event) { ui.search.removeClass("df-active"); } if (typeof options.source == 'string' && options.search == true) { var search = ui.search = $(html.div, { class: buttonClass + " " + uiClass + "-search " + options.icons['search'] }).on("click", function (event) { if (!search.hasClass("df-active")) { $(this).addClass("df-active"); event.stopPropagation(); } }); //register a click event on window to close the searchoptions window.addEventListener('click', closeSearchOptions, false); //search container that holds the searchoptions var searchContainer = $(html.div, { class: "search-container" }); search.append(searchContainer); } //More button var more = ui.more = $(html.div, { class: buttonClass + " " + uiClass + "-more " + options.icons['more'] }).on("click", function (event) { if (!more.hasClass("df-active")) { $(this).addClass("df-active"); event.stopPropagation(); } }); //closes moreoptions container function closeMoreOptions(event) { more.removeClass("df-active"); } //register a click event on window to close the moreoptions window.addEventListener('click', closeMoreOptions, false); //more container that holds the moreoptions var moreContainer = $(html.div, { class: "more-container" }); more.append(moreContainer); if (typeof options.source == 'string' && options.enableDownload == true) { var downloadClass = buttonClass + " " + uiClass + "-download " + options.icons['download']; var download = ui.download = $('<a download target="_blank" class="' + downloadClass + '"><span>' + options.text.downloadPDFFile + '</span></a>'); download.attr("href", options.source).attr("title", options.text.downloadPDFFile); //moreContainer.append(download); } var fullscreenEnabled = utils.hasFullscreenEnabled(); if (!fullscreenEnabled) { container.addClass("df-custom-fullscreen"); } ui.switchFullscreen = function () { var fullscreenElement = utils.getFullscreenElement(); var container = object.container[0]; if (ui.isFullscreen != true) { object.container.addClass("df-fullscreen"); if (container.requestFullscreen) { container.requestFullscreen(); } else if (container.msRequestFullscreen) { container.msRequestFullscreen(); } else if (container.mozRequestFullScreen) { container.mozRequestFullScreen(); } else if (container.webkitRequestFullscreen) { container.webkitRequestFullscreen(); } ui.isFullscreen = true } else { object.container.removeClass("df-fullscreen"); ui.isFullscreen = false; if (document.exitFullscreen) { if (document.fullscreenElement) document.exitFullscreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } else if (document.mozCancelFullScreen) { if (document.fullscreenElement) document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } if (!utils.hasFullscreenEnabled()) { setTimeout(function () { object.resize(); }, 50); } }; var fullScreen = ui.fullScreen = $(html.div, { class: buttonClass + " " + uiClass + "-fullscreen " + options.icons['fullscreen'], title: options.text.toggleFullscreen, html: "<span>" + options.text.toggleFullscreen + "</span>" }).on("click", ui.switchFullscreen); var fit = ui.fit = $(html.div, { class: buttonClass + " " + uiClass + "-fit " + options.icons['fitscreen'] }).on("click", function () { $(this).toggleClass("df-button-fit-active"); }); sizeControls.append(fullScreen); var controls = $(html.div, { class: wrapperClass + " " + uiClass + "-controls" }); var shareBox = ui.shareBox = new DFLIP.Share(container, options); var share = ui.share = $(html.div, { class: buttonClass + " " + uiClass + "-share " + options.icons['share'], title: options.text.share, html: "<span>" + options.text.share + "</span>" }).on("click", function (event) { if (ui.shareBox.isOpen == true) ui.shareBox.close(); else { ui.shareBox.update(object.getURLHash()); ui.shareBox.show(); } }); var start = ui.startPage = $(html.div, { class: buttonClass + " " + uiClass + "-start " + (isRTL ? options.icons['end'] : options.icons['start']), title: options.text.gotoFirstPage, html: "<span>" + options.text.gotoFirstPage + "</span>" }).on("click", function () { object.start(); }); var end = ui.endPage = $(html.div, { class: buttonClass + " " + uiClass + "-end " + (isRTL ? options.icons['start'] : options.icons['end']), title: options.text.gotoLastPage, html: "<span>" + options.text.gotoLastPage + "</span>" }).on("click", function () { object.end(); }); var pageModeButton = ui.pageMode = $(html.div, { class: buttonClass + " " + uiClass + "-pagemode " + options.icons['singlepage'], html: "<span>" + options.text.singlePageMode + "</span>" }).on("click", function () { var el = $(this); object.setPageMode(!el.hasClass(options.icons['doublepage'])); }); object.setPageMode(object.target.pageMode == DFLIP.PAGE_MODE.SINGLE) //moreContainer.append(pageModeButton).append(start).append(end).append(sound); var altPrev = ui.altPrev = $(html.div, { class: buttonClass + " " + uiClass + "-prev" + " " + uiClass + "-alt " + options.icons['prev'], title: isRTL ? options.text.nextPage : options.text.previousPage, html: "<span>" + options.text.previousPage + "</span>" }).on("click", function () { object.prev(); }); var altNext = ui.altNext = $(html.div, { class: buttonClass + " " + uiClass + "-next" + " " + uiClass + "-alt " + options.icons['next'], title: isRTL ? options.text.previousPage : options.text.nextPage, html: "<span>" + options.text.nextPage + "</span>" }).on("click", function () { object.next(); }); var thumbnail = ui.thumbnail = $(html.div, { class: buttonClass + " " + uiClass + "-thumbnail " + options.icons['thumbnail'], title: options.text.toggleThumbnails, html: "<span>" + options.text.toggleThumbnails + "</span>" }).on("click", function () { var $this = $(this); if (object.target.thumbContainer) { var thumbContainer = object.target.thumbContainer; thumbContainer.toggleClass("df-sidemenu-visible"); $this.toggleClass("df-active"); } else { object.contentProvider.initThumbs(); $this.toggleClass("df-active"); } if ($this.hasClass("df-active")) { $this.siblings(".df-active").trigger("click"); } ui.update(true); }); var outline = ui.outline = $(html.div, { class: buttonClass + " " + uiClass + "-outline " + options.icons['outline'], title: options.text.toggleOutline, html: "<span>" + options.text.toggleOutline + "</span>" }).on("click", function () { var $this = $(this); if (object.target.outlineContainer) { var outlineContainer = object.target.outlineContainer; $this.toggleClass("df-active"); outlineContainer.toggleClass("df-sidemenu-visible"); if ($this.hasClass("df-active")) { $this.siblings(".df-active").trigger("click"); } ui.update(true); } }); /** * Controls position and pplace ment is determined by options.moreControls and options.hideControls */ var allControls = options.allControls.replace(/ /g, '').split(','), moreControls = "," + options.moreControls.replace(/ /g, '') + ",", hideControls = "," + options.hideControls.replace(/ /g, '') + ","; if (isIOS && isMobile) { hideControls += ",fullScreen,"; } var moreControlsArray = moreControls.split(','); for (var controlCount = 0; controlCount < allControls.length; controlCount++) { //if hidden skip var controlName = allControls[controlCount]; if (hideControls.indexOf("," + controlName + ",") < 0) { //not found in hide list var control = ui[controlName]; if (control != null && typeof control == "object") { if (moreControls.indexOf("," + controlName + ",") > -1 && controlName !== 'more' && controlName !== 'pageNumber') {//found in more controls moreContainer.append(control); } else { controls.append(control); } } } } container.append(controls).append(prev).append(next).append(zoom); var ctrlDown = false, shiftDown = false, altDown = false; var shiftKey = 16, ctrlKey = 17, altKey = 18, sKey = 83, vKey = 86, cKey = 67, eKey = 69, gKey = 71, nKey = 78, oKey = 79, deleteKey = 46, rightKey = 39, leftKey = 37, escKey = 27; document.addEventListener('keyup', onKeyUp, false); function onKeyUp(event) { switch (event.keyCode) { case escKey: if (ui.isFullscreen == true) { ui.fullScreen.trigger("click"); } else if (window.dfLightBox && window.dfActiveLightBoxBook) { window.dfLightBox.closeButton.trigger("click"); } break; case shiftKey: shiftDown = false; break; case ctrlKey: ctrlDown = false; break; case altKey: altDown = false; break; case leftKey: object.prev(); break; case rightKey: object.next(); break; default: break; } //log(event.keyCode); } ui.update = function (resize) { log("ui update"); var target = object.target; var pageNumber = validPage(target._activePage || object._activePage); var pageCount = target.pageCount || object.pageCount; var isRTL = target.direction == DFLIP.DIRECTION.RTL, isStart = (pageNumber == 1 || pageNumber == 0), isEnd = pageNumber == pageCount; ui.next.show(); ui.prev.show(); ui.altNext.removeClass("disabled"); ui.altPrev.removeClass("disabled"); if ((isStart && !isRTL) || (isEnd && isRTL)) { ui.prev.hide(); ui.altPrev.addClass("disabled"); } if ((isEnd && !isRTL) || (isStart && isRTL)) { ui.next.hide(); ui.altNext.addClass("disabled"); } ui.pageInput.val(pageNumber); ui.pageLabel.html((pageNumber) + "/" + pageCount); if (container.find(".df-sidemenu-visible").length > 0) { container.addClass("df-sidemenu-open"); } else { container.removeClass("df-sidemenu-open"); } if (resize == true) object.resize(); if (target.contentProvider.zoomScale == target.contentProvider.maxZoom) { ui.zoomIn.addClass("disabled"); } else { ui.zoomIn.removeClass("disabled"); } if (target.contentProvider.zoomScale == 1) { ui.zoomOut.addClass("disabled"); } else { ui.zoomOut.removeClass("disabled"); } }; if (object.target != null) { object.target.ui = ui; } if (options.onCreateUI != null) options.onCreateUI(object); } ; var PreviewStage = null; //later updated via RegisterMockupObjects in case 3d is requested //Registers necessary mockup object when required function RegisterMockupObjects() { PreviewStage = (function (_super) { __extends(PreviewStage, _super); function PreviewStage(parameters) { parameters = parameters || {}; var _this = this; _super.call(this, parameters); _this.options = parameters; _this.canvas = $(_this.renderer.domElement).addClass("df-3dcanvas"); _this.container = parameters.container; _this.container.append(_this.canvas); //_this.container.height(parameters.height); _this.type = "PreviewStage"; _this.mouse = new THREE.Vector2(); _this.raycaster = new THREE.Raycaster(); _this.camera.position.set(0, 20, 600); _this.camera.lookAt(new THREE.Vector3(0, 0, 0)); //shadows are zigzap due to shadow camera position _this.spotLight.position.set(-220, 330, 550); _this.spotLight.castShadow = isMobile || utils.isIPad ? false : parameters.webglShadow; //_this.spotLight.shadowDarkness = 0.6; if (_this.spotLight.shadow) { _this.spotLight.shadow.bias = -0.0008; } _this.spotLight.intensity = isset(parameters.spotLightIntensity, defaults.spotLightIntensity); _this.ambientLight.color = new THREE.Color(isset(parameters.ambientLightColor, defaults.ambientLightColor)); _this.ambientLight.intensity = isset(parameters.ambientLightIntensity, defaults.ambientLightIntensity); var material = new THREE.ShadowMaterial(); material.opacity = isset(parameters.shadowOpacity, defaults.shadowOpacity); _this.ground.material = material; _this.ground.position.z = -2; //Restrict right left camera movement. _this.orbitControl.maxAzimuthAngle = 0; _this.orbitControl.minAzimuthAngle = 0; _this.orbitControl.minPolarAngle = Math.PI / 2; _this.orbitControl.maxPolarAngle = 2.2; //_this.orbitControl.maxPolarAngle = 10; _this.orbitControl.mouseButtons.ORBIT = THREE.MOUSE.RIGHT; _this.orbitControl.mouseButtons.PAN = -1; _this.orbitControl.maxDistance = 5000; _this.orbitControl.minDistance = 50; _this.orbitControl.noZoom = true; _this.selectiveRendering = true; _this.orbitControl.zoomSpeed = 5; _this.orbitControl.keyPanSpeed = 0; _this.orbitControl.center.set(0, 0, 0); _this.orbitControl.update(); _this.swipe_threshold = isMobile ? 15 : 20; var cssRenderer = _this.cssRenderer = new THREE.CSS3DRenderer(); $(cssRenderer.domElement).css({ position: "absolute", top: 0, pointerEvents: "none" }).addClass("df-3dcanvas df-csscanvas"); _this.container[0].appendChild(cssRenderer.domElement); var cssScene = _this.cssScene = new THREE.Scene(); var divLeftDOM = document.createElement("div"); divLeftDOM.className = "df-page-content df-page-content-left"; var divRightDOM = document.createElement("div"); divRightDOM.className = "df-page-content df-page-content-right"; var divLeft = cssScene.divLeft = new THREE.CSS3DObject(divLeftDOM); var divRight = cssScene.divRight = new THREE.CSS3DObject(divRightDOM); cssScene.add(divLeft); cssScene.add(divRight); _this.resizeCallback = function () { cssRenderer.setSize(_this.canvas.width(), _this.canvas.height()); }; function requestRender() { _this.renderRequestPending = true; } window.addEventListener(mouseEvents.move, requestRender, false); window.addEventListener('keyup', requestRender, false); _this.dispose = function () { - _this.clearChild(); _this.render(); window.removeEventListener(mouseEvents.move, requestRender, false); if (_this.options.scrollWheel == true) { _this.container[0].removeEventListener('mousewheel', onMouseWheel, false); _this.container[0].removeEventListener('DOMMouseScroll', onMouseWheel, false); // firefox } window.removeEventListener('keyup', requestRender, false); _this.renderer.domElement.removeEventListener("mousemove", editor_mouseMove, false); _this.renderer.domElement.removeEventListener("touchmove", editor_mouseMove, false); _this.renderer.domElement.removeEventListener("mousedown", editor_mouseDown, false); _this.renderer.domElement.removeEventListener("touchstart", editor_mouseDown, false); _this.renderer.domElement.removeEventListener("mouseup", editor_mouseUp, false); _this.renderer.domElement.removeEventListener("touchend", editor_mouseUp, false); _this.canvas.remove(); cssRenderer.domElement.parentNode.removeChild(cssRenderer.domElement); cssRenderer = null; _this.renderCallback = null; _this.renderCallback = null; _this.orbitControl.dispose(); _this.orbitControl = null; _this.renderer.dispose(); _this.cancelRAF(); }; _this.renderCallback = function () { if (TWEEN.getAll().length > 0) _this.renderRequestPending = true; TWEEN.update(); cssRenderer.render(cssScene, _this.camera) }; var onMouseWheel = function (event) { if (!(_this.previewObject.options.isLightBox === true || _this.previewObject.ui.isFullscreen === true)) return; var delta = 0; if (event.wheelDelta != null) { // WebKit / Opera / Explorer 9 delta = event.wheelDelta; } else if (event.detail != null) { // Firefox delta = -event.detail; } if (delta) { var currentZoom = _this.previewObject.contentProvider.zoomScale; if ((delta > 0 && currentZoom == 1) || (delta < 0 && currentZoom > 1)) { event.preventDefault(); } _this.previewObject.zoom(delta > 0 ? 1 : -1); } requestRender(); }; var editor_mouseMove = function (event) { _this.renderRequestPending = true; event = fixMouseEvent(event); if (_this.isMouseDown && event.movementX != 0 && event.movementY != 0) { _this.isMouseMoving = true; } if (event.touches != null && event.touches.length == 2 && _this.startTouches != null) { //return; // _this.startTouches = event.touches; _this.zoomDirty = true; var touchCenter = utils.getVectorAvg(utils.getTouches(event, _this.container.offset())), newScale = utils.calculateScale(_this.startTouches, utils.getTouches(event)), scale = newScale / _this.lastScale; var zoom = _this.previewObject.contentProvider.zoomScale, x = touchCenter.x, y = touchCenter.y; _this.camera.position.z = _this.originalZ / (newScale); _this.lastScale = newScale; _this.lastZoomCenter = touchCenter; event.preventDefault(); return; } if (_this.isMouseDown == true && _this.previewObject.contentProvider.zoomScale == 1) { //check if swipe has happened var swipe_dist = event.pageX - _this.lastPos, swipe_time = performance.now() - _this.lastTime; //$("body > p").html(swipe_dist); if (Math.abs(swipe_dist) > _this.swipe_threshold) { //swipe has triggered //_this.dragPage.pendingPoint = point; if (swipe_dist < 0) { _this.target.next(); } else { _this.target.prev(); } event.preventDefault(); _this.isMouseDown = false; } _this.lastPos = event.pageX; _this.lastTime = performance.now(); } }; var editor_mouseDown = function (event) { event = fixMouseEvent(event); if (event.touches != null && event.touches.length == 2 && _this.startTouches == null) { _this.startTouches = utils.getTouches(event); _this.lastScale = 1; _this.originalZ = _this.camera.position.z * 1; } document.activeElement.blur(); _this.mouseValue = event.pageX + "," + event.pageY; _this.isMouseMoving = false; _this.isMouseDown = true; _this.lastPos = event.pageX; _this.lastTime = performance.now(); }; var editor_click = function (event) { _this.isMouseDown = false; //bail out if it's not left click if (event.button !== 0) return this; var mouseValue = event.pageX + "," + event.pageY; if (_this.isMouseMoving) { } else if (mouseValue == _this.mouseValue) { event = event || window.event; event = $.event.fix(event); var mouse = _this.mouse, raycaster = _this.raycaster; mouse.x = ((event.offsetX) / _this.canvas.innerWidth()) * 2 - 1; mouse.y = 1 - ((event.offsetY) / _this.canvas.innerHeight()) * 2; raycaster.setFromCamera(mouse, _this.camera); var intersects = raycaster.intersectObjects(_this.target instanceof MOCKUP.Bundle ? _this.target.children : [_this.target], true); if (intersects.length > 0) { var object, objectCount = 0; do { object = intersects[objectCount] != null ? intersects[objectCount].object : null; //bookStage.clickFace = intersects[objectCount].face; objectCount++; } while ((object instanceof THREE.BoxHelper || !(object instanceof MOCKUP.Paper) || object.isFlipping == true) && objectCount < intersects.length); //if (object.parent instanceof MOCKUP.Bundle) { // object = object.parent; //} if (object.userData.object != null) { // helper //bookStage.selectObject(object.userData.object); } else { if (object.angles[1] > 90) { if (object.isEdge != true) _this.target.next(); } else { if (object.isEdge != true) _this.target.prev(); } } } else { //bookStage.selectObject(null); } } //bookStage.stage.render(); }; var editor_mouseUp = function (event) { event = fixMouseEvent(event); if (event.touches != null && event.touches.length == 0) { var zoom = _this.previewObject.contentProvider.zoomScale; if (_this.zoomDirty == true) { _this.previewObject.contentProvider.zoomScale = utils.limitAt(_this.previewObject.contentProvider.zoomScale * _this.lastScale, 1, _this.previewObject.contentProvider.maxZoom); _this.previewObject.zoomValue = _this.previewObject.contentProvider.zoomScale * 1; //_this.previewObject.zoom(_this.lastScale < 1 ? -1 : 1); //console.log(_this.previewObject.contentProvider.zoomScale * _this.lastScale,_this.previewObject.contentProvider.maxZoom) //_this.previewObject.pendingZoom = true; _this.previewObject.resize(); _this.zoomDirty = false; } _this.lastScale = null; _this.startTouches = null; } if (event.touches != null && event.touches.length > 1) return; editor_click(event); }; //if (MOCKUP.mode !== MOCKUP.MODE.PLUGIN) { //_this.renderer.domElement.addEventListener('click', editor_click, false); //bookStage.renderer.domElement.addEventListener('dblclick', editor_dblclick, false); _this.renderer.domElement.addEventListener("mousemove", editor_mouseMove, false); _this.renderer.domElement.addEventListener("touchmove", editor_mouseMove, false); _this.renderer.domElement.addEventListener("mousedown", editor_mouseDown, false); _this.renderer.domElement.addEventListener("touchstart", editor_mouseDown, false); _this.renderer.domElement.addEventListener("mouseup", editor_mouseUp, false); _this.renderer.domElement.addEventListener("touchend", editor_mouseUp, false); if (_this.options.scrollWheel == true) { _this.container[0].addEventListener('mousewheel', onMouseWheel, false); _this.container[0].addEventListener('DOMMouseScroll', onMouseWheel, false); // firefox } //} $(_this.renderer.domElement).css({display: "block"}); $(window).trigger("resize"); return this; } PreviewStage.prototype.width = function () { return this.container.width(); }; PreviewStage.prototype.height = function () { return this.container.height(); }; return PreviewStage; })(MOCKUP.Stage); MOCKUP.PreviewStage = PreviewStage; var BookPaper = (function (_super) { __extends(BookPaper, _super); function BookPaper(parameters, stage) { parameters = parameters || {}; parameters.folds = 1; _super.call(this, parameters, stage); this.angle = 0; this.isFlipping = false; this.material.materials[5].transparent = true; this.material.materials[4].transparent = true; this.type = "BookPaper"; } BookPaper.prototype.tween = function (oldAngle, newAngle) { var page = this; var epsilon = 0.00001; page.originalStiff = page.stiffness; var oldTarget = page.newStiffness; var isBooklet = isBookletMode(page.parent); //console.log(page.stiffness); var diff = newAngle - oldAngle;//170 -5 == 165 : 5-170 = -165 var isRight = oldAngle > 90; var isRTL = page.parent.direction == DFLIP.DIRECTION.RTL; page.init = { angle: oldAngle, angle2: (oldAngle < 90 ? 0 : 180), stiff: page.originalStiff, index: (isRight && !isRTL) || (!isRight && isRTL) ? 1 : 0 }; page.first = { angle: oldAngle + diff / 4, angle2: (oldAngle < 90 ? 90 : 90), stiff: page.originalStiff, index: (isRight && !isRTL) || (!isRight && isRTL) ? 1 : 0.25 }; page.mid = { angle: oldAngle + diff * 2 / 4, angle2: (oldAngle < 90 ? 135 : 45), stiff: page.newStiffness, index: (isRight && !isRTL) || (!isRight && isRTL) ? 0.5 : 0.5 }; page.mid2 = { angle: oldAngle + diff * 3 / 4, angle2: (oldAngle < 90 ? 180 : 0), stiff: page.newStiffness, index: (isRight && !isRTL) || (!isRight && isRTL) ? 0.25 : 1 }; page.end = { angle: newAngle, angle2: (oldAngle < 90 ? 180 : 0), stiff: page.newStiffness, index: (isRight && !isRTL) || (!isRight && isRTL) ? 0 : 1 }; //console.log(page.init, page.first, page.mid, page.end); page.isFlipping = true; var update = function (tween, event) { page.angles[1] = tween.angle; page.angles[4] = page.isHard ? tween.angle : tween.angle2; if (page.isHard == true) { page.stiffness = 0; } else { page.stiffness = tween.stiff / (oldTarget + epsilon) * (page.newStiffness + epsilon); page.stiffness = isNaN(page.stiffness) ? 0 : tween.stiff; } if (isBooklet) { page.material.materials[5].opacity = page.material.materials[4].opacity = tween.index; page.castShadow = (isRight && !isRTL) || (!isRight && isRTL) ? tween.index > 0.5 : tween.index > 0.5; } //check if any sibling is flipping and their stiff is more that this page.updateAngle(true); }; if (isBooklet && ((!isRight && !isRTL) || (isRight && isRTL))) { page.material.materials[5].opacity = page.material.materials[4].opacity = 0; page.castShadow = false; } page.currentTween = new TWEEN.Tween(page.init) .to({ angle: [page.first.angle, page.mid.angle, page.mid2.angle, page.end.angle], angle2: [page.first.angle2, page.mid.angle2, page.mid2.angle2, page.end.angle2], stiff: [page.first.stiff, page.mid.stiff, page.mid2.stiff, page.end.stiff], index: [page.first.index, page.mid.index, page.mid2.index, page.end.index] }, page.parent.duration) .onUpdate(function (event) { update(this, event); }).easing(TWEEN.Easing.Sinusoidal.Out) .onComplete(function (event) { page.stiffness = page.newStiffness; page.updateAngle(); page.material.materials[5].opacity = page.material.materials[4].opacity = 1; page.castShadow = true; page.isFlipping = false; if (page.parent && page.parent.refresh) page.parent.refresh(); //console.log(page.stiffness); }).start(); }; return BookPaper; })(MOCKUP.FlexBoxPaper); MOCKUP.BookPaper = BookPaper; var Book = (function (_super) { __extends(Book, _super); function Book(parameters, stage) { parameters = parameters || {}; parameters.segments = parameters.segments || 50; this.pageCount = parameters.pageCount; this.height = parameters.height; this.width = parameters.width; //correcting page count as multiple of 2 // this.pageCount = ((this.pageCount == 1 || utils.isBookletMode(parameters)) ? this.pageCount // : Math.ceil(this.pageCount / 2) * 2); this.direction = parameters.direction || DFLIP.DIRECTION.LTR; this.startPage = 1; this.endPage = this.pageCount; this.stackCount = parameters.stackCount || 6;// = 15; this.materials = []; _super.call(this, parameters, stage); this.angles = [0, 0, 0, 0, 0, 0]; this.stiffness = parameters.stiffness == null ? 1.5 : parameters.stiffness; //so that 0 can be set this.hardConfig = parameters.hard; //hard is not that good in 3d this._activePage = parameters.openPage || this.startPage; this.createStack(parameters); this.pageMode = parameters.pageMode || ((isMobile || this.pageCount <= 2) ? DFLIP.PAGE_MODE.SINGLE : DFLIP.PAGE_MODE.DOUBLE); this.singlePageMode = parameters.singlePageMode || (isMobile ? DFLIP.SINGLE_PAGE_MODE.BOOKLET : DFLIP.SINGLE_PAGE_MODE.ZOOM); this.type = "Book"; } Book.prototype.getPageByNumber = function (pageNumber) { var relativePageNumber = isBookletMode(this) ? (isRTLMode(this) ? pageNumber + 1 : pageNumber) : Math.floor((pageNumber - 1) / 2); return this.getObjectByName(relativePageNumber.toString()); }; Book.prototype.isPageHard = function (pageNumber) { return utils.isHardPage(this.hardConfig, pageNumber, this.pageCount); }; Book.prototype.activePage = function (pageNumber) { if (pageNumber == null) return this._activePage; this.gotoPage(pageNumber); }; Book.prototype.gotoPage = function (pageNumber) { pageNumber = parseInt(pageNumber, 10); this._activePage = pageNumber; if (this.autoPlay == true) { this.previewObject.setAutoPlay(this.autoPlay); } this.updatePage(pageNumber); if (this && this.thumblist && this.thumblist.review) this.thumblist.review(); }; Book.prototype.moveBy = function (step) { var nextPage = this._activePage + step; nextPage = limitAt(nextPage, this.startPage, this.endPage); if (this.firstFlipped != true) { this.previewObject.analytics({ eventAction: "First Page Flip", options: this.previewObject.options }); this.firstFlipped = true; } this.gotoPage(nextPage); }; Book.prototype.next = function (step) { if (step == null) step = (this.direction == DFLIP.DIRECTION.RTL) ? -this.pageMode : this.pageMode; this.moveBy(step); }; Book.prototype.prev = function (step) { if (step == null) step = (this.direction == DFLIP.DIRECTION.RTL) ? this.pageMode : -this.pageMode; this.moveBy(step); }; Book.prototype.updateAngle = function () { var startAngle = this.angles[1]; var endAngle = this.angles[4]; var spreadAngle = endAngle - startAngle; var stacks = this.stackCount; for (var _stackCount = 0; _stackCount < stacks; _stackCount++) { var clone = this.children[_stackCount]; //start from angle[1] and end at angles[4] clone.angles[1] = startAngle + _stackCount * spreadAngle / (stacks * 100); clone.stiffness = this.stiffness;//_stackCount/stacks; clone.updateAngle(); } }; Book.prototype.refresh = function () { this.updatePage(this._activePage); if (this.flipCallback != null) this.flipCallback(); }; Book.prototype.updatePage = function (pageNumber) { // this.contentProvider.setLoading(pageNumber, true); var isRTL = (this.direction == DFLIP.DIRECTION.RTL), isBooklet = isBookletMode(this), newBaseNumber = getBasePage(pageNumber); var pageDivisor = isBooklet ? 1 : 2; pageNumber = Math.floor((pageNumber / pageDivisor)); if (isRTL) pageNumber = Math.ceil(this.pageCount / pageDivisor) - pageNumber; var oldBaseNumber = this.oldBaseNumber || 0; var pageCount = this.pageCount / pageDivisor; var stackCount = this.stackCount; var angleShift = 0.02; var depth = 0.4; var stiffFactor = isBooklet ? 0 : (0.5 - Math.abs(pageCount / 2 - pageNumber) / pageCount) / this.stiffness; var positionFactor = 1;//(stiffFactor +width); // var centre = Math.floor(stackCount / 2); var midPoint = Math.floor(stackCount / 2);//pageNumber < centre ? pageNumber //starting center pages // : ((pageCount - pageNumber > centre) ? centre //other pages //: (pageNumber + centre - pageCount)) ;//remainig center page //console.log(midPoint); //var targetIndex = midPoint; //if(midPoint == centre) { /*This situation is good when there is increment or decrement by 1*/ var isLeft = false; if (oldBaseNumber > pageNumber) { isLeft = true; this.children[stackCount - 1].skipFlip = true; this.children.unshift(this.children.pop()); // this.contentProvider.setLoading(pageNumber, true); } else if (oldBaseNumber < pageNumber) { this.children[0].skipFlip = true; this.children.push(this.children.shift()); // this.contentProvider.setLoading(pageNumber, true); } var remainingPages = (pageCount - pageNumber); var stackDepth = (5) / pageCount; var leftDepth = stackDepth * pageNumber / 2; var rightDepth = stackDepth * remainingPages / 2; var maxDepth = (leftDepth < rightDepth ? rightDepth : leftDepth); //maxDepth = maxDepth > 5 ? 5: maxDepth; for (var _pageCount = 0; _pageCount < stackCount; _pageCount++) { var page = this.children[_pageCount];//this.getObjectByName("page"+_pageCount);//this.children[_pageCount]; var color = page.color; var oldAngle = page.angles[1]; var newAngle; var relativePageNumber = pageNumber - midPoint + _pageCount; if (isRTL) relativePageNumber = isBooklet ? this.pageCount - relativePageNumber : Math.ceil(this.pageCount / 2) - relativePageNumber - 1; var isHard = page.isHard = this.isPageHard(relativePageNumber); var oldName = page.name; //Sizing page.isEdge = false; //true; if (_pageCount == 0) { page.depth = leftDepth < depth ? depth : leftDepth; } else if (_pageCount == stackCount - 1) { page.depth = rightDepth < depth ? depth : rightDepth; } else { page.depth = depth; page.isEdge = false; } if (page.isFlipping == true) { page.depth = depth; } page.position.x = 0; var leftAngle = angleShift * _pageCount, rightAngle = 180 - angleShift * (_pageCount - midPoint) + angleShift * _pageCount; if (_pageCount < midPoint) { page.newStiffness = isHard || this.stiffness == 0 ? 0 : stiffFactor / (pageNumber / pageCount) / 4; newAngle = leftAngle; page.position.z = maxDepth - (-_pageCount + midPoint) * depth;//(pageNumber < pageCount / 2) if (isLeft == true) page.position.z -= depth; } else { newAngle = rightAngle; page.newStiffness = isHard || this.stiffness == 0 ? 0 : stiffFactor / (Math.abs(pageCount - pageNumber) / pageCount) / 4; page.position.z = (maxDepth - (-stackCount + _pageCount + midPoint + 1) * depth) - page.depth;//(pageNumber < pageCount / 2) } if (page.isFlipping == false) { if (Math.abs(oldAngle - newAngle) > 20 && page.skipFlip == false) { page.depth = depth; //we need predicted stiffness so that there is no overlap issues var predicted = page.stiffness; if (oldAngle > newAngle) {//left predicted = stiffFactor / (Math.abs(pageCount - pageNumber) / pageCount) / 4; } else {//right predicted = stiffFactor / (pageNumber / pageCount) / 4; } page.position.z += depth;//((_pageCount < midPoint) ? 0 : depth) * 2;/// 2; page.stiffness = isNaN(predicted) ? page.stiffness : predicted; page.updateAngle(true); page.targetStiffness = isHard ? 0 : (_pageCount < pageNumber) ? stiffFactor / (Math.abs(pageCount - pageNumber) / pageCount) / 4 : stiffFactor / (pageNumber / pageCount) / 4; page.targetStiffness = isHard ? 0 : (isNaN(page.targetStiffness) ? page.stiffness : page.targetStiffness); page.isFlipping = true; page.tween(oldAngle, newAngle); if (this.preFlipCallback != null) this.preFlipCallback(); } else { page.skipFlip = false; page.newStiffness = isNaN(page.newStiffness) ? 0 : page.newStiffness; if (page.angles[1] != newAngle || page.stiffness != page.newStiffness || page.depth != page.oldDepth) { page.angles[1] = page.angles[4] = newAngle; page.stiffness = page.newStiffness; page.updateAngle(true); } else { //console.log("skipped"); } } } page.visible = isBooklet ? (isRTL ? (_pageCount < midPoint || page.isFlipping) : (_pageCount >= midPoint || page.isFlipping)) : ((relativePageNumber >= 0 && relativePageNumber < pageCount) || (isBooklet && relativePageNumber == pageCount)); if (this.requestPage != null) { page.name = relativePageNumber.toString(); if (page.name != oldName) { page.textureLoaded = false; page.frontImage(defaults.textureLoadFallback); page.frontPageStamp = "-1"; page.frontTextureLoaded = false; page.thumbLoaded = false; // if (!isBooklet) { page.backImage(defaults.textureLoadFallback); page.backPageStamp = "-1"; page.backTextureLoaded = false; // } this.requestPage(); } } //if (isBooklet && _pageCount < midPoint && page.isFlipping == false) // page.visible = false; page.oldDepth = page.depth; var xPos = Math.abs(page.geometry.boundingBox.max.x) < Math.abs(page.geometry.boundingBox.min.x) ? page.geometry.boundingBox.max.x : page.geometry.boundingBox.min.x; page.position.x = (page.isEdge == true && page.isFlipping == false) ? ((_pageCount < midPoint) ? xPos : -xPos) : 0; } //$(".quick-hint").html(pageNumber); //console.log("leftDepth:" + leftDepth, "rightDepth:" + rightDepth, "midPoint:" + midPoint, "oldBaseNumber:" + oldBaseNumber, "pageNumber:" + pageNumber); this.oldBaseNumber = pageNumber; if (this.updatePageCallback != null) this.updatePageCallback(); }; //if (window.flipBook != null)flipBook.book.refresh(); //book.activePage(book.activePage()); Book.prototype.createCover = function (parameters) { parameters.width = parameters.width * 2; this.cover = new MOCKUP.BiFold(parameters); this.add(this.cover); }; Book.prototype.createStack = function (parameters) { var colors = "red,green,blue,yellow,orange,black".split(","); for (var _stackCount = 0; _stackCount < this.stackCount; _stackCount++) { parameters.angles = [, this.stackCount - _stackCount];//[1] = (this.stackCount - _stackCount); parameters.stiffness = (this.stackCount - _stackCount) / 100; var clone = new MOCKUP.BookPaper(parameters); clone.angles[1] = 180; //clone.name = "page" + _stackCount; clone.index = _stackCount; clone.updateAngle(); clone.textureReady = false; clone.textureRequested = false; this.add(clone); clone.color = colors[_stackCount]; //for (var _count = 0; _count < 4; _count++) { // clone.material.materials[_count].color = new THREE.Color(THREE.ColorKeywords[colors[_stackCount]]); //} clone.position.z = -1 * _stackCount;// * (this.mainObject.depth * 1.05); } }; Book.prototype.shininess = function (shininess) { if (shininess == null) { return this.mainObject.shininess(); } else { this.mainObject.shininess(shininess); } }; Book.prototype.bumpScale = function (bumpScale) { if (bumpScale == null) { return this.mainObject.bumpScale(); } else { this.mainObject.bumpScale(bumpScale); } }; Book.prototype.frontImage = function (frontImage) { if (frontImage == null) { return this.mainObject.frontImage(); } else { this.mainObject.frontImage(frontImage); } }; Book.prototype.backImage = function (backImage) { if (backImage == null) { return this.mainObject.backImage(); } else { this.mainObject.backImage(backImage); } }; return Book; })(MOCKUP.Bundle); MOCKUP.Book = Book; } //base object of flipbook or other trifold objects var PreviewObject = (function (_super) { function PreviewObject(parameters) { parameters = parameters || {}; //_super.call(this, parameters); this.type = "PreviewObject"; var _this = this; _this.zoomValue = 1; function resizeDelay() { setTimeout(function () { _this.resize() }, 50); } window.addEventListener("resize", resizeDelay, false); this.sound = document.createElement("audio"); this.sound.setAttribute("src", parameters.soundFile + "?ver=" + DFLIP.version); this.sound.setAttribute("type", "audio/mpeg"); this.autoPlayFunction = function () { if (_this && _this.target.autoPlay) { if (_this.target.direction == DFLIP.DIRECTION.RTL) _this.target.prev(); else _this.target.next(); } }; //this.pageMode = DFLIP.PAGE_MODE.DOUBLE; this.dispose = function () { clearInterval(this.autoPlayTimer); this.autoPlayTimer = null; this.autoPlayFunction = null; //complete any tweens left. if (this.target && this.target.children) { for (var count = 0; count < this.target.children.length; count++) { var page = this.target.children[count]; if (page && page.currentTween) page.currentTween.stop(); } } //first dispose internal objects if (this.zoomTween) { if (this.zoomTween.stop) this.zoomTween.stop(); this.zoomTween = null; } if (this.container) { if (this.container.removeClass) this.container.removeClass("df-sidemenu-open df-floating") if (this.container.info && this.container.info.remove) this.container.info.remove(); this.commentPopup.remove(); } if (this.target && this.target.dispose) this.target.dispose(); this.target = null; if (this.stage && this.stage.dispose) this.stage.dispose(); this.stage = null; //if (this.target && this.target.outlineContainer) this.target.outlineContainer.remove(); if (this.ui && this.ui.dispose) this.ui.dispose(); this.ui = null; if (this.contentProvider && this.contentProvider.dispose) this.contentProvider.dispose(); this.contentProvider = null; this.checkRequestQueue = null; window.removeEventListener("resize", resizeDelay); }; this.checkRequestQueue(); } PreviewObject.prototype = { checkRequestQueue: function () { var app = this; if (app.checkRequestQueue && window["requestAnimationFrame"]) { requestAnimationFrame(function () { if (app && app.checkRequestQueue) app.checkRequestQueue(); }) } if (app.container && app.container[0] // && app.options.isLightBox !== true && app._offsetParent !== app.container[0].offsetParent) { app._offsetParent = app.container[0].offsetParent; if (app._offsetParent !== null) { app.resize(); } utils.log("Visibility Resize Detected"); } }, start: function () { this.target.gotoPage(this.target.startPage); }, end: function () { this.target.gotoPage(this.target.endPage); }, next: function () { }, prev: function () { }, getPageTextContent: function (pageIndex) { return this.contentProvider.pdfDocument.getPage(pageIndex + 1).then(function (page) { return page.getTextContent({normalizeWhitespace: true}); }); }, calculateSize: function (containerHeight, stageWidth, maxHeight, paddingHeight, paddingWidth, isAutoHeight, pageRatio, isSingle) { var stageHeight = containerHeight; var stageInnerWidth = stageWidth - paddingWidth; var stageInnerHeight = stageHeight - paddingHeight; var autoWidth = Math.ceil(isSingle ? stageInnerWidth : stageInnerWidth / (2)); var autoHeight = autoWidth / pageRatio; // Height when page auto fits var refHeight = null; if (isAutoHeight) { //Incase the value is auto height find the autoheight for flipbook refHeight = Math.min(autoHeight, maxHeight - paddingHeight); stageHeight = refHeight; } else { refHeight = Math.min(stageInnerHeight, maxHeight - paddingHeight); } //check if book fits by width var isWide = autoHeight > refHeight; var width, height; if (isWide) { height = refHeight; width = Math.floor(height * pageRatio); } else { width = autoWidth; height = Math.ceil(autoWidth / pageRatio); } if (isAutoHeight) { stageHeight = Math.max(height + paddingHeight, 320); } return { stageHeight: stageHeight, isWide: isWide, height: height, width: width }; }, zoom: function (delta) { this.pendingZoom = true; this.zoomDelta = delta; this.resize(); if (this.ui) this.ui.update(); }, resize: function () { var _this = this; if (_this.target == null || _this.target.ui == null || _this.target.contentProvider == null || _this.target.contentProvider.viewport == null || _this.target.stage == null) return; if (this.ui && this.ui.isFullscreen == true && utils.hasFullscreenEnabled() == true && utils.getFullscreenElement() == null) { this.ui.switchFullscreen(); } //Variable Caches var target = _this.target, container = _this.container, options = _this.options, stage = target.stage, contentProvider = target.contentProvider, pageRatio = contentProvider.pageRatio, zoomViewport = contentProvider.zoomViewport, isRTL = isRTLMode(target), is3d = target.mode !== "css", isLandScape = contentProvider.pageRatio > 1, isAutoHeight = this.ui.isFullscreen == true ? false : options.height === "auto", isWide, height, width, cameraZ, fov, zoom, maxZoom, sideShift = container.hasClass("df-sidemenu-open") ? 220 : 0, isSingle = this.target.pageMode == DFLIP.PAGE_MODE.SINGLE; if (this._offsetParent === undefined) { this._offsetParent = this.container[0].offsetParent; } //checking if the responsive width according to container var containerWidth = container.width(); if (containerWidth < 400) {//rather than responsive lets use _this.container.addClass("df-xs"); } else { _this.container.removeClass("df-xs"); } var controlsHeight = container.find(".df-ui-controls").height(); var paddingTop = options.paddingTop + (options.controlsPosition == DFLIP.CONTROLSPOSITION.TOP ? controlsHeight : 0), paddingRight = options.paddingRight, paddingBottom = options.paddingBottom + (options.controlsPosition == DFLIP.CONTROLSPOSITION.BOTTOM ? controlsHeight : 0), paddingLeft = options.paddingLeft; paddingTop = isNaN(paddingTop) ? 0 : limitAt(paddingTop, 0, paddingTop), paddingBottom = isNaN(paddingBottom) ? 0 : limitAt(paddingBottom, 0, paddingBottom), paddingLeft = isNaN(paddingLeft) ? 0 : limitAt(paddingLeft, 0, paddingLeft), paddingRight = isNaN(paddingRight) ? 0 : limitAt(paddingRight, 0, paddingRight); var paddingHeight = paddingTop + paddingBottom, paddingWidth = paddingLeft + paddingRight; //containerHeight, containerWidth, controlsHeight above var stageWidth = containerWidth - sideShift; //if sideMenu for thumbnails is open? /*SIZE CALCULATION*/ //checking if the container height is more than the window height container.height(options.height); var maxHeight = $(window).height(); var containerHeight = Math.min(container.height(), maxHeight); var sizes = _this.calculateSize(containerHeight, stageWidth, maxHeight, paddingHeight, paddingWidth, isAutoHeight, pageRatio, isSingle); if (isAutoHeight) { containerHeight = stageHeight = _this.calculateSize(containerHeight, stageWidth + sideShift, maxHeight, paddingHeight, paddingWidth, isAutoHeight, pageRatio, isSingle).stageHeight; } else { containerHeight = stageHeight = sizes.stageHeight; } container.height(containerHeight);//setting twice for failsafe var stageHeight = containerHeight; var stageInnerWidth = stageWidth - paddingWidth, stageInnerHeight = stageHeight - paddingHeight; width = Math.floor(isSingle ? stageInnerWidth : stageInnerWidth / 2); height = Math.floor(width / pageRatio); //check if book fits by width isWide = height > stageInnerHeight; if (isWide) { height = stageInnerHeight; width = height * pageRatio; } /*ZOOM CALCULATION*/ //update maxZoom for current Stage Dimension maxZoom = contentProvider.maxZoom = contentProvider.zoomViewport.height / height; //set to 1 if unset initally if (_this.zoomValue == null) _this.zoomValue = 1; if (contentProvider.zoomScale == null) contentProvider.zoomScale = 1; if (_this.pendingZoom == true && _this.zoomDelta != null) { var delta = _this.zoomDelta, predictedIndex, currentMaxDimension = Math.max(height, width); _this.zoomValue = _this.zoomDelta > 0 ? _this.zoomValue * _this.options.zoomRatio : _this.zoomValue / _this.options.zoomRatio; _this.zoomValue = limitAt(_this.zoomValue, 1, maxZoom); if (_this.zoomValue == 1) { contentProvider.zoomScale = 1; } else { /* predictedIndex = height * _this.zoomValue; //zoomStops matches the contentProvider internal calcuation and prediction stops so that the texture size won't differ predictedIndex = utils.zoomStops(predictedIndex, _this.options.zoomRatio, _this.zoomDelta > 0, Math.max(width, height)); contentProvider.zoomScale = limitAt(predictedIndex / currentMaxDimension, 1, maxZoom); */ contentProvider.zoomScale = limitAt(_this.zoomValue, 1, maxZoom); } } zoom = contentProvider.zoomScale; //Update Image CacheSize Index contentProvider.checkViewportSize(width, height, zoom); if (contentProvider.contentSourceType == SOURCE_TYPE.PDF) { //recalculation is required for pixel shift issue only if the source is PDF width = contentProvider.imageViewport.width / zoom; height = contentProvider.imageViewport.height / zoom; } if (contentProvider.zoomScale != 1) { this.target.container.addClass("df-zoom-enabled"); } var zoomWidth = target.zoomWidth = Math.floor(width * zoom), zoomHeight = target.zoomHeight = Math.floor(height * zoom); var zoomFullWidth = zoomWidth * 2; if (is3d) { //zoomHeight is equal to target.height (normally 300) so relative calculation is required var proportion = zoomHeight / target.height, aspect = stageWidth / stageHeight; var relativeHeight = zoom * (height + paddingHeight) / proportion, relativeWidth = zoom * (width * (isSingle ? 1 : 2) + paddingWidth) / proportion; var focusSize = isWide ? relativeHeight : relativeWidth / aspect; stage.resizeCanvas(stageWidth, stageHeight); cameraZ = 1 / (2 * Math.tan(Math.PI * stage.camera.fov * 0.5 / 180) / (focusSize / zoom)) + 2.2; stage.camera.updateProjectionMatrix(); stage.renderRequestPending = true; //pixel value to stage position value var shift = (paddingTop - paddingBottom) * (target.height / height) / zoom / 2; //put a check if the existing gap is enough // _this.target.position.y = shift; // stage.cssScene.position.y = _this.target.position.y; var _reset = contentProvider.zoomScale == 1; if (stage.camera.position.z !== cameraZ && _this.pendingZoom == true) { //avoid recreating the tween if the target is same as before if (_this.zoomTween != null) _this.zoomTween.stop(); _this.zoomTween = new TWEEN.Tween({ campos: stage.camera.position.z, otx: stage.orbitControl.target.x, oty: stage.orbitControl.target.y, otz: stage.orbitControl.target.z }).delay(0) .to({ campos: cameraZ, otx: 0, oty: shift, otz: 0 }, 100) .onUpdate(function () { stage.camera.position.z = this.campos; if (_reset) { stage.camera.position.y = this.oty; stage.orbitControl.target = new THREE.Vector3(this.otx, this.oty, this.otz); } stage.orbitControl.update(); }).easing(TWEEN.Easing.Linear.None) .onComplete(function () { stage.camera.position.z = cameraZ; if (contentProvider.zoomScale == 1) { stage.camera.position.set(0, shift, cameraZ); stage.orbitControl.target = new THREE.Vector3(0, shift, 0); } stage.orbitControl.update(); }) .start(); } else { if (contentProvider.zoomScale == 1) { stage.camera.position.set(0, shift, cameraZ); stage.orbitControl.target = new THREE.Vector3(0, shift, 0); } /*else { stage.camera.position.z = cameraZ; }*/ stage.orbitControl.update(); } stage.orbitControl.update(); stage.orbitControl.mouseButtons.ORBIT = zoom != 1 ? -1 : THREE.MOUSE.RIGHT; stage.orbitControl.mouseButtons.PAN = zoom != 1 ? THREE.MOUSE.LEFT : -1; } else { target.pageWidth = Math.round(width); target.fullWidth = target.pageWidth * 2; target.height = Math.round(height); var shiftHeight = target.shiftHeight = Math.round(limitAt((zoomHeight - stageHeight + paddingHeight) / 2, 0, zoomHeight)), shiftWidth = target.shiftWidth = Math.round(limitAt((zoomFullWidth - stageWidth + paddingWidth) / 2, 0, zoomFullWidth)); if (zoom == 1) { target.left = 0; target.top = 0; } target.stage.css({ top: -shiftHeight, bottom: -shiftHeight, right: -shiftWidth + (isRTL ? sideShift : 0), left: -shiftWidth + (isRTL ? 0 : sideShift), paddingTop: paddingTop, paddingRight: paddingRight, paddingBottom: paddingBottom, paddingLeft: paddingLeft, transform: "translate3d(" + target.left + "px," + target.top + "px,0)" }); target.stageHeight = stage.height(); target.wrapper.css({ width: zoomFullWidth, height: zoomHeight, marginTop: (containerHeight - zoomHeight - paddingHeight) > 0 ? (containerHeight - paddingHeight - zoomHeight) / 2 : 0 }); var wrapperSize = Math.floor((distOrigin(width, height)) * zoom); target.stage.find(".df-page-wrapper").width(wrapperSize).height(wrapperSize); target.stage.find(".df-book-page, .df-page-front , .df-page-back, .df-page-fold-inner-shadow").height(zoomHeight).width(zoomWidth); } _this.checkCenter({type: "resize"}); if (contentProvider.zoomScale == 1) { this.target.container.removeClass("df-zoom-enabled"); } if (target.thumblist) { target.thumblist.reset($(target.thumblist.container).height()); } _this.pendingZoom = false; }, playSound: function () { try { if (this.options && this.options.soundEnable == true) { this.sound.currentTime = 0; this.sound.play(); } } catch (error) { } }, setPageMode: function (isSingle) { if (isSingle == true) { this.ui.pageMode.addClass(this.options.icons['doublepage']); this.ui.pageMode.html("<span>" + this.options.text.doublePageMode + "</span>"); this.ui.pageMode.attr("title", this.options.text.doublePageMode); this.target.pageMode = DFLIP.PAGE_MODE.SINGLE; } else { this.ui.pageMode.removeClass(this.options.icons['doublepage']); this.ui.pageMode.html("<span>" + this.options.text.singlePageMode + "</span>"); this.ui.pageMode.attr("title", this.options.text.singlePageMode); this.target.pageMode = DFLIP.PAGE_MODE.DOUBLE; } if (this.target && this.target.singlePageMode == DFLIP.SINGLE_PAGE_MODE.BOOKLET) { this.target.reset(); } this.resize(); }, setAutoPlay: function (isPlay) { if (this.options.autoPlay) { isPlay = isPlay == true; var text = isPlay ? this.options.text.pause : this.options.text.play; this.ui.play.toggleClass(this.options.icons['pause'], isPlay); this.ui.play.html("<span>" + text + "</span>"); this.ui.play.attr("title", text); clearInterval(this.autoPlayTimer); if (isPlay) { this.autoPlayTimer = setInterval(this.autoPlayFunction, this.options.autoPlayDuration); } this.target.autoPlay = isPlay; } }, height: function (height) { if (height == null) { return this.container.height(); } else { this.options.height = height; this.container.height(height); this.resize(); } }, /** *checks whether the book is closed and needs to be centered */ checkCenter: function (options) { options = options == null ? {} : options; this.centerType = this.centerType || "start"; var target = this.target; var singleShift = 0, left = 0, right = 0; var basePage = utils.getBasePage(target._activePage); var isEven = target._activePage % 2 == 0; var isRTL = target.direction == DFLIP.DIRECTION.RTL; var isSingle = target.pageMode == DFLIP.PAGE_MODE.SINGLE, isBooklet = isSingle && target.singlePageMode == DFLIP.SINGLE_PAGE_MODE.BOOKLET; var stageWidth = target.stage.width(), width; if (target.mode == 'css') { width = target.wrapper.width(); //calculate the excess shift required for correction in case width is too small singleShift = Math.max((width - stageWidth) / 2, 0); left = -width / 4; right = width / 4; if (basePage == 0 || isBooklet) { target.wrapper.css({ left: isSingle ? isRTL ? right - singleShift : left - singleShift : isRTL ? right : left }); target.shadow.css({width: '50%', left: isRTL ? 0 : '50%', transitionDelay: ''}); } else if (basePage == target.pageCount) { target.wrapper.css({ left: isSingle ? isRTL ? left - singleShift : right - singleShift : isRTL ? left : right }); target.shadow.css({width: '50%', left: isRTL ? '50%' : 0, transitionDelay: ''}); } else { target.wrapper.css({ left: isSingle ? isRTL ? (isEven ? left - singleShift : right - singleShift) : (isEven ? right - singleShift : left - singleShift) : 0 }); target.shadow.css({ width: '100%', left: 0, transitionDelay: (parseInt(target.duration, 10) + 50) + 'ms' }); } target.wrapper.css({transition: options.type == "resize" ? "none" : ""}); } else if (target.stage != null) { var init = target.position.x, end; singleShift = target.width / 4; width = target.width; left = -width / 2; right = width / 2; if (basePage == 0 || isBooklet) { end = isRTL ? right : left; } else if (basePage == target.pageCount) { end = isRTL ? left : right; } else { end = isSingle ? isRTL ? (isEven ? left : right) : (isEven ? right : left) : 0; } //create a centertween if (end !== this.centerEnd) { //avoid recreating the tween if the target is same as before this.centerTween = new TWEEN.Tween({x: init}).delay(0) .to({x: end}, target.duration) .onUpdate(function () { target.position.x = this.x; target.stage.cssScene.position.x = this.x; }).easing(target.ease) .start(); this.centerEnd = end; } } // log("checkcenter at : " + left); }, width: function (width) { if (width == null) { return this.container.width(); } else { this.options.width = width; this.container.width(width); this.resize(); } } }; return PreviewObject; })({}); DFLIP.PreviewObject = PreviewObject; //contentprovider that handles the source of book var ContentProvider = (function (_super) { __extends(ContentProvider, _super); function ContentProvider(contentSource, callback, parameters, flipbook) { parameters = parameters || {}; var _this = this; _this.contentRawSource = contentSource || [defaults.textureLoadFallback]; _this.contentSource = _this.contentRawSource; _this.contentSourceType = null; _this.minDimension = parameters.minTextureSize || 256; _this.maxDimension = parameters.maxTextureSize || 2048; _this.pdfRenderQuality = parameters.pdfRenderQuality || DFLIP.defaults.pdfRenderQuality; _this.flipbook = flipbook; _this.waitPeriod = 50; _this.maxLength = 297; _this.enableDebug = false; _this.zoomScale = 1; _this.maxZoom = 2; _this.options = parameters; _this.outline = parameters.outline; _this.links = parameters.links; _this.html = parameters.html; _this.isCrossOrigin = parameters.isCrossOrigin; _this.normalViewport = { height: 297, width: 210, scale: 1 }; _this.viewport = { height: 297, width: 210, scale: 1 }; _this.imageViewport = { height: 297, width: 210, scale: 1 }; _this.bookSize = { height: 297, width: 210 }; _this.zoomViewport = { height: 297, width: 210 }; _this.thumbsize = 128; _this.cacheIndex = 256; //index of bigger dimension height or width _this.cache = []; _this.pageRatio = parameters.pageRatio || _this.viewport.width / _this.viewport.height; //texture load control so that it wont delay the transition _this.textureLoadTimeOut = null; _this.type = "TextureLibrary"; if (Array === _this.contentSource.constructor || Array.isArray(_this.contentSource) || _this.contentSource instanceof Array) { //case of images and html content _this.contentSourceType = SOURCE_TYPE.IMAGE; _this.pageCount = _this.contentSource.length; //_this.setLoading(1, true); for (var _correct = 0; _correct < _this.contentSource.length; _correct++) { _this.contentSource[_correct] = utils.httpsCorrection(_this.contentSource[_correct].toString()); } // Make in memory copy of image to avoid css issues $("<img/>") .attr("src", _this.contentSource[0]) .on('load', (function () { _this.viewport.height = this.height; _this.viewport.width = this.width; _this.pageRatio = _this.viewport.width / _this.viewport.height; _this.bookSize = { width: (_this.pageRatio > 1 ? 1 : _this.pageRatio) * _this.maxLength, height: _this.maxLength / (_this.pageRatio < 1 ? 1 : _this.pageRatio) }; _this.zoomViewport = { width: (_this.pageRatio > 1 ? 1 : _this.pageRatio) * _this.maxDimension, height: _this.maxDimension / (_this.pageRatio < 1 ? 1 : _this.pageRatio) }; _this.linkService = new PDFLinkService(); $(this).off(); if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL) { _this.pageCount = _this.contentSource.length * 2 - 2; if (_this.options.webgl == true) _this.requiresImageTextureScaling = true; } if (callback != null) { callback(_this); callback = null; } //_this.setLoading(1); //console.log(_this.zoomViewport); log(this.height + ":" + this.width); //pic_real_width = this.width; // Note: $(this).width() will not //pic_real_height = this.height; // work for in memory images. //moved to set target function //_this. // (); })); } else if (typeof _this.contentSource == 'string' || _this.contentSource instanceof String) { //case of link to pdf file //region Check if file isbase64 or normal var checkSource = function () { if (_this.contentSource.indexOf(".base64") > 1) { $.ajax({ url: _this.contentSource, xhrFields: { onprogress: function (e) { if (e.lengthComputable) { var percentage = 100 * e.loaded / e.total; _this.updateInfo(_this.options.text.loading + " PDF " + percentage.toString().split(".")[0] + "% ..."); } } }, success: function (response) { _this.options.docParameters = {data: atob(response)}; processSource(); } }); } else { processSource(); } }; //endregion var processSource = function () { if (_this) { //configurePDFJS(PDFJS); pdfjsLib.GlobalWorkerOptions.workerSrc = defaults.pdfjsWorkerSrc; _this.contentSourceType = SOURCE_TYPE.PDF; // PDFJS.disableAutoFetch = true; // PDFJS.disableStream = true; var disableFontFace = _this.options.disableFontFace; if (isSafari || isIOS || _this.options.disableFontFace == true) { // disableFontFace is no longer proper in PDF.js // disableFontFace = isSafari || isIOS || _this.options.disableFontFace == true; } // PDFJS.imageResourcesPath = defaults.imageResourcesPath; // PDFJS.cMapUrl = defaults.cMapUrl; // PDFJS.cMapPacked = !0; // PDFJS.externalLinkTarget = _this.options.linkTarget; var loading = _this.loading = pdfjsLib.getDocument(_this.options.docParameters ? _this.options.docParameters : { url: utils.httpsCorrection(contentSource), rangeChunkSize: isNaN(_this.options.rangeChunkSize) ? 524288 : _this.options.rangeChunkSize, cMapUrl: defaults.cMapUrl, cMapPacked: true, imageResourcesPath: defaults.imageResourcesPath, disableAutoFetch: true, disableStream: true, disableRange: _this.options.disableRange === true, disableFontFace: disableFontFace, }); loading.promise.then(function sourceLoaded(pdf) { _this.pdfDocument = pdf; pdf.getPage(1).then(function (page) { _this.normalViewport = page.getViewport({scale: 1}); _this.viewport = page.getViewport({scale: 1}); _this.viewport.height = _this.viewport.height / 10; _this.viewport.width = _this.viewport.width / 10; _this.pageRatio = _this.viewport.width / _this.viewport.height; _this.bookSize = { width: (_this.pageRatio > 1 ? 1 : _this.pageRatio) * _this.maxLength, height: _this.maxLength / (_this.pageRatio < 1 ? 1 : _this.pageRatio) }; _this.zoomViewport = { width: (_this.pageRatio > 1 ? 1 : _this.pageRatio) * _this.maxDimension, height: _this.maxDimension / (_this.pageRatio < 1 ? 1 : _this.pageRatio) }; _this.refPage = page; //console.log(_this.zoomViewport); //check if intenal pages are of double sizes. if (pdf.numPages > 1) { pdf.getPage(2).then(function (page) { if (_this.options.pageSize == DFLIP.PAGE_SIZE.AUTO) { var _viewport = page.getViewport({scale: 1}); //Update: doing width check gives false alarm if the internal pages are of different sizes yet follow same aspect ratio //if (_viewport.width > _this.normalViewport.width * 1.5) { var _pageRatio = _viewport.width / _viewport.height; if (_pageRatio > _this.pageRatio * 1.5) { _this.options.pageSize = DFLIP.PAGE_SIZE.DOUBLEINTERNAL; _this.pageCount = pdf.numPages * 2 - 2; } else { _this.options.pageSize = DFLIP.PAGE_SIZE.SINGLE; } } if (callback != null) { callback(_this); callback = null; } }); } else { if (callback != null) { callback(_this); callback = null; } } }); _this.linkService = new PDFLinkService(); _this.linkService.setDocument(pdf, null); //moved to set target function //_this.initThumbs(); _this.pageCount = pdf.numPages; _this.contentSource = pdf; }, function loadingError(error) { if (_this) { var cors = "", tmp = document.createElement('a'); tmp.href = _this.contentSource; if (tmp.hostname !== window.location.hostname) cors = "CROSS ORIGIN!! "; _this.updateInfo(cors + "Cannot access file! " + _this.contentSource); } }); loading.onProgress = function getDocumentProgress(progressData) { if (_this) { var percentage = 100 * progressData.loaded / progressData.total; if (isNaN(percentage)) { if (progressData && progressData.loaded) { _this.updateInfo(_this.options.text.loading + " PDF " + (Math.ceil(progressData.loaded / 10000) / 100).toString() + "MB ..."); } else { _this.updateInfo(_this.options.text.loading + " PDF ..."); } } else { _this.updateInfo(_this.options.text.loading + " PDF " + percentage.toString().split(".")[0] + "% ..."); } } }; } }; var checkCORS = function () { if (_this) { if (defaults.pdfjsWorkerSrc.indexOf("?ver") < 0) defaults.pdfjsWorkerSrc += "?ver=" + DFLIP.version; _this.updateInfo(_this.options.text.loading + " PDF Worker ..."); var tmp = document.createElement('a'); tmp.href = defaults.pdfjsWorkerSrc; if (tmp.hostname !== window.location.hostname) { _this.updateInfo(_this.options.text.loading + " PDF Worker CORS ..."); $.ajax({ url: defaults.pdfjsWorkerSrc, cache: true, success: function (data) { defaults.pdfjsWorkerSrc = DFLIP.createObjectURL(data, "text/javascript"); checkSource(); } }); } else { checkSource(); } } }; if (window.pdfjsLib == null) { if (_this) { _this.updateInfo(_this.options.text.loading + " PDF Service ..."); getScript(defaults.pdfjsSrc + "?ver=" + DFLIP.version, function () { if (typeof define === 'function' && define.amd && window.requirejs) { _this.updateInfo(_this.options.text.loading + " PDF Service (require) ..."); require.config({paths: {'pdfjs-dist/build/pdf.worker': defaults.pdfjsWorkerSrc.replace(".js", "")}}); require(['pdfjs-dist/build/pdf'], function (pdfjsLib) { window.pdfjsLib = pdfjsLib; checkCORS(); }); } else if (typeof exports === "object" && exports["pdfjs-dist/build/pdf"] != null) { window.pdfjsLib = exports["pdfjs-dist/build/pdf"]; checkCORS(); } else { checkCORS(); } }, function () { _this.updateInfo("Unable to load PDF service.."); }); } } else { checkSource(); } } else { console.error("Unknown source type. Please check documentation for help"); } this.dispose = function () { if (_this.loading && _this.loading.destroy) { _this.loading.destroy(); } _this.loading = null; if (_this.textureLoadTimeOut) { clearTimeout(_this.textureLoadTimeOut); _this.textureLoadTimeOut = null; } if (this.targetObject) { if (this.targetObject.thumbContainer && this.targetObject.thumbContainer.remove) this.targetObject.thumbContainer.remove(); if (this.targetObject.outlineContainer && this.targetObject.outlineContainer.remove) this.targetObject.outlineContainer.remove(); if (this.targetObject.dispose) this.targetObject.dispose(); this.targetObject.processPage = null; this.targetObject.requestPage = null; if (this.targetObject.container && this.targetObject.container.off) this.targetObject.container.off(); } if (this.pdfDocument && this.pdfDocument.destroy) this.pdfDocument.destroy(); if (this.linkService && this.linkService.dispose) this.linkService.dispose(); if (this.outlineViewer && this.outlineViewer.dispose) this.outlineViewer.dispose(); if (this.thumblist && this.thumblist.dispose) { this.thumblist.review = null; this.thumblist.dispose(); } this.activeThumb = null; this.targetObject = null; this.pdfDocument = null; this.linkService = null; this.outlineViewer = null; this.thumblist = null; _this = null; }; return this; } ContentProvider.prototype.updateInfo = function (info) { if (this.flipbook && this.flipbook.updateInfo) { this.flipbook.updateInfo(info); } }; ContentProvider.prototype.initThumbs = function () { var _this = this; if (_this.cache[_this.thumbsize] == null) _this.cache[_this.thumbsize] = []; var thumbLoadTimeOut; var review = function () { clearTimeout(thumbLoadTimeOut); thumbLoadTimeOut = setTimeout(function () { thumbLoadTimeOut = setTimeout(reviewThumbs, _this.waitPeriod / 2); }, _this.waitPeriod); }; var reviewThumbs = function () { var requestCount = 0; if (Date.now() - _this.thumblist.lastScrolled < 100) { requestCount = 1; } else { _this.targetObject.container.find(".df-thumb-container .df-vrow").each(function () { var thumb = $(this); if (!thumb.hasClass("df-thumb-loaded")) { requestCount++; var id = $(this).attr("id").replace("df-thumb", ""); _this.getPage(id, review, true); thumb.addClass("df-thumb-loaded"); return false; } }); if (requestCount == 0) { clearTimeout(thumbLoadTimeOut); } } if (requestCount > 0) { review(); } //move to thumb if thumb is on if (_this.activeThumb != _this.targetObject._activePage) { var thumbVisible = _this.targetObject.thumbContainer != null && _this.targetObject.thumbContainer.hasClass("df-sidemenu-visible"); if (thumbVisible) { var wrapper = _this.thumblist.container; var cScroll = wrapper.scrollTop, cHeight = wrapper.getBoundingClientRect().height; var thumb = _this.targetObject.thumbContainer.find("#df-thumb" + _this.targetObject._activePage); if (thumb.length > 0) {//TODO direct jumps won't work.. _this.targetObject.thumbContainer.find(".df-selected").removeClass("df-selected"); thumb.addClass("df-selected"); //js calculation thumb = thumb[0]; //updated with custmscrollinto view since inbuilt causes page movement if (cScroll + cHeight < thumb.offsetTop + thumb.scrollHeight) utils.scrollIntoView(thumb, null, false); else if (cScroll > thumb.offsetTop) utils.scrollIntoView(thumb); _this.activeThumb = _this.targetObject._activePage; } else { $(wrapper).scrollTop(_this.targetObject._activePage * 124); review(); } } } }; _this.thumblist = _this.targetObject.thumblist = new ThumbList({ //w: 128 * _this.viewport.width/_this.viewport.height, h: 500, addFn: function (row) { }, scrollFn: review, itemHeight: 128, totalRows: _this.pageCount, generatorFn: function (row) { var el = document.createElement("div"); var pageNumber = row + 1; el.id = "df-thumb" + pageNumber; var elText = document.createElement("div"); elText.innerHTML = pageNumber; el.appendChild(elText); //el.style.position = "absolute"; //el.callback = function_this.getPage(pageNumber,null,true); return el; } }); _this.thumblist.lastScrolled = Date.now(); _this.thumblist.review = review; review(); //_this.thumblist.container.classList.add('thumb-container'); var thumbContainer = $('<div>').addClass("df-thumb-container df-sidemenu-visible df-sidemenu"); thumbContainer.append($(_this.thumblist.container).addClass("df-thumb-wrapper")); _this.targetObject.thumbContainer = thumbContainer; _this.targetObject.container.append(thumbContainer); var sideMenuClose = $(html.div, { class: "df-ui-btn df-ui-sidemenu-close ti-close" }); thumbContainer.append(sideMenuClose); _this.thumblist.reset($(_this.thumblist.container).height()); _this.targetObject.container.on('click', '.df-thumb-container .df-vrow', function (e) { e.stopPropagation(); var id = $(this).attr("id").replace("df-thumb", ""); _this.targetObject.gotoPage(parseInt(id, 10)); }); }; ContentProvider.prototype.initOutline = function () { var _this = this; var outlineContainer = $('<div>').addClass("df-outline-container df-sidemenu"); var outlineWrapper = $('<div>').addClass("df-outline-wrapper"); var sideMenuClose = $(html.div, { class: "df-ui-btn df-ui-sidemenu-close ti-close" }); outlineContainer.append(sideMenuClose).append(outlineWrapper); _this.targetObject.container.append(outlineContainer); _this.targetObject.outlineContainer = outlineContainer; _this.outlineViewer = new BookMarkViewer({ container: outlineWrapper[0], linkService: _this.linkService, outlineItemClass: "df-outline-item", outlineToggleClass: "df-outline-toggle", outlineToggleHiddenClass: "df-outlines-hidden" }); function processOutline(outline) { if (_this.options.overwritePDFOutline == true) { outline = []; } outline = outline || []; if (_this.outline) { for (var count = 0; count < _this.outline.length; count++) { _this.outline[count].custom = true; if (outline) outline.push(_this.outline[count]); } /* _this.outline.forEach(function(v) { //v.custom = true; this.push(v); }, this); outline.push(_this.outline)*/ } if (outline.length === 0 && _this.targetObject.ui.outline != null) { _this.targetObject.ui.outline.hide(); } else { if (_this.options.autoEnableOutline == true) { _this.targetObject.ui.outline.trigger("click"); } } _this.outlineViewer.render({outline: outline}); } if (_this.pdfDocument) { _this.pdfDocument.getOutline().then(function (outline) { processOutline(outline); }); } else { processOutline([]); } if (_this.options.autoEnableThumbnail == true) { _this.targetObject.ui.thumbnail.trigger("click"); } }; ContentProvider.prototype.checkViewportSize = function (width, height, zoom) { var _this = this; var target = _this.targetObject; var zoomWidth = width * zoom, zoomHeight = height * zoom; var oldCacheSize = _this.cacheIndex; /* var height = target.mode == "css" ? (target.container.height() - (target.stage.innerWidth() - target.stage.width()) ) : target.stage.height(); var width = height * _this.normalViewport.width / _this.normalViewport.height;*/ //var zoom = _this.zoomScale != 1; if (_this.contentSourceType == SOURCE_TYPE.PDF) { /* _this.viewport.height = height; _this.viewport.width = width;*/ _this.cacheIndex = Math.ceil(Math.max(zoomWidth, zoomHeight)); // if (zoom !== 1) { _this.cacheIndex = Math.floor(Math.max(zoomWidth, zoomHeight));// * _this.zoomScale;//nearestPowerOfTwo(Math.max(_this.viewport.width,_this.viewport.height)); // _this.cacheIndex = Math.floor(utils.zoomStops(Math.max(zoomWidth, zoomHeight), _this.options.zoomRatio, oldCacheSize < _this.cacheIndex, Math.max(width, height))); // } _this.cacheIndex = limitAt(_this.cacheIndex * defaults.pixelRatio, _this.minDimension, _this.maxDimension); //removed to force internal page size fit incase the internal pages are of different sizes. // _this.cacheScale = _this.cacheIndex / Math.max(_this.normalViewport.width, _this.normalViewport.height); if (_this.cache[_this.cacheIndex] == null) _this.cache[_this.cacheIndex] = []; if (oldCacheSize !== _this.cacheIndex) { for (var pageCount = 0; pageCount < target.children.length; pageCount++) { var page = target.children[pageCount]; //page.name = '-2'; } target.refresh(); } //if(zoom !==1){ // zoomHeight = height> width ? _this.cacheIndex : _this.cacheIndex * _this.pageRatio; //} _this.imageViewport = _this.refPage.getViewport({scale: zoomHeight / _this.normalViewport.height}); _this.viewport = (target.mode == "css") ? _this.imageViewport : _this.refPage.getViewport({scale: _this.bookSize.height / _this.normalViewport.height}); log(_this.cacheIndex); _this.annotedPage = undefined; _this.review(); //_this.zoomScale = (zoom == true) ? _this.normalViewport.height * _this.viewport.scale / _this.viewport.height : 1; } else { if (_this.cache[_this.cacheIndex] == null) _this.cache[_this.cacheIndex] = []; /* _this.cacheIndex = _this.zoomScale == 1 ? limitAt(_this.cacheIndex, _this.minDimension, _this.maxDimension) : _this.maxDimension;*/ //_this.zoomScale = (zoom == true) ? _this.zoomViewport.height / height : 1; } //_this.zoomScale = (zoom == true) ? _this.zoomViewport.height / height : 1; }; ContentProvider.prototype.getCache = function (index, isThumb) { return (isThumb == true) ? this.cache[this.thumbsize] == null ? null : this.cache[this.thumbsize][index] : this.cache[this.cacheIndex] == null ? null : this.cache[this.cacheIndex][index]; }; ContentProvider.prototype.setCache = function (index, src, isThumb, cacheIndexSize) { if (isThumb == true) { if (this.cache[this.thumbsize] != null) this.cache[this.thumbsize][index] = src; } else { var cacheIndex = cacheIndexSize == null ? this.cacheIndex : cacheIndexSize; if (this.cache[cacheIndex] != null) this.cache[cacheIndex][index] = src; } }; ContentProvider.prototype.setTarget = function (targetObject) { var _this = this; if (targetObject == null) { return this.targetObject; } else { this.targetObject = targetObject; targetObject.contentProvider = this; targetObject.container.removeClass("df-loading df-init"); //_this.initThumbs(); if (_this.linkService != null) { _this.linkService.setViewer(targetObject); _this.initOutline(); } targetObject.processPage = function (pageNumber, callback) { if (pageNumber > 0 && pageNumber <= _this.pageCount) { //log("Loading page :" + pageNumber); _this.getPage(pageNumber, callback); } else { _this.setPage(pageNumber, defaults.textureLoadFallback, callback); //log("Invalid PageNumber :" + pageNumber); } }; targetObject.requestPage = function () { _this.review("Request"); }; if (targetObject.resize != null) targetObject.resize(); } }; ContentProvider.prototype.review = function (message) { var _this = this; message = message || "timer review"; clearTimeout(_this.textureLoadTimeOut); _this.textureLoadTimeOut = setTimeout(function () { _this.textureLoadTimeOut = setTimeout(_this.reviewPages, _this.waitPeriod / 2, _this, message); }, _this.waitPeriod); }; ContentProvider.prototype.reviewPages = function (_this, message) { _this = _this || this; var target = _this.targetObject; if (target == null) return; var isBooklet = isBookletMode(target); if (message != null) log(message); var requiresRevisit = false; var pageCount, page; for (pageCount = 0; pageCount < _this.targetObject.children.length; pageCount++) { page = target.children[pageCount]; if (page.isFlipping == true) { //requires revisit requiresRevisit = true; break; } } if (requiresRevisit == false) { var pageLength = target.children.length > 3 ? 3 : target.children.length; var midPoint = pageLength / 2; var basePage = isBooklet ? target._activePage : getBasePage(target._activePage); _this.baseNumber = basePage; if (_this.zoomScale > 1) { pageLength = 1; } for (pageCount = 0; pageCount < pageLength; pageCount++) { var dividend = Math.floor(pageCount / 2); var diff = pageCount % 2 == 0 ? -dividend * (isBooklet ? 1 : 2) : (dividend == 0 ? 1 : dividend) * (isBooklet ? 1 : 2); var frontPageNumber = basePage + diff, backPageNumber = basePage + diff + 1; var page1 = target.getPageByNumber(frontPageNumber), page2 = target.getPageByNumber(backPageNumber), reqFrontPageStamp = frontPageNumber + "|" + _this.cacheIndex, reqBackPageStamp = backPageNumber + "|" + _this.cacheIndex; var requestCount = 0; if (page1 != null && page1.frontPageStamp != reqFrontPageStamp && page1.visible == true) { page1.frontTextureLoaded = false; target.processPage(frontPageNumber, function () { _this.review("Batch Call"); }); page1.frontPageStamp = reqFrontPageStamp; requestCount++; } if (page2 != null && page2.backPageStamp != reqBackPageStamp && page2.visible == true && !isBooklet) { page2.backTextureLoaded = false; target.processPage(backPageNumber, function () { _this.review("Batch Call"); }); page2.backPageStamp = reqBackPageStamp; requestCount++; } //diff is 0 only at the open pages if (diff == 0 && _this.annotedPage !== basePage) {// && target.mode !== "css") { _this.getAnnotations(frontPageNumber); if (!isBooklet) _this.getAnnotations(backPageNumber); _this.annotedPage = basePage; } if (requestCount > 0) { break; } } if (requestCount == 0) { if (target.mode !== "css") { _this.setLoading(basePage); } else { // _this.setLoading(basePage); // _this.setLoading(basePage + 1); } } } else { _this.review("Revisit request"); if (_this.annotedPage != null && target.mode !== "css") { var baseActive = getBasePage(target._activePage); $(target.getContentLayer(baseActive)).html(""); $(target.getContentLayer(baseActive + 1)).html(""); _this.annotedPage = null; } } }; ContentProvider.prototype.getPage = function (pageNumber, callbackFunction, isThumb) { var _this = this; pageNumber = parseInt(pageNumber, 10); var _pageNumber = pageNumber; var source = _this.contentSource; if (pageNumber <= 0 && pageNumber >= _this.pageCount) { _this.setPage(pageNumber, defaults.textureLoadFallback, callbackFunction, isThumb); } else { if (_this.contentSourceType == SOURCE_TYPE.PDF) { if (_this.getCache(pageNumber, isThumb) != null) { _this.setPage(pageNumber, _this.getCache(pageNumber, isThumb), callbackFunction, isThumb); log("Page " + pageNumber + " loaded from cache"); } else { if (isThumb !== true) _this.setLoading(pageNumber, true); if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 2) { _pageNumber = Math.ceil((pageNumber - 1) / 2) + 1; } source.getPage(_pageNumber, isThumb).then(function (page) { renderPage(page, pageNumber, callbackFunction, isThumb); }); } } else if (_this.contentSourceType == SOURCE_TYPE.IMAGE || _this.contentSourceType == SOURCE_TYPE.HTML) { if (_this.getCache(pageNumber, isThumb) != null) { _this.setPage(pageNumber, _this.getCache(pageNumber, isThumb), callbackFunction, isThumb); log("Page " + pageNumber + " loaded from cache"); } else { if (isThumb !== true) _this.setLoading(pageNumber, true); if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 2) { _pageNumber = Math.ceil((pageNumber - 1) / 2) + 1; } //if (_this.isCrossOrigin == null) { // // _this.setCache(pageNumber, source[_pageNumber - 1], isThumb, _this.cacheIndex); // _this.setPage(pageNumber, source[_pageNumber - 1], callbackFunction, isThumb); // // if (callbackFunction != null) callbackFunction(); // //} else { loadImagejQuery(source[_pageNumber - 1], function (src) { _this.setCache(pageNumber, src, isThumb, _this.cacheIndex); _this.setPage(pageNumber, src, callbackFunction, isThumb); if (callbackFunction != null) callbackFunction(); }, _this.isCrossOrigin); //} } //_this.setPage(pageNumber, source[pageNumber - 1], callbackFunction, isThumb); } } function loadImage(src, callback, isCrossOrigin) { var img = new Image; img.crossOrigin = "Anonymous"; img.onload = function () { if (isCrossOrigin == true) { var canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"); canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); //localStorage.setItem( "savedImageData", canvas.toDataURL("image/png") ); if (defaults.canvasToBlob == true) { canvas.toBlob(function (blob) { var src = DFLIP.createObjectURL(blob, "image/jpeg"); if (callback != null) callback(src); }, "image/jpeg", 0.85) } else { if (callback != null) callback(canvas); } } else { if (callback != null) callback(src); } //$(this).off(); img.onload = null; img = null; }; img.src = src; // make sure the load event fires for cached images too if (img.complete || img.complete === undefined) { img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; img.src = src; } } function loadImagejQuery(src, callback, isCrossOrigin) { $("<img/>") .attr("src", src) .on('load', (function () { $(this).off(); if (callback != null) { callback(src); // callback = null; } //_this.setLoading(1); //console.log(_this.zoomViewport); log(this.height + ":" + this.width); //pic_real_width = this.width; // Note: $(this).width() will not //pic_real_height = this.height; // work for in memory images. //moved to set target function //_this. // (); })); } function renderPage(page, pageNumber, callbackFunction, isThumb) { var forceFit = _this.options.forceFit; var isDoublePage = _this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 1 && pageNumber < _this.pageCount; var widthFix = isDoublePage && forceFit ? 2 : 1; /* var heightScale = _this.pageRatio < 1 ? _this.cacheScale : _this.cacheScale / _this.pageRatio;*/ //_this.cacheScale = _this.cacheIndex / Math.max(_this.normalViewport.width, _this.normalViewport.height); //scales are calculated based on perpage in case per page fitting is required. var viewport = forceFit ? page.getViewport({scale: 1}) : _this.normalViewport; var scale = _this.cacheIndex / Math.max(viewport.width / widthFix, viewport.height);//heightScale /_this.normalViewport.height; if (_this.webgl == true) { scale = nearestPowerOfTwo(_this.cacheIndex) / (_this.pageRatio > 1 ? viewport.width / widthFix : viewport.height); } var canvas = document.createElement('canvas'); var start = performance.now(); var requestedCacheSize = _this.cacheIndex; var context = canvas.getContext('2d'); // scale = scale * defaults.pixelRatio; if (isThumb == true) { scale = _this.thumbsize / _this.normalViewport.height; } canvas.height = Math.round(viewport.height * scale); //causes fluctuation in value like 22.99999 as 22 canvas.width = Math.round(viewport.width / widthFix * scale); if (_this.targetObject.mode == 'css' && Math.abs(_this.targetObject.zoomHeight - canvas.height) < 2) { canvas.height = _this.targetObject.zoomHeight + 0; //causes fluctuation in value like 22.99999 as 22 canvas.width = _this.targetObject.zoomWidth + 0; } viewport = page.getViewport({scale: scale}); log("rendering " + pageNumber + " at " + canvas.width + "x" + canvas.height); if (isDoublePage) { if (isRTLMode(_this.targetObject)) { if (pageNumber % 2 == 0) { viewport.transform[4] = -canvas.width; } } else { if (pageNumber % 2 == 1) { viewport.transform[4] = -canvas.width; } } } var renderContext = { canvasContext: context, viewport: viewport }; page.cleanupAfterRender = true; var pageRendering = page.render(renderContext); pageRendering.promise.then( function () { log(performance.now() - start); start = performance.now(); if (isThumb == true || (_this.options.canvasToBlob == true && _this.webgl !== true)) { canvas.toBlob(function (blob) { var src = DFLIP.createObjectURL(blob, "image/jpeg"); log(performance.now() - start); _this.setCache(pageNumber, src, isThumb, requestedCacheSize); _this.setPage(pageNumber, src, callbackFunction, isThumb); //canvas.width = canvas.height = 1; //context.clearRect( 0, 0, canvas.width, canvas.height ); //page.cleanup(); }, "image/jpeg", _this.pdfRenderQuality) } else { log("Setting Page " + pageNumber); _this.setPage(pageNumber, canvas, callbackFunction, isThumb); } renderContext = null; }); } }; ContentProvider.prototype.getTargetPage = function (pageNumber) { }; ContentProvider.prototype.setLoading = function (pageNumber, show) { if (this.targetObject != null) { if (this.webgl == true) { var container = this.targetObject.container; if (show == true) { if (container.isLoading !== true) { container.addClass("df-loading"); container.isLoading = true; log("Loading icon at " + pageNumber + " as " + show); } } else { if (container.isLoading != null) { container.removeClass("df-loading"); container.isLoading = null; log("Loading icon at " + pageNumber + " as " + show); } } } else { var contentLayer = $(this.targetObject.getContentLayer(pageNumber)); if (contentLayer != null) { if (show == true) contentLayer.addClass("df-page-loading"); else contentLayer.removeClass("df-page-loading"); log("Loading icon at " + pageNumber + " as " + show); } } } }; ContentProvider.prototype.getAnnotations = function (pageNumber) { var _this = this; if (_this.options.enableAnnotation == false) return; var target = _this.targetObject; pageNumber = parseInt(pageNumber, 10); var source = _this.contentSource; var contentLayer = $(target.getContentLayer(pageNumber)); contentLayer.empty(); if (pageNumber > 0 && pageNumber <= _this.pageCount) { if (_this.contentSourceType == SOURCE_TYPE.PDF) { var basePage = getBasePage(pageNumber); var _pageNumber = pageNumber; if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 2) { _pageNumber = Math.ceil((pageNumber - 1) / 2) + 1; } source.getPage(_pageNumber).then(function (page) { if (contentLayer != null && contentLayer.length > 0) { var viewport = page.getViewport({scale: 1}); viewport = page.getViewport({scale: (_this.normalViewport.height / viewport.height) * _this.viewport.height / viewport.height}); // _this.viewport _this.setupAnnotations(page, viewport, contentLayer, pageNumber); /* //it's just resizing nothing to do with annotation fetch if (target.mode != "css") { var page3d = target.getPageByNumber(pageNumber); if (page3d != null) { var isLeft = (pageNumber % 2 == 0); var width = Math.abs(page3d.geometry.boundingBox.max.x - page3d.geometry.boundingBox.min.x); var height = Math.abs(page3d.geometry.boundingBox.max.z - page3d.geometry.boundingBox.min.z); var div3d = isLeft ? target.parent.cssScene.divLeft : target.parent.cssScene.divRight; if (div3d != null) { div3d.rotation.y = (isLeft ? -1 : 1 ) * Math.atan2(height, width) * 0.9; div3d.position.z = height * 0.8; div3d.position.x = (isLeft ? 1 : -1 ) * height / 2.5; $(div3d.element).css({ width: width, left: isLeft ? -width / 2 : width / 2 }); } } }*/ } }); } //render any custom liks available for page. if (_this.links != null && _this.links[pageNumber] != null) { var pageLinks = _this.links[pageNumber]; for (var index = 0; index < pageLinks.length; index++) { var pageLink = pageLinks[index]; var annotation; if (pageLink.dest && pageLink.dest.indexOf && pageLink.dest.indexOf('[html]') == 0) { annotation = document.createElement('div'); annotation.innerHTML = pageLink.dest.substr(6); annotation.className = "customHtmlAnnotation"; } else { annotation = document.createElement('a'); annotation.setAttribute("dest", pageLink.dest); annotation.className = "customLinkAnnotation"; annotation.href = "#" + pageLink.dest; annotation.onclick = function () { var dest = this.getAttribute("dest"); if (dest) { _this.linkService.customNavigateTo(dest); } return false; }; } annotation.style.left = pageLink.x + "%"; annotation.style.top = pageLink.y + "%"; annotation.style.width = pageLink.w + "%"; annotation.style.height = pageLink.h + "%"; contentLayer[0].appendChild(annotation); } } //render any html available for page. if (_this.html != null && _this.html[pageNumber] != null) { var pageHTML = _this.html[pageNumber]; contentLayer.append($("<div class='customHTMLAnnotation'>").html(pageHTML)); } } }; ContentProvider.prototype.setPage = function (pageNumber, textureSrc, callbackFunction, isThumb) { var _this = this; var target = _this.targetObject; var isRTL = isRTLMode(target); var isBooklet = isBookletMode(target); if (isThumb == true) { var page = _this.targetObject.container.find("#df-thumb" + pageNumber); //log("setting:" + pageNumber + " " + bgImage(textureSrc)); page.css({ backgroundImage: bgImage(textureSrc) }); } else { if (textureSrc == defaults.textureLoadFallback) { log("Fallback on " + pageNumber); } var bookPage = target.getPageByNumber(pageNumber); if (bookPage != null) { if ( (pageNumber % 2 != 0 && !isRTL) || (pageNumber % 2 != 1 && isRTL && !isBooklet) || (isBooklet && !isRTL) ) { log(pageNumber + "rendered to back of " + bookPage.color); bookPage.backImage(textureSrc, function (object, texture) { bookPage.backTextureLoaded = true; _this.setLoading(pageNumber); if (_this.requiresImageTextureScaling && texture && pageNumber != 1 && pageNumber != _this.pageCount) { texture.repeat.x = 0.5; texture.offset.x = 0.5; } if (callbackFunction != null) callbackFunction(); }); } else { log(pageNumber + "rendered to front of " + bookPage.color); bookPage.frontImage(textureSrc, function (object, texture) { bookPage.frontTextureLoaded = true; _this.setLoading(pageNumber); if (_this.requiresImageTextureScaling && texture && pageNumber != 1 && pageNumber != _this.pageCount) { texture.repeat.x = 0.5; } if (callbackFunction != null) callbackFunction(); }); //} } } else { log("Invalid set request on Page " + pageNumber); } } }; ContentProvider.prototype.setupAnnotations = function (page, viewport, pageDiv, pageNumber) { if (pageDiv == null || $(pageDiv).length == 0) return; var _this = this; var isRTL = isRTLMode(this.targetObject); return page.getAnnotations().then(function (annotationsData) { viewport = viewport.clone({ dontFlip: true }); if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 2 && pageNumber % 2 == 1) { //viewport.transform[4]= -viewport.scale * page.view[2]/2; } else if (pageNumber == 1) { } if (pageDiv == null) { return; } pageDiv = $(pageDiv); if (pageDiv.find(".annotationDiv").length == 0) { pageDiv.append($("<div class='annotationDiv'>")); } var div = pageDiv.find(".annotationDiv"); div.empty(); if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 1 && pageNumber < _this.pageCount && ((!isRTL && pageNumber % 2 == 1) || (isRTL && pageNumber % 2 == 0))) { //viewport.transform[4]= -viewport.scale * page.view[2]/2; div.css({left: '-100%'}); } else if (pageNumber == 1) { div.css({left: ''}); } /* div.css({ transform:'matrix(' + _this.viewport.transform.join(',') + ')' });*/ pdfjsLib.AnnotationLayer.render({ annotations: annotationsData, div: div[0], page: page, viewport: viewport, imageResourcesPath: defaults.imageResourcesPath, linkService: _this.linkService }); if (_this.options.annotationClass && _this.options.annotationClass !== "") { div.find(" > section").addClass(_this.options.annotationClass); } if (_this.options.search == true) { // div.find(" > section").addClass("someclass"); if (pageDiv.find(".textLayerDiv").length == 0) { pageDiv.append($("<div class='textLayerDiv'>")); } var div2 = pageDiv.find(".textLayerDiv"); page.getTextContent().then(function (textContent) { // console.log(textContent); var textLayer = new DFLIP.TextLayerBuilder({ textLayerDiv: div2[0], pageIndex: null, viewport: viewport.clone({ dontFlip: false }) }); textLayer.setTextContent(textContent); textLayer.render(); }); } }); }; return ContentProvider; })({}); var PageCSS = (function () { function PageCSS(parameters) { this.angles = parameters.angles || [0, 0, 0, 0, 0, 0]; this.stiffness = parameters.angles || 0.1; this.segments = parameters.segments || 1; this.canvasMode = parameters.contentSourceType !== SOURCE_TYPE.IMAGE && parameters.canvasToBlob == false; this.initDOM(); } function createInternals(pageSide) { var contentLayer = pageSide.contentLayer = $(html.div, { class: "df-page-content" }); pageSide.append(contentLayer); } PageCSS.prototype = { initDOM: function () { var element = this.element = $(html.div, { class: "df-book-page" }); var wrapper = this.wrapper = $(html.div, { class: "df-page-wrapper" }); var front = this.front = $(html.div, { class: "df-page-front" }); var back = this.back = $(html.div, { class: "df-page-back" }); var foldInnerShadow = this.foldInnerShadow = $(html.div, { class: "df-page-fold-inner-shadow" }); var foldOuterShadow = this.foldOuterShadow = $(html.div, { class: "df-page-fold-outer-shadow" }); this.frontIMG = new Image(); this.backIMG = new Image(); createInternals(front, this.segments, true); createInternals(back, this.segments, false); element.append(wrapper).append(foldOuterShadow); wrapper.append(front).append(back).append(foldInnerShadow); }, updatePoint: function (point) { if (point == null) return; //detect the current page var page = this.parent.dragPage != null ? this.parent.dragPage : point.page != null ? point.page : this; //get the pageWidth and pageHeight var pageWidth = page.element.width(), pageHeight = page.element.height(); //the corner where the drag started var corner = this.parent.corner != null ? this.parent.corner : point.corner, corners = DFLIP.CORNERS; var isRight = page.side == drag.right, isBottom = (corner == corners.BL) || (corner == corners.BR); point.rx = (isRight == true) ? pageWidth * 2 - point.x : point.x; point.ry = (isBottom == true) ? pageHeight - point.y : point.y; var radAngle = Math.atan2(point.ry, point.rx); radAngle = Math.PI / 2 - limitAt(radAngle, 0, toRad(90)); var correctionX = isRight ? point.x / 2 : pageWidth - point.x / 2, correctionY = point.ry / 2, refLength = Math.max(0, Math.sin(radAngle - Math.atan2(correctionY, correctionX)) * distOrigin(correctionX, correctionY)), foldLength = 0.5 * distOrigin(point.rx, point.ry); var x = Math.round(pageWidth - refLength * Math.sin(radAngle)), y = Math.round(refLength * Math.cos(radAngle)), angle = toDeg(radAngle); var angle1 = isBottom ? isRight ? 180 + (90 - angle) : 180 + angle : isRight ? angle : 90 - angle; var angle2 = isBottom ? isRight ? 180 + (90 - angle) : angle : isRight ? angle + 180 : angle1, angleS = isBottom ? isRight ? 90 - angle : angle + 90 : isRight ? angle1 - 90 : angle1 + 180, x1 = isRight ? pageWidth - x : x, y1 = isBottom ? pageHeight + y : -y, x2 = isRight ? -x : x - pageWidth, y2 = isBottom ? -pageHeight - y : y; var opacity = limitAt(point.distance * 0.5 / pageWidth, 0, 0.5); var foldOpacity = limitAt((pageWidth * 2 - point.rx) * 0.5 / pageWidth, 0.05, 0.3); page.element.addClass("df-folding"); var front = isRight ? page.back : page.front; var back = isRight ? page.front : page.back; var outerShadow = page.foldOuterShadow; var innerShadow = page.foldInnerShadow; page.wrapper.css({ transform: translateStr(x1, y1) + rotateStr(angle1) }); front.css({ transform: rotateStr(-angle1) + translateStr(-x1, -y1) }); back.css({ transform: rotateStr(angle2) + translateStr(x2, y2), boxShadow: "rgba(0, 0, 0, " + opacity + ") 0px 0px 20px" }); innerShadow.css({ transform: rotateStr(angle2) + translateStr(x2, y2), opacity: foldOpacity / 2, backgroundImage: prefix.css + "linear-gradient( " + angleS + "deg, rgba(0, 0, 0, 0.25) , rgb(0, 0, 0) " + foldLength * 0.7 + "px, rgb(255, 255, 255) " + foldLength + "px)" }); outerShadow.css({ //transform: rotateStr(angle - (isRight ? -180 : 0)) + translateStr(isRight ? -x : x - pageWidth, y), opacity: foldOpacity / 2, left: isRight ? "auto" : 0, right: isRight ? 0 : "auto", backgroundImage: prefix.css + "linear-gradient( " + (-angleS + 180) + "deg, rgba(0, 0, 0,0) " + foldLength / 3 + "px, rgb(0, 0, 0) " + foldLength + "px)" }); //$("body > p").html(JSON.stringify({ // x: Math.round(point.rx), // y: Math.round(point.ry), // a: Math.round(angle), // a1: Math.round(angle1), // cx: Math.round(correctionX), // cy: Math.round(correctionY), // dx: Math.round(x), // dy: Math.round(y), // ref: Math.round(refLength), // dis: Math.round(distOrigin(point.x, point.y)) //})); }, updateAngle: function (angle, isRight) { var width = this.element.width() * 5; //if(prefix.dom!=='MS') { this.wrapper.css({ perspective: width, perspectiveOrigin: isRight == true ? "0% 50%" : "100% 50%" }); //} this.front.css({ display: (isRight == true ? (angle <= -90 ? 'block' : 'none') : (angle < 90 ? 'block' : 'none')), transform: (prefix.dom !== 'MfS' ? "" : "perspective(" + width + "px) ") + (isRight == true ? "translateX(-100%) " : "") + "rotateY(" + ((isRight == true ? 180 : 0) + angle) + "deg)" }); this.back.css({ display: (isRight == true ? (angle > -90 ? 'block' : 'none') : (angle >= 90 ? 'block' : 'none')), transform: (prefix.dom !== 'MSd' ? "" : "perspective(" + width + "px) ") + (isRight == false ? "translateX(100%) " : "") + "rotateY(" + ((isRight == false ? -180 : 0) + angle) + "deg)" }); //$("body > p").html(JSON.stringify({ // a: Math.round(angle) //})); return; /*if(this.angles[1] != null) { var segsb = this.back.segments; var segsf = this.front.segments; var width = this.element.width(); var angle1 = this.angles[1]; var angle2 = this.angles[4]/segsb.length; var step = Math.floor(width/segsb.length); for (var count = 0; count < segsb.length; count++) { var segb = segsb[count]; var segf = segsf[count]; segb.css({ transform: "rotate3d(0,1,0," + (count == 0 ? angle1 : angle2) + "deg)", //backgroundPositionX: -step * count, //backgroundSize: width + "px 100%" }); segf.css({ transform: "rotate3d(0,1,0," + (count == 0 ? 180 + angle1 : angle2) + "deg)", //backgroundPositionX: step * (count + 1), //backgroundSize: width + "px 100%" }); } } else{ this.element.find(".bg-segment").css({ transform: "translate3d(0px,0,0) rotate3d(0,1,0,0deg)" }); }*/ }, tween: function (point) { var page = this; if (page == null || page.parent == null) return; var isBooklet = isBookletMode(page.parent); var isRight = page.side == drag.right; var isRTL = page.parent.direction == DFLIP.DIRECTION.RTL; var isBottom = page.parent.corner == DFLIP.CORNERS.BL || page.parent.corner == DFLIP.CORNERS.BR; var isMagnetic = page.magnetic == true; var travelY = isBottom ? page.parent.height : 0; var init, first, mid, angle = 0; var end = page.end = (page && page.animateToReset == true) ? {x: isRight ? page.parent.fullWidth : 0, y: travelY} : {x: isRight ? 0 : page.parent.fullWidth, y: travelY}; page.ease = page.isHard ? TWEEN.Easing.Quadratic.InOut : TWEEN.Easing.Linear.None; var tempDuration = page.parent.duration; if (page.isHard == true) { if (point != null) { angle = angleByDistance(point.distance, point.fullWidth); } init = page.init = {angle: angle * (isRight ? -1 : 1)}; end = page.end = (page && page.animateToReset == true) ? {angle: isRight ? 0 : -0} : {angle: isRight ? -180 : 180}; } else { if (point == null) { init = page.init = (page && page.animateToReset == true) ? {x: isRight ? 0 : page.parent.fullWidth, y: 0} : {x: isRight ? page.parent.fullWidth : 0, y: 0}; first = page.first = { x: (isRight ? 3 : 1) * page.parent.fullWidth / 4, y: 0 }; mid = page.mid = {x: (isRight ? 1 : 3) * page.parent.fullWidth / 4, y: 0}; } else { init = page.init = {x: point.x, y: point.y, opacity: 1}; first = page.first = {x: point.x * 3 / 4, y: point.y * 3 / 4, opacity: 1}; mid = page.mid = {x: point.x / 4, y: point.y / 4, opacity: 1}; tempDuration = page.parent.duration * distPoints(init.x, init.y, end.x, end.y) / page.parent.fullWidth; tempDuration = limitAt(tempDuration, page.parent.duration / 3, page.parent.duration); } } init.index = 0; // first.index = 0; // mid.index = 0; end.index = 1; page.isFlipping = true; var update = function (tween) { if (page.isHard == true) { page.updateAngle(tween.angle, isRight); page.angle = tween.angle; } else { page.updatePoint({ x: tween.x, y: tween.y }); page.x = tween.x; page.y = tween.y; } if (isBooklet && !isMagnetic) page.element[0].style.opacity = (isRight && !isRTL) || (!isRight && isRTL) ? tween.index > 0.5 ? 2 * (1 - tween.index) : 1 : tween.index < 0.5 ? 2 * tween.index : 1; }; if (isBooklet && ((!isRight && !isRTL) || (isRight && isRTL))) page.element[0].style.opacity = 0; var completeTween = page.completeTween = page.completeTween || function (skipRefresh) { page.isFlipping = false; if (page.isHard == true) { page.updateAngle(page.end.angle); page.back.css({display: "block"}); page.front.css({display: "block"}); } else { page.updatePoint({ x: page.end.x, y: page.end.y }); } page.element[0].style.opacity = 1; if (page.animateToReset !== true) { page.side = page.side == drag.right ? drag.left : drag.right; } else page.animateToReset = null; page.currentTween = null; page.pendingPoint = null; page.magnetic = false; page.parent.dragPage = null; page.parent.corner = DFLIP.CORNERS.NONE; if (skipRefresh != true) page.parent.refresh(); //log("Tween Completed"); }; if (page.isHard == true) { page.currentTween = new TWEEN.Tween(init).delay(0) .to(end, page.parent.duration) .onUpdate(function () { update(this); }).easing(page.ease) .onComplete(page.completeTween) .start(); } else { if (point == null) { page.currentTween = new TWEEN.Tween(init).delay(0) .to(end, page.parent.duration) .onUpdate(function () { update(this); }).easing(TWEEN.Easing.Sinusoidal.Out) .onComplete(page.completeTween) .start(); } else { page.currentTween = new TWEEN.Tween(init).delay(0) .to(end, tempDuration) .onUpdate(function () { update(this); }).easing(TWEEN.Easing.Sinusoidal.Out) .onComplete(page.completeTween); page.currentTween.start(); } } //page.currentTween.parent= page; }, frontImage: function (texture, callback) { var _this = this; function completed() { _this.front.css({ backgroundImage: bgImage(texture) }); if (callback != null) callback(); } if (_this.canvasMode == true) { _this.front.find(">canvas").remove(); if (texture !== defaults.textureLoadFallback) { _this.front.append($(texture)); } if (callback != null) callback(); } else { if (texture == defaults.textureLoadFallback) { completed(); } else { _this.frontIMG.onload = completed; _this.frontIMG.src = texture; } } }, backImage: function (texture, callback) { var _this = this; function completed() { _this.back.css({ backgroundImage: bgImage(texture) }); if (callback != null) callback(); } if (_this.canvasMode == true) { _this.back.find(">canvas").remove(); if (texture !== defaults.textureLoadFallback) { _this.back.append($(texture)); } if (callback != null) callback(); } else { if (texture == defaults.textureLoadFallback) { completed(); } else { _this.backIMG.onload = completed; _this.backIMG.src = texture; } } }, updateCSS: function (css) { this.element.css(css); }, resetCSS: function () { this.wrapper.css({ transform: '' }); this.front.css({ transform: '', boxShadow: '' }); this.back.css({ transform: '', boxShadow: '' }); }, clearTween: function (skipRefresh) { this.currentTween.stop(); this.completeTween(skipRefresh == true); this.resetCSS(); } }; return PageCSS; })(); var BookCSS = (function (_super) { __extends(BookCSS, _super); function updateFolding(dragPage) { dragPage.parent.container.find(".df-folding").removeClass("df-folding"); dragPage.element.addClass("df-folding"); } function hasFlipping(book) { var hasFlipping = false; for (var pageCount = 0; pageCount < book.pages.length; pageCount++) { var page = book.pages[pageCount]; if (page.isFlipping == true) { hasFlipping = true; break; } } return hasFlipping; } function BookCSS(parameters, container) { //parameters = extendOptions(parameters); //_super.call(this, parameters, stage); var _this = this; _this.type = "BookCSS"; _this.images = parameters.images || []; _this.pageCount = parameters.pageCount || 1; //_this.segments = parameters.segments = 5; _this.foldSense = 50; _this.stackCount = 4; _this.mode = "css"; _this.pages = []; _this.duration = parameters.duration; _this.container = $(container); _this.options = parameters; _this.drag = drag.none; // _this.pageCount = ((this.pageCount == 1 || utils.isBookletMode(parameters)) ? _this.pageCount // : Math.ceil(_this.pageCount / 2) * 2); _this.pageMode = parameters.pageMode || ((isMobile || _this.pageCount <= 2) ? DFLIP.PAGE_MODE.SINGLE : DFLIP.PAGE_MODE.DOUBLE); _this.singlePageMode = parameters.singlePageMode || (isMobile ? DFLIP.SINGLE_PAGE_MODE.BOOKLET : DFLIP.SINGLE_PAGE_MODE.ZOOM); _this.swipe_threshold = isMobile ? 15 : 50; _this.direction = parameters.direction || DFLIP.DIRECTION.LTR; _this.startPage = 1; _this.endPage = _this.pageCount; _this._activePage = parameters.openPage || _this.startPage; _this.hardConfig = parameters.hard; //var foldTime = null; has3d = 'WebKitCSSMatrix' in window || (document.body && 'MozPerspective' in document.body.style); _this.animateF = function () { if (TWEEN.getAll().length > 0) TWEEN.update(); else clearInterval(_this.animate); }; _this.init(parameters); _this.skipDrag = false; function checkPage(point) { if (_this.dragPage != point.page && point.page.visible == true) { _this.dragPage.clearTween(true); _this.dragPage = point.page; _this.corner = point.corner; _this.dragPage.pendingPoint = point; } } var mouseMove = function (event) { //event.preventDefault(); var point = _this.eventToPoint(event); if (event.touches != null && event.touches.length == 2 && _this.startTouches != null) { //return; // _this.startTouches = event.touches; _this.zoomDirty = true; var touchCenter = utils.getVectorAvg(utils.getTouches(event, _this.container.offset())), newScale = utils.calculateScale(_this.startTouches, utils.getTouches(event)), scale = newScale / _this.lastScale; var zoom = _this.contentProvider.zoomScale, x = touchCenter.x, y = touchCenter.y; _this.stage.css({ transform: "translate3d(" + _this.left + "px," + _this.top + "px,0) scale3d(" + newScale + "," + newScale + ",1)" }); _this.lastScale = newScale; _this.lastZoomCenter = touchCenter; event.preventDefault(); } if ((event.touches != null && event.touches.length > 1) || _this.startPoint == null || _this.startTouches != null) return; var targetPage = _this.dragPage || point.page; if (_this.contentProvider.zoomScale !== 1) { if ((event.touches != null || _this.isPanning == true)) { _this.pan(point); event.preventDefault(); } } else { if (_this.skipDrag !== true) { //if (_this.cancelMouse != true) { var distance = point.distance;//_this.getDistance(event);//point.x < _this.pageWidth ? point.x : _this.fullWidth - point.x; if (!hasFlipping(_this)) { if ((_this.dragPage != null) || (point.isInside == true)) { //$(".quick-hint").html(distance); if (_this.dragPage != null) { log("set mouse down move"); } else { point.y = limitAt(point.y, 1, _this.height - 1); point.x = limitAt(point.x, 1, point.fullWidth - 1); } var corner = _this.corner || point.corner; if (targetPage.isHard) { var isRight = corner == DFLIP.CORNERS.BR || corner == DFLIP.CORNERS.TR; var angle = angleByDistance(point.distance, point.fullWidth); targetPage.updateAngle(angle * (isRight ? -1 : 1), isRight); } else { targetPage.updatePoint(point, _this); } targetPage.magnetic = true; targetPage.magneticCorner = point.corner; event.preventDefault(); //point.page.updatePoint(point); } if (_this.dragPage == null && targetPage != null && point.isInside == false && targetPage.magnetic == true) { targetPage.pendingPoint = point; targetPage.animateToReset = true; _this.corner = targetPage.magneticCorner; _this.animatePage(targetPage); targetPage.pendingPoint = null; targetPage.magnetic = false; targetPage.magneticCorner = null; } if (_this.isPanning == true && _this.dragPage == null && _this.contentProvider.zoomScale == 1) { //check if swipe has happened //console.log(_this.lastPos - point.x,performance.now()-_this.lastTime); var swipe_dist = point.x - _this.lastPos, swipe_time = performance.now() - _this.lastTime; if (Math.abs(swipe_dist) > _this.swipe_threshold) { //swipe has triggered //_this.dragPage.pendingPoint = point; if (swipe_dist < 0) { _this.next(); } else { _this.prev(); } _this.drag = drag.none; _this.isPanning = false; event.preventDefault(); } _this.lastPos = point.x; _this.lastTime = performance.now(); } } } } }, mouseUp = function (event) { if (event.touches != null && event.touches.length == 0) { var zoom = _this.contentProvider.zoomScale; if (_this.zoomDirty == true) { _this.previewObject.contentProvider.zoomScale = utils.limitAt(_this.previewObject.contentProvider.zoomScale * _this.lastScale, 1, _this.previewObject.contentProvider.maxZoom); _this.previewObject.zoomValue = _this.previewObject.contentProvider.zoomScale * 1; //_this.previewObject.zoom(_this.lastScale < 1 ? -1 : 1); //console.log(_this.previewObject.contentProvider.zoomScale * _this.lastScale,_this.previewObject.contentProvider.maxZoom) //_this.previewObject.pendingZoom = true; _this.previewObject.resize(); _this.zoomDirty = false; } _this.wrapper.css({ transform: "" }); _this.lastScale = null; _this.startTouches = null; } _this.isPanning = false; if (event.touches != null && event.touches.length > 1) return; if (_this.skipDrag !== true) { //completeFold(); var point = _this.eventToPoint(event); if (_this.dragPage) { event.preventDefault(); /* if (_this.animate != null) { clearInterval(_this.animate); } _this.animate = setInterval(_this.animateF, 30); _this.dragPage.tween(point);*/ //use something like pending point // detect the next page anbd call the updatepage //will be better _this.dragPage.pendingPoint = point; if (point.x == _this.startPoint.x && point.y == _this.startPoint.y && point.isInside == true) { if (_this.corner == DFLIP.CORNERS.BR || _this.corner == DFLIP.CORNERS.TR) { checkPage(point); if (_this.dragPage.isFlipping !== true) _this.next(); } else if (_this.corner == DFLIP.CORNERS.BL || _this.corner == DFLIP.CORNERS.TL) { checkPage(point); if (_this.dragPage.isFlipping !== true) _this.prev(); } } else if (_this.dragPage.isFlipping !== true) { if (point.distance > point.fullWidth / 2) { if (point.x > point.fullWidth / 2) _this.prev(); else _this.next(); } else { _this.dragPage.animateToReset = true; _this.animatePage(_this.dragPage); } } //_this.dragPage.animateToReset = true; if (_this.dragPage) { _this.dragPage.pendingPoint = null; _this.dragPage.magnetic = false; } } else { //detect click /*if(_this.wrapper[0].contains(event.target) && _this.contentProvider.zoomScale == 1 && point.x == _this.startPoint.x && point.y == _this.startPoint.y && point.isInsidePage && _this.startPoint.page == point.page && !point.page.isFlipping && event.srcElement.nodeName!=="A"){ if(_this.startPoint.page.side ==0){ _this.prev(); _this.startPoint.page = null; } else{ _this.next(); _this.startPoint.page = null; } }*/ } _this.drag = drag.none; //_this.dragPage = null; //_this.corner = DFLIP.CORNERS.NONE; //log("set mouse up"); } }, mouseClick = function (event) { var point = _this.eventToPoint(event); var element = event.srcElement || event.originalTarget; if (_this.dragPage && _this.dragPage.magnetic) return; if (_this.wrapper[0].contains(event.target) && _this.contentProvider.zoomScale == 1 && point.x == _this.startPoint.x && point.y == _this.startPoint.y && point.isInsidePage && _this.startPoint.page == point.page && !point.page.isFlipping && element.nodeName !== "A") { if (_this.startPoint.page.side == 0) { _this.corner = DFLIP.CORNERS.TL; _this.prev(); _this.startPoint.page = null; } else { _this.corner = DFLIP.CORNERS.TR; _this.next(); _this.startPoint.page = null; } _this.isPanning = false; } }, mouseDown = function (event) { if (event.touches != null && event.touches.length == 2 && _this.startTouches == null) { _this.startTouches = utils.getTouches(event); _this.lastScale = 1; } if ((event.touches != null && event.touches.length > 1) || (event.touches == null && event.button !== 0)) return; var point = _this.eventToPoint(event); _this.startPoint = point; _this.left = _this.left || 0; _this.top = _this.top || 0; _this.isPanning = true; _this.lastPos = point.x; _this.lastTime = performance.now(); if (_this.skipDrag !== true) { if (point.isInside == true && !hasFlipping(_this)) { _this.startPoint = point; _this.drag = point.drag; _this.dragPage = point.page; _this.corner = point.corner; log(_this.corner); updateFolding(_this.dragPage); //log("set mouse down"); if (point.page.isHard) { } else { point.page.updatePoint(point, _this); } if (point.page.name == "0") { _this.shadow.css({ width: '50%', left: _this.direction == DFLIP.DIRECTION.RTL ? 0 : '50%', transitionDelay: '' }); } else if (point.page.name == Math.ceil(_this.pageCount / 2) - 1) { _this.shadow.css({ width: '50%', left: _this.direction == DFLIP.DIRECTION.RTL ? '50%' : 0, transitionDelay: '' }); } } } }, onMouseWheel = function (event) { if (!(_this.previewObject.options.isLightBox === true || _this.previewObject.ui.isFullscreen === true)) return; var delta = 0; //var zoom = _this.contentProvider.zoomScale > 1; if (event.wheelDelta != null) { // WebKit / Opera / Explorer 9 delta = event.wheelDelta / 120; } else if (event.detail != null) { // Firefox delta = -event.detail / 3; } var zoom1 = _this.contentProvider.zoomScale, maxZoom = _this.contentProvider.maxZoom; if (delta) { if ((delta > 0 && zoom1 < maxZoom) || (delta < 0 && zoom1 > 1)) { event.stopPropagation(); event.preventDefault(); var pointOld = _this.eventToPoint(event); var pointNew = _this.eventToPoint(event); var origin = {x: _this.container.width() / 2, y: -23 + _this.container.height() / 2}; _this.previewObject.zoom(delta); var zoom2 = _this.contentProvider.zoomScale; if (zoom1 !== zoom2) { var dz = (zoom2 / zoom1); //fix zoom to previous center if (zoom2 == 1) { _this.left = 0; _this.top = 0; } else { _this.left *= dz; _this.top *= dz; } //fix zoom to previous pointer var dx = (pointOld.raw.x - origin.x) * dz, dy = (pointOld.raw.y - origin.y) * dz; pointNew.raw.x = origin.x + dx;// origin.x + dz * (point.x-origin.x); pointNew.raw.y = origin.y + dy;// origin.y + dz * (point.y-origin.y); _this.startPoint = pointNew; //console.log(pointOld.raw.x - origin.x,dx,pointOld.raw.y - origin.y,dy,pointNew.raw,_this.startPoint.raw); _this.pan(pointOld); var targetPage = _this.dragPage || pointOld.page; if (_this.dragPage == null && targetPage != null && pointOld.isInside == true && targetPage.magnetic == true) { targetPage.pendingPoint = pointOld; targetPage.animateToReset = true; _this.corner = targetPage.magneticCorner; _this.animatePage(targetPage); targetPage.pendingPoint = null; targetPage.magnetic = false; targetPage.magneticCorner = null; } } } } }; var containerDom = _this.container[0]; var stageDom = _this.stage[0]; if (containerDom) { stageDom.addEventListener("mousemove", mouseMove, false); stageDom.addEventListener("touchmove", mouseMove, false); stageDom.addEventListener("mousedown", mouseDown, false); stageDom.addEventListener("click", mouseClick, false); stageDom.addEventListener("mouseup", mouseUp, false); stageDom.addEventListener("touchend", mouseUp, false); stageDom.addEventListener("touchstart", mouseDown, false); if (_this.options.scrollWheel == true) { //lets not trigger scroll when in outline or another stageDom.addEventListener('mousewheel', onMouseWheel, false); stageDom.addEventListener('DOMMouseScroll', onMouseWheel, false); // firefox } } this.dispose = function () { stageDom.removeEventListener("mousemove", mouseMove, false); stageDom.removeEventListener("touchmove", mouseMove, false); stageDom.removeEventListener("mousedown", mouseDown, false); stageDom.removeEventListener("click", mouseClick, false); stageDom.removeEventListener("mouseup", mouseUp, false); stageDom.removeEventListener("touchend", mouseUp, false); stageDom.removeEventListener("touchstart", mouseDown, false); if (_this.options.scrollWheel == true) { stageDom.removeEventListener('mousewheel', onMouseWheel, false); stageDom.removeEventListener('DOMMouseScroll', onMouseWheel, false); // firefox } _this.updatePageCallback = null; _this.flipCallback = null; _this.animateF = null; _this.stage.remove(); }; } BookCSS.prototype = { add: function (object) { if (object instanceof PageCSS) this.container.append($(object.element)); else this.container.append($(object)); }, pan: function (point) { var origin = this.startPoint; var scale = this.contentProvider.zoomScale; var left = (this.left + (point.raw.x - origin.raw.x)), top = (this.top + (point.raw.y - origin.raw.y)); //round removes blur due to decimal value in transform. this.left = Math.round(limitAt(left, -this.shiftWidth, this.shiftWidth)); this.top = Math.round(limitAt(top, -this.shiftHeight, this.shiftHeight)); if (scale == 1) { this.left = 0; this.top = 0; } this.startPoint = point; //console.log(point, origin); this.stage.css({ transform: "translate3d(" + this.left + "px," + this.top + "px,0)" }); //var a = book.wrapper.height(); }, getPageByNumber: function (pageNumber) { var relativePageNumber = isBookletMode(this) ? (isRTLMode(this) ? pageNumber + 1 : pageNumber) : Math.floor((pageNumber - 1) / 2); var page; for (var count = 0; count < this.pages.length; count++) { if (relativePageNumber == parseInt(this.pages[count].name, 10)) page = this.pages[count]; } return page; }, getPageSide: function (pageNumber) { var isRTL = this.direction == DFLIP.DIRECTION.RTL; var page = this.getPageByNumber(pageNumber); if (page == null) return; if (isBookletMode(this)) return isRTL ? page.front : page.back; if (pageNumber % 2 == 0) return isRTL ? page.back : page.front; else return isRTL ? page.front : page.back; }, getContentLayer: function (pageNumber) { var pageSide = this.getPageSide(pageNumber); return pageSide == null ? null : pageSide.contentLayer; } }; BookCSS.prototype.init = function (parameters) { var _this = this; _this.stage = $(html.div, { class: "df-book-stage" }); _this.wrapper = $(html.div, { class: "df-book-wrapper" }); _this.shadow = $(html.div, { class: "df-book-shadow" }); //_this.resize(); _this.container.append(_this.stage); _this.stage.append(_this.wrapper); _this.wrapper.append(_this.shadow); /* _this.nextButton = $(html.div, { class: "df-book-next-button df-book-side-buttons " + parameters.icons['altnext'] }).appendTo(_this.wrapper).on("click", function () { _this.next(); }); _this.prevButton = $(html.div, { class: "df-book-prev-button df-book-side-buttons " + parameters.icons['altprev'] }).appendTo(_this.wrapper).on("click", function () { _this.prev(); });*/ //_this.container.height(parameters.height); _this.createStack(parameters); }; BookCSS.prototype.createStack = function (parameters) { var colors = "red,green,blue,yellow,orange,black".split(","); for (var _stackCount = 0; _stackCount < this.stackCount; _stackCount++) { parameters.angles = [, this.stackCount - _stackCount];//[1] = (this.stackCount - _stackCount); parameters.stiffness = (this.stackCount - _stackCount) / 100; var clone = new PageCSS(parameters); clone.angles[1] = 180; clone.index = _stackCount; clone.parent = this; clone.textureReady = false; clone.textureRequested = false; this.wrapper.append(clone.element); clone.isFlipping = false; this.pages.push(clone); clone.color = colors[_stackCount]; //for (var _count = 0; _count < 4; _count++) { // clone.element.css({ // backgroundColor : colors[_stackCount] // }); //} } this.children = this.pages; }; BookCSS.prototype.isPageHard = function (pageNumber) { return utils.isHardPage(this.hardConfig, pageNumber, this.pageCount, isBookletMode(this)); }; BookCSS.prototype.setDuration = function (_duration) { this.duration = _duration; }; BookCSS.prototype.moveBy = function (step) { var nextPage = this._activePage + step; nextPage = limitAt(nextPage, this.startPage, this.endPage); if (this.firstFlipped != true) { this.previewObject.analytics({ eventAction: "First Page Flip", options: this.previewObject.options }); this.firstFlipped = true; } this.gotoPage(nextPage); }; BookCSS.prototype.next = function (step) { if (step == null) step = (this.direction == DFLIP.DIRECTION.RTL) ? -this.pageMode : this.pageMode; this.moveBy(step); }; BookCSS.prototype.prev = function (step) { if (step == null) step = (this.direction == DFLIP.DIRECTION.RTL) ? this.pageMode : -this.pageMode; this.moveBy(step); }; BookCSS.prototype.eventToPoint = function (event) { event = fixMouseEvent(event); var wrapper = this.wrapper, pages = this.pages, pageWidth = this.pageWidth, fullWidth = this.fullWidth, height = this.height, win = $(window), point = {x: event.clientX, y: event.clientY}; var left = point.x - wrapper[0].getBoundingClientRect().left;// + win['scrollLeft'](); var top = point.y - wrapper[0].getBoundingClientRect().top;// + win['scrollTop'](); point.x = point.x - this.container[0].getBoundingClientRect().left; point.y = point.y - this.container[0].getBoundingClientRect().top; var distance = (this.drag == drag.none) ? left < pageWidth ? left : fullWidth - left : this.drag == drag.left ? left : fullWidth - left; var page = //((left >= 0 && left <= fullWidth)? (left < pageWidth ? pages[this.stackCount / 2 - 1] : pages[this.stackCount / 2]); var pageDrag = left < this.foldSense ? drag.left : (left > fullWidth - this.foldSense) ? drag.right : drag.none; //determine the corner var x = left, y = top, h = height, w = fullWidth, delta = this.foldSense, corners = DFLIP.CORNERS, corner; if (x >= 0 && x < delta) { if (y >= 0 && y <= delta) corner = corners.TL; else if (y >= h - delta && y <= h) corner = corners.BL; else if (y > delta && y < h - delta) corner = corners.L; else corner = corners.NONE; } else if (x >= w - delta && x <= w) { if (y >= 0 && y <= delta) corner = corners.TR; else if (y >= h - delta && y <= h) corner = corners.BR; else if (y > delta && y < h - delta) corner = corners.R; else corner = corners.NONE; } else corner = corners.NONE; return { isInsidePage: x >= 0 && x <= w && y >= 0 && y <= h, isInside: corner !== corners.NONE && corner !== corners.L && corner !== corners.R, x: left, y: top, fullWidth: fullWidth, rawDistance: fullWidth - left, distance: distance, page: page, drag: pageDrag, foldSense: this.foldSense, event: event, raw: point, corner: corner }; }; BookCSS.prototype.gotoPage = function (pageNumber) { pageNumber = parseInt(pageNumber, 10); this._activePage = pageNumber; if (this.autoPlay == true) { this.previewObject.setAutoPlay(this.autoPlay); } this.updatePage(pageNumber); if (this && this.thumblist && this.thumblist.review) this.thumblist.review(); }; BookCSS.prototype.refresh = function () { this.updatePage(this._activePage); if (this.flipCallback != null) this.flipCallback(); }; BookCSS.prototype.updatePage = function (pageNumber) { var isRTL = (this.direction == DFLIP.DIRECTION.RTL), isBooklet = isBookletMode(this), newBaseNumber = getBasePage(pageNumber); var pageDivisor = isBooklet ? 1 : 2; pageNumber = Math.floor((pageNumber / pageDivisor)); if (isRTL) pageNumber = Math.ceil(this.pageCount / pageDivisor) - pageNumber; var oldBaseNumber = this.oldBaseNumber || 0; var pageCount = this.pageCount / pageDivisor; var stackCount = this.stackCount; var midPoint = Math.floor(stackCount / 2); if (oldBaseNumber > pageNumber) { this.children[stackCount - 1].skipFlip = true; this.children.unshift(this.children.pop()); } else if (oldBaseNumber < pageNumber) { this.children[0].skipFlip = true; this.children.push(this.children.shift()); } for (var _pageCount = 0; _pageCount < stackCount; _pageCount++) { var page = this.children[_pageCount]; if (oldBaseNumber !== pageNumber) { if (page.currentTween != null) { page.clearTween(true); //page.currentTween.stop(); //page.completeTween(true); //page.resetCSS(); //page.currentTween = null; } } var oldSide = page.side; var newSide; var relativePageNumber = pageNumber - midPoint + _pageCount; if (isRTL) relativePageNumber = isBooklet ? this.pageCount - relativePageNumber : Math.ceil(this.pageCount / 2) - relativePageNumber - 1; var oldName = page.name; page.isHard = this.isPageHard(relativePageNumber); if (page.isHard) { page.element.addClass("df-hard-page"); } else { page.element.removeClass("df-hard-page"); page.front.css({display: "block"}); page.back.css({display: "block"}); } if (relativePageNumber == 0 || relativePageNumber == pageCount) { page.element.addClass("df-cover-page"); } else { page.element.removeClass("df-cover-page"); } var oldPageNumber = $(page.element).attr("pageNumber"); if (oldPageNumber != relativePageNumber) { page.front.contentLayer.empty(); page.back.contentLayer.empty(); } $(page.element).attr("pageNumber", relativePageNumber); //Sizing page.isEdge = false; //true; if (_pageCount == 0) { } else if (_pageCount == stackCount - 1) { } else { page.isEdge = false; } if (_pageCount < midPoint) { newSide = drag.left; } else { newSide = drag.right; } if (page.isFlipping == false) { if (newSide !== oldSide && page.skipFlip == false) { this.animatePage(page); if (this.preFlipCallback != null) this.preFlipCallback(); } else { page.skipFlip = false; page.element.removeClass("df-flipping df-quick-turn df-folding df-left-side df-right-side"); page.element.addClass((_pageCount < midPoint) ? "df-left-side" : "df-right-side"); page.side = newSide; } } page.visible = isBooklet ? (isRTL ? (_pageCount < midPoint || page.isFlipping) : (_pageCount >= midPoint || page.isFlipping)) : ((relativePageNumber >= 0 && relativePageNumber < pageCount) || (isBooklet && relativePageNumber == pageCount)); if (this.requestPage != null && page.visible == true) { page.name = relativePageNumber.toString(); if (page.name != oldName) { page.backTextureLoaded = false; page.frontTextureLoaded = false; page.backPageStamp = "-1"; page.frontPageStamp = "-1"; page.thumbLoaded = false; page.front.contentLayer.html(""); page.back.contentLayer.html(""); //if (oldName !== '-2') { //canvas clearing page.frontImage(defaults.textureLoadFallback); page.backImage(defaults.textureLoadFallback); //} this.requestPage(); } } page.oldDepth = page.depth; page.updateCSS({ display: page.visible == true ? "block" : "none", zIndex: 6 + (_pageCount < midPoint ? (_pageCount - midPoint) : (midPoint - _pageCount)), transform: '' }); if (page.pendingPoint == null && page.isFlipping == false) { page.resetCSS(); } } if (TWEEN.getAll().length == 0) { clearInterval(this.animate); } $(".quick-hint").html(pageNumber); this.oldBaseNumber = pageNumber; if (this.updatePageCallback) this.updatePageCallback(); }; BookCSS.prototype.animatePage = function (page) { page.element.addClass("df-flipping"); page.isFlipping = true; if (this.animate != null) { clearInterval(this.animate); } this.animate = setInterval(this.animateF, 30); page.tween(page.pendingPoint); }; return BookCSS; }) ({}); var FlipBook = (function (_super) { __extends(FlipBook, _super); function FlipBook(container, source, parameters) { _super.call(this, parameters); var _this = this; _this.type = "FlipBook"; _this.container = container; _this.options = parameters; _this.options.source = source; _this.contentSource = source; if (parameters.height != null && parameters.height.toString().indexOf('%') < 0) { _this.container.height(Math.min(parameters.height, $(window).height())); } else { _this.container.height(parameters.height); } if (_this.options.isLightBox) { window.dfLightBox.closeButton.addClass(_this.options.icons['close']); } if (_this.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL) { //currently booklet version cannot handle double sized image pages if (Array === _this.contentSource.constructor || Array.isArray(_this.contentSource) || _this.contentSource instanceof Array) { _this.options.singlePageMode = DFLIP.SINGLE_PAGE_MODE.ZOOM; } _this.container.addClass("df-double-internal"); } if (!_this.options.isLightBox && _this.container.attr("id") != null) { _this.options.id = _this.container.attr("id"); } if (_this.options.parsed !== true && _this.options.links != null) { DFLIP.parseLinks(_this.options.links); } var webgl = _this.webgl = parameters.webgl == true && hasWebgl == true && utils.canSupport3D(); container.addClass("df-container df-loading df-init df-floating" + " df-controls-" + _this.options.controlsPosition); _this.commentPopup = $('<div class="df-comment-popup">').appendTo(container); if (_this.options.transparent == true) { container.addClass("df-transparent"); } if (_this.options.direction == DFLIP.DIRECTION.RTL) { container.addClass("df-rtl"); } _this.container.info = $(html.div, { class: "loading-info" }).appendTo(_this.container).html(_this.options.text.loading + "..."); /* if (userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0 || (isSafari && !isIOS)) { _this.options.webgl = false; //IE 11 } */ if (!!userAgent.match(/msie\s[5-9]/i)) { _this.container.info.html("Your browser (Internet Explorer) is out of date to run DFlip Flipbook Plugin. <br><a href='http://browsehappy.com/'>Upgrade to a new one</a>").addClass("df-old-browser"); container.removeClass("df-loading"); return _this; } var backgroundImage = parameters.backgroundImage == null || parameters.backgroundImage == '' ? '' : "url('" + parameters.backgroundImage + "')"; _this.container.css({ position: "relative", overflow: "hidden", backgroundColor: parameters.backgroundColor, backgroundImage: backgroundImage }); if (_this.options.isLightBox == true) { _this.analytics({ eventAction: "Open Book", options: _this.options }); } _this.init(webgl, source); if (_this.options.onCreate != null) _this.options.onCreate(_this); return _this; } FlipBook.prototype.init = function (webgl) { var _this = this; var book = _this.target; var options = _this.options; if (webgl == true) { var updateMockupJs = function (callback) { var process3d = function () { MOCKUP.defaults.anisotropy = 0; MOCKUP.defaults.groundTexture = "blank"; THREE.skipPowerOfTwo = true; RegisterMockupObjects(); if (callback != null) callback(); }; if (window.MOCKUP == null) { _this.updateInfo(options.text.loading + " WEBGL 3D ..."); if (typeof define === 'function' && define.amd && window.requirejs) { requirejs.config({ "paths": { "three": defaults.threejsSrc.replace(".js", "") }, shim: { 'three': { exports: 'THREE' } } }); require(['three'], function (THREE) { window.THREE = THREE; getScript(defaults.mockupjsSrc + "?ver=" + DFLIP.version, function () { process3d(); }); return THREE; }); } else if (typeof define === 'function' && define.amd) { require(["three", defaults.threejsSrc.replace(".js", "")], function (ready, fx) { ready(function () { }); }); } else { getScript(defaults.threejsSrc + "?ver=" + DFLIP.version, function () { //_this.updateInfo("Loading 3D Pages ..."); this was retainnng _this and not releasing memory getScript(defaults.mockupjsSrc + "?ver=" + DFLIP.version, function () { process3d(); }); }); } } else { process3d(); } } ; updateMockupJs(function () { //Todo: ability to use anisotropy _this.container.css({ minHeight: 300, minWidth: 300 }); _this.stage = new PreviewStage(extendOptions(_this.options, {container: _this.container})); _this.stage.previewObject = _this; _this.contentProvider = new ContentProvider(_this.contentSource, function (contentProvider) { // _this.pageCount = contentProvider.pageCount = utils.limitAt(contentProvider.pageCount, 1, 2 * 5); var options = { pageCount: contentProvider.pageCount, stackCount: 6, segments: 20, width: contentProvider.bookSize.width, height: contentProvider.bookSize.height }; // _this.checkOpenPage(); _this.target = book = _this.stage.target = new MOCKUP.Book(extendOptions(_this.options, options), _this.stage); _this.extendtarget(); createUI(_this.container, _this); //bookStage.setTarget(_this.target); book.ui = _this.ui; book.container = _this.container; contentProvider.webgl = webgl; contentProvider.setTarget(_this.target); book.getContentLayer = function (pageNumber) { var isRTL = book.direction == DFLIP.DIRECTION.RTL, left = _this.stage.cssScene.divLeft.element, right = _this.stage.cssScene.divRight.element; var baseActive = getBasePage(book._activePage); //if(isRTL){ // if(pageNumber == 0 || pageNumber == 1) return right; // if(pageNumber == book.pageCount) return left; //} if (isBookletMode(book)) return isRTL ? left : right; if (pageNumber % 2 == 0) return isRTL ? right : left; else return isRTL ? left : right; //else // return null; }; book.stage = _this.stage; book.flipCallback = function () { if (_this.contentProvider) { _this.contentProvider.review("flipCallback"); var baseActive = getBasePage(book._activePage); var width, height; var pageLeft = book.getPageByNumber(baseActive), pageRight = book.getPageByNumber(baseActive + 1); //if (page3d != null) { // var isLeft = (pageNumber % 2 == 0); var divLeft = book.parent.cssScene.divLeft, divRight = book.parent.cssScene.divRight; var isSingle = book.pageMode == DFLIP.PAGE_MODE.SINGLE; var isRTL = book.direction == DFLIP.DIRECTION.RTL; if (pageLeft != null && divLeft != null) { width = Math.abs(pageLeft.geometry.boundingBox.max.x - pageLeft.geometry.boundingBox.min.x); height = Math.abs(pageLeft.geometry.boundingBox.max.z - pageLeft.geometry.boundingBox.min.z); divLeft.rotation.y = -Math.atan2(height, width) * 0.9; divLeft.position.z = height * 0.8; divLeft.position.x = height / 2.5; $(divLeft.element).css({ width: width, left: -width / 2//baseActive == 0 && isRTL == true? width //: baseActive == book.pageCount && isRTL == true ? 0 : -width / 2 }); } if (pageRight != null && divRight != null) { width = Math.abs(pageRight.geometry.boundingBox.max.x - pageRight.geometry.boundingBox.min.x); height = Math.abs(pageRight.geometry.boundingBox.max.z - pageRight.geometry.boundingBox.min.z); divRight.rotation.y = Math.atan2(height, width) * 0.9; divRight.position.z = height * 0.8; divRight.position.x = -height / 2.5; $(divRight.element).css({ width: width, left: width / 2// == 0 && isRTL == true ? 0 //: baseActive == book.pageCount && isRTL == true ? -width : width / 2 }); } if (_this.options.onFlip != null) _this.options.onFlip(_this); } }; book.resize = function () { _this.resize(); }(); book.updatePageCallback = function () { _this.ui.update(); _this.checkCenter(); _this.stage.renderRequestPending = true; }; var divLeft = $(_this.stage.cssScene.divLeft.element); var divRight = $(_this.stage.cssScene.divRight.element); book.preFlipCallback = function () { divLeft.empty(); divRight.empty(); if (_this.options.beforeFlip != null) _this.options.beforeFlip(_this); _this.playSound(); }; $(window).trigger("resize"); divLeft.css({ width: contentProvider.bookSize.width, height: contentProvider.bookSize.height, left: -contentProvider.bookSize.width / 2 }); divRight.css({ width: contentProvider.bookSize.width, height: contentProvider.bookSize.height, left: contentProvider.bookSize.width / 2 }); book.ease = TWEEN.Easing.Cubic.InOut; //book.ease = TWEEN.Easing.Quadratic.InOut; book.contentProvider = contentProvider; book.duration = _this.options.duration; book.gotoPage(book._activePage); book.flipCallback(); if (_this.options.isLightBox == true) { _this.analytics({ eventAction: "Book Ready", options: _this.options }); } if (_this.options.onReady != null) _this.options.onReady(_this); }, options, _this); }); } else { _this.contentProvider = new ContentProvider(_this.contentSource, function (contentProvider) { // _this.pageCount = contentProvider.pageCount = utils.limitAt(contentProvider.pageCount, 1, 2 * 5); var options = { pageCount: contentProvider.pageCount, contentSourceType: contentProvider.contentSourceType }; // _this.checkOpenPage(); _this.target = book = new BookCSS(extendOptions(_this.options, options), _this.container); _this.target.previewObject = _this; _this.extendtarget(); createUI(_this.container, _this); contentProvider.webgl = webgl; contentProvider.setTarget(_this.target); contentProvider.waitPeriod = 2; book.ease = TWEEN.Easing.Quadratic.InOut; book.duration = _this.options.duration; /* _this.ui.prev.hide(); _this.ui.next.hide(); _this.ui.prev = book.prevButton; _this.ui.next = book.nextButton;*/ book.container = _this.container; book.updatePageCallback = function () { _this.ui.update(); _this.checkCenter(); }; book.resize = function () { _this.resize(); }(); $(window).trigger("resize"); book.flipCallback = function () { if (_this.contentProvider) { _this.contentProvider.review("flipCallback"); if (_this.options.onFlip != null) _this.options.onFlip(_this); } }; book.preFlipCallback = function () { if (_this.options.beforeFlip != null) _this.options.beforeFlip(_this); _this.playSound(); }; book.gotoPage(book._activePage); book.flipCallback(); if (_this.options.onReady != null) _this.options.onReady(_this); _this.analytics({ eventAction: "Book Ready", options: _this.options }); }, options, _this); } } ; FlipBook.prototype.extendtarget = function () { var _this = this; _this.target.previewObject = _this; _this.target.reset = function () { for (var pageCount = 0; pageCount < _this.target.children.length; pageCount++) { var page = _this.target.children[pageCount]; page.skipFlip = true; page.name = '-2'; } _this.contentProvider.annotedPage = '-2'; _this.target.refresh(); } }; FlipBook.prototype.getURLHash = function () { if (this.options.id != null) { var hash = utils.getSharePrefix() + (this.options.slug != null ? this.options.slug : this.options.id) + "/"; if (this.target != null && this.target._activePage != null) { hash += this.target._activePage + "/"; } window.location.hash = hash; } return window.location.href; }; /* Depreciated handled through getOptions FlipBook.prototype.checkOpenPage = function () { //options value is overridden by attribute if (this.options.id != null) { var book = $("#" + this.options.id); if (book.length > 0 && book.data("page") != null) { var pageNumber = parseInt(book.data("page"), 10); if (!isNaN(pageNumber)) this.options.openPage = pageNumber; } } };*/ FlipBook.prototype.end = function () { this.target.gotoPage(this.target.endPage); }; FlipBook.prototype.gotoPage = function (pageNumber) { this.target.gotoPage(pageNumber); if (this.ui != null) this.ui.update(); }; FlipBook.prototype.prev = function () { this.target.prev(); }; FlipBook.prototype.next = function () { this.target.next(); }; FlipBook.prototype.updateInfo = function (info) { if (this.container && this.container.info && this.container.info.html) this.container.info.html(info); } FlipBook.prototype.analytics = function (eventData) { if (this.options.enableAnalytics == true) { try { var options = eventData.options, eventLabel = undefined; if (options) { eventLabel = options.bookTitle || options.slug || options.id; } var analyticsTag = window.gtag; if (analyticsTag) { analyticsTag('event', eventData.eventAction, { 'event_category': 'Flipbook', 'event_label': eventLabel }); } else { var analytics = window.ga || window.__gaTracker; analytics("send", { hitType: 'event', eventCategory: 'Flipbook', eventAction: eventData.eventAction, eventLabel: eventLabel }); } } catch (e) { //silent suppress } } } return FlipBook; })(PreviewObject); $.fn.extend({ shelf: function () { }, flipBook: function (source, options) { return new FlipBook($(this), source, extendDFlipOptions(options)); } }); }) (DFLIP, jQuery); //Polyfills /** * Blob.js Polyfill * A Blob implementation. * 2014-07-24 * * By Eli Grey, http://eligrey.com * By Devin Samarin, https://github.com/dsamarin * License: X11/MIT */ (function (view) { "use strict"; view.URL = view.URL || view.webkitURL; if (view.Blob && view.URL) { try { new Blob; return; } catch (e) { } } // Internally we use a BlobBuilder implementation to base Blob off of // in order to support older browsers that only have BlobBuilder var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function (view) { var get_class = function (object) { return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; }, FakeBlobBuilder = function BlobBuilder() { this.data = []; }, FakeBlob = function Blob(data, type, encoding) { this.data = data; this.size = data.length; this.type = type; this.encoding = encoding; }, FBB_proto = FakeBlobBuilder.prototype, FB_proto = FakeBlob.prototype, FileReaderSync = view.FileReaderSync, FileException = function (type) { this.code = this[this.name = type]; }, file_ex_codes = ( "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" ).split(" "), file_ex_code = file_ex_codes.length, real_URL = view.URL || view.webkitURL || view, real_create_object_URL = real_URL.createObjectURL, real_revoke_object_URL = real_URL.revokeObjectURL, URL = real_URL, btoa = view.btoa, atob = view.atob, ArrayBuffer = view.ArrayBuffer, Uint8Array = view.Uint8Array, origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/ ; FakeBlob.fake = FB_proto.fake = true; while (file_ex_code--) { FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; } // Polyfill URL if (!real_URL.createObjectURL) { URL = view.URL = function (uri) { var uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a"), uri_origin ; uri_info.href = uri; if (!("origin" in uri_info)) { if (uri_info.protocol.toLowerCase() === "data:") { uri_info.origin = null; } else { uri_origin = uri.match(origin); uri_info.origin = uri_origin && uri_origin[1]; } } return uri_info; }; } URL.createObjectURL = function (blob) { var type = blob.type, data_URI_header ; if (type === null) { type = "application/octet-stream"; } if (blob instanceof FakeBlob) { data_URI_header = "data:" + type; if (blob.encoding === "base64") { return data_URI_header + ";base64," + blob.data; } else if (blob.encoding === "URI") { return data_URI_header + "," + decodeURIComponent(blob.data); } if (btoa) { return data_URI_header + ";base64," + btoa(blob.data); } else { return data_URI_header + "," + encodeURIComponent(blob.data); } } else if (real_create_object_URL) { return real_create_object_URL.call(real_URL, blob); } }; URL.revokeObjectURL = function (object_URL) { if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { real_revoke_object_URL.call(real_URL, object_URL); } }; FBB_proto.append = function (data/*, endings*/) { var bb = this.data; // decode data to a binary string if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { var str = "", buf = new Uint8Array(data), i = 0, buf_len = buf.length ; for (; i < buf_len; i++) { str += String.fromCharCode(buf[i]); } bb.push(str); } else if (get_class(data) === "Blob" || get_class(data) === "File") { if (FileReaderSync) { var fr = new FileReaderSync; bb.push(fr.readAsBinaryString(data)); } else { // async FileReader won't work as BlobBuilder is sync throw new FileException("NOT_READABLE_ERR"); } } else if (data instanceof FakeBlob) { if (data.encoding === "base64" && atob) { bb.push(atob(data.data)); } else if (data.encoding === "URI") { bb.push(decodeURIComponent(data.data)); } else if (data.encoding === "raw") { bb.push(data.data); } } else { if (typeof data !== "string") { data += ""; // convert unsupported types to strings } // decode UTF-16 to binary string bb.push(unescape(encodeURIComponent(data))); } }; FBB_proto.getBlob = function (type) { if (!arguments.length) { type = null; } return new FakeBlob(this.data.join(""), type, "raw"); }; FBB_proto.toString = function () { return "[object BlobBuilder]"; }; FB_proto.slice = function (start, end, type) { var args = arguments.length; if (args < 3) { type = null; } return new FakeBlob( this.data.slice(start, args > 1 ? end : this.data.length), type, this.encoding ); }; FB_proto.toString = function () { return "[object Blob]"; }; FB_proto.close = function () { this.size = 0; delete this.data; }; return FakeBlobBuilder; }(view)); view.Blob = function (blobParts, options) { var type = options ? (options.type || "") : ""; var builder = new BlobBuilder(); if (blobParts) { for (var i = 0, len = blobParts.length; i < len; i++) { if (Uint8Array && blobParts[i] instanceof Uint8Array) { builder.append(blobParts[i].buffer); } else { builder.append(blobParts[i]); } } } var blob = builder.getBlob(type); if (!blob.slice && blob.webkitSlice) { blob.slice = blob.webkitSlice; } return blob; }; var getPrototypeOf = Object.getPrototypeOf || function (object) { return object.__proto__; }; view.Blob.prototype = getPrototypeOf(new view.Blob()); }(window)); /** * canvas-toBlob.js Polyfill * A canvas.toBlob() implementation. * 2013-12-27 * * By Eli Grey, http://eligrey.com and Devin Samarin, https://github.com/eboyjr * License: X11/MIT * See https://github.com/eligrey/canvas-toBlob.js/blob/master/LICENSE.md */ (function (view) { "use strict"; var Uint8Array = view.Uint8Array, HTMLCanvasElement = view.HTMLCanvasElement, canvas_proto = HTMLCanvasElement && HTMLCanvasElement.prototype, is_base64_regex = /\s*;\s*base64\s*(?:;|$)/i, to_data_url = "toDataURL", base64_ranks, decode_base64 = function (base64) { var len = base64.length, buffer = new Uint8Array(len / 4 * 3 | 0), i = 0, outptr = 0, last = [0, 0], state = 0, save = 0, rank, code; while (len--) { code = base64.charCodeAt(i++); rank = base64_ranks[code - 43]; if (rank !== 255 && rank != null) { last[1] = last[0]; last[0] = code; save = (save << 6) | rank; state++; if (state === 4) { buffer[outptr++] = save >>> 16; if (last[1] !== 61 /* padding character */) { buffer[outptr++] = save >>> 8; } if (last[0] !== 61 /* padding character */) { buffer[outptr++] = save; } state = 0; } } } // 2/3 chance there's going to be some null bytes at the end, but that // doesn't really matter with most image formats. // If it somehow matters for you, truncate the buffer up outptr. return buffer; } ; if (Uint8Array) { base64_ranks = new Uint8Array([ 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 ]); } if (HTMLCanvasElement && !canvas_proto.toBlob) { canvas_proto.toBlob = function (callback, type /*, ...args*/) { if (!type) { type = "image/png"; } if (this.mozGetAsFile) { callback(this.mozGetAsFile("canvas", type)); return; } if (this.msToBlob && /^\s*image\/png\s*(?:$|;)/i.test(type)) { callback(this.msToBlob()); return; } var args = Array.prototype.slice.call(arguments, 1), dataURI = this[to_data_url].apply(this, args), header_end = dataURI.indexOf(","), data = dataURI.substring(header_end + 1), is_base64 = is_base64_regex.test(dataURI.substring(0, header_end)), blob ; if (Blob.fake) { // no reason to decode a data: URI that's just going to become a data URI again blob = new Blob; if (is_base64) { blob.encoding = "base64"; } else { blob.encoding = "URI"; } blob.data = data; blob.size = data.length; } else if (Uint8Array) { if (is_base64) { blob = new Blob([decode_base64(data)], {type: type}); } else { blob = new Blob([decodeURIComponent(data)], {type: type}); } } callback(blob); }; if (canvas_proto.toDataURLHD) { canvas_proto.toBlobHD = function () { to_data_url = "toDataURLHD"; var blob = this.toBlob(); to_data_url = "toDataURL"; return blob; } } else { canvas_proto.toBlobHD = canvas_proto.toBlob; } } }(window)); /** * performance.now polyfill **/ (function PerformanceNowPolyfill() { if ('performance' in window === false) { window.performance = {}; } // IE 8 Date.now = (Date.now || function () { return new Date().getTime(); }); if ('now' in window.performance === false) { var offset = window.performance.timing && window.performance.timing.navigationStart ? window.performance.timing.navigationStart : Date.now(); window.performance.now = function () { return Date.now() - offset; }; } })(); /** * Tween.js - Licensed under the MIT license * https://github.com/tweenjs/tween.js */ (function TweenJs() { var TWEEN = TWEEN || (function () { var _tweens = []; return { getAll: function () { return _tweens; }, removeAll: function () { _tweens = []; }, add: function (tween) { _tweens.push(tween); }, remove: function (tween) { var i = _tweens.indexOf(tween); if (i !== -1) { _tweens.splice(i, 1); } }, update: function (time) { if (_tweens.length === 0) { return false; } var i = 0; time = time != null ? time : window.performance.now(); while (i < _tweens.length) { if (_tweens[i].update(time)) { i++; } else { _tweens.splice(i, 1); } } return true; } }; })(); TWEEN.Tween = function (object) { var _object = object; var _valuesStart = {}; var _valuesEnd = {}; var _valuesStartRepeat = {}; var _duration = 1000; var _repeat = 0; var _yoyo = false; var _isPlaying = false; var _reversed = false; var _delayTime = 0; var _startTime = null; var _easingFunction = TWEEN.Easing.Linear.None; var _interpolationFunction = TWEEN.Interpolation.Linear; var _chainedTweens = []; var _onStartCallback = null; var _onStartCallbackFired = false; var _onUpdateCallback = null; var _onCompleteCallback = null; var _onStopCallback = null; // Set all starting values present on the target object for (var field in object) { _valuesStart[field] = parseFloat(object[field], 10); } this.to = function (properties, duration) { if (duration != null) { _duration = duration; } _valuesEnd = properties; return this; }; this.start = function (time) { TWEEN.add(this); _isPlaying = true; _onStartCallbackFired = false; _startTime = time != null ? time : window.performance.now(); _startTime += _delayTime; for (var property in _valuesEnd) { // Check if an Array was provided as property value if (_valuesEnd[property] instanceof Array) { if (_valuesEnd[property].length === 0) { continue; } // Create a local copy of the Array with the start value at the front _valuesEnd[property] = [_object[property]].concat(_valuesEnd[property]); } // If `to()` specifies a property that doesn't exist in the source object, // we should not set that property in the object if (_valuesStart[property] === null) { continue; } _valuesStart[property] = _object[property]; if ((_valuesStart[property] instanceof Array) === false) { _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings } _valuesStartRepeat[property] = _valuesStart[property] || 0; } return this; }; this.stop = function () { if (!_isPlaying) { return this; } TWEEN.remove(this); _isPlaying = false; if (_onStopCallback !== null) { _onStopCallback.call(_object); } this.stopChainedTweens(); return this; }; this.stopChainedTweens = function () { for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { _chainedTweens[i].stop(); } }; this.complete = function () { if (!_isPlaying) { return this; } TWEEN.remove(this); _isPlaying = false; if (_onCompleteCallback !== null) { _onCompleteCallback.call(_object); } this.completeChainedTweens(); return this; }; this.completeChainedTweens = function () { for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { _chainedTweens[i].complete(); } }; this.delay = function (amount) { _delayTime = amount; return this; }; this.repeat = function (times) { _repeat = times; return this; }; this.yoyo = function (yoyo) { _yoyo = yoyo; return this; }; this.easing = function (easing) { _easingFunction = easing == null ? _easingFunction : easing; return this; }; this.interpolation = function (interpolation) { _interpolationFunction = interpolation; return this; }; this.chain = function () { _chainedTweens = arguments; return this; }; this.onStart = function (callback) { _onStartCallback = callback; return this; }; this.onUpdate = function (callback) { _onUpdateCallback = callback; return this; }; this.onComplete = function (callback) { _onCompleteCallback = callback; return this; }; this.onStop = function (callback) { _onStopCallback = callback; return this; }; this.update = function (time) { var property; var elapsed; var value; if (time < _startTime) { return true; } if (_onStartCallbackFired === false) { if (_onStartCallback !== null) { _onStartCallback.call(_object); } _onStartCallbackFired = true; } elapsed = (time - _startTime) / _duration; elapsed = elapsed > 1 ? 1 : elapsed; value = _easingFunction(elapsed); for (property in _valuesEnd) { // Don't update properties that do not exist in the source object if (_valuesStart[property] === null) { continue; } var start = _valuesStart[property] || 0; var end = _valuesEnd[property]; if (end instanceof Array) { _object[property] = _interpolationFunction(end, value); } else { // Parses relative end values with start as base (e.g.: +10, -3) if (typeof (end) === 'string') { if (end.startsWith('+') || end.startsWith('-')) { end = start + parseFloat(end, 10); } else { end = parseFloat(end, 10); } } // Protect against non numeric properties. if (typeof (end) === 'number') { _object[property] = start + (end - start) * value; } } } if (_onUpdateCallback !== null) { _onUpdateCallback.call(_object, value); } if (elapsed === 1) { if (_repeat > 0) { if (isFinite(_repeat)) { _repeat--; } // Reassign starting values, restart by making startTime = now for (property in _valuesStartRepeat) { if (typeof (_valuesEnd[property]) === 'string') { _valuesStartRepeat[property] = _valuesStartRepeat[property] + parseFloat(_valuesEnd[property], 10); } if (_yoyo) { var tmp = _valuesStartRepeat[property]; _valuesStartRepeat[property] = _valuesEnd[property]; _valuesEnd[property] = tmp; } _valuesStart[property] = _valuesStartRepeat[property]; } if (_yoyo) { _reversed = !_reversed; } _startTime = time + _delayTime; return true; } else { if (_onCompleteCallback !== null) { _onCompleteCallback.call(_object); } for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { // Make the chained tweens start exactly at the time they should, // even if the `update()` method was called way past the duration of the tween _chainedTweens[i].start(_startTime + _duration); } return false; } } return true; }; }; TWEEN.Easing = { Linear: { None: function (k) { return k; } }, Quadratic: { In: function (k) { return k * k; }, Out: function (k) { return k * (2 - k); }, InOut: function (k) { if ((k *= 2) < 1) { return 0.5 * k * k; } return -0.5 * (--k * (k - 2) - 1); } }, Quartic: { In: function (k) { return k * k * k * k; }, Out: function (k) { return 1 - (--k * k * k * k); }, InOut: function (k) { if ((k *= 2) < 1) { return 0.5 * k * k * k * k; } return -0.5 * ((k -= 2) * k * k * k - 2); } }, Sinusoidal: { In: function (k) { return 1 - Math.cos(k * Math.PI / 2); }, Out: function (k) { return Math.sin(k * Math.PI / 2); }, InOut: function (k) { return 0.5 * (1 - Math.cos(Math.PI * k)); } }, Cubic: { In: function (k) { return k * k * k; }, Out: function (k) { return --k * k * k + 1; }, InOut: function (k) { if ((k *= 2) < 1) { return 0.5 * k * k * k; } return 0.5 * ((k -= 2) * k * k + 2); } } }; TWEEN.Interpolation = { Linear: function (v, k) { var m = v.length - 1; var f = m * k; var i = Math.floor(f); var fn = TWEEN.Interpolation.Utils.Linear; if (k < 0) { return fn(v[0], v[1], f); } if (k > 1) { return fn(v[m], v[m - 1], m - f); } return fn(v[i], v[i + 1 > m ? m : i + 1], f - i); }, Bezier: function (v, k) { var b = 0; var n = v.length - 1; var pw = Math.pow; var bn = TWEEN.Interpolation.Utils.Bernstein; for (var i = 0; i <= n; i++) { b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i); } return b; }, Utils: { Linear: function (p0, p1, t) { return (p1 - p0) * t + p0; }, Bernstein: function (n, i) { var fc = TWEEN.Interpolation.Utils.Factorial; return fc(n) / fc(i) / fc(n - i); }, Factorial: (function () { var a = [1]; return function (n) { var s = 1; if (a[n]) { return a[n]; } for (var i = n; i > 1; i--) { s *= i; } a[n] = s; return s; }; })(), CatmullRom: function (p0, p1, p2, p3, t) { var v0 = (p2 - p0) * 0.5; var v1 = (p3 - p1) * 0.5; var t2 = t * t; var t3 = t * t2; return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; } } }; window.TWEEN = TWEEN; })(); DFLIP.createBlob = function createBlob(data, contentType) { if (typeof Blob !== 'undefined') { return new Blob([data], {type: contentType}); } // Blob builder is deprecated in FF14 and removed in FF18. var bb = new MozBlobBuilder(); bb.append(data); return bb.getBlob(contentType); }; DFLIP.createObjectURL = (function createObjectURLClosure() { // Blob/createObjectURL is not available, falling back to data schema. var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; return function createObjectURL(data, contentType) { if (typeof URL !== 'undefined' && URL.createObjectURL) { var blob = DFLIP.createBlob(data, contentType); return URL.createObjectURL(blob); } var buffer = 'data:' + contentType + ';base64,'; for (var i = 0, ii = data.length; i < ii; i += 3) { var b1 = data[i] & 0xFF; var b2 = data[i + 1] & 0xFF; var b3 = data[i + 2] & 0xFF; var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; } return buffer; }; })(); var ThumbList = (function ThumbListClosure() { function ThumbList(config) { var width = (config && config.w + 'px') || '100%'; var height = (config && config.h + 'px') || '100%'; var itemHeight = this.itemHeight = config.itemHeight; this.items = config.items; this.generatorFn = config.generatorFn; this.totalRows = config.totalRows || (config.items && config.items.length); this.addFn = config.addFn; this.scrollFn = config.scrollFn; var scroller = ThumbList.createScroller(itemHeight * this.totalRows); this.container = ThumbList.createContainer(width, height); this.container.appendChild(scroller); this.screenItemsLen = Math.ceil(config.h / itemHeight); this.offsetItems = this.screenItemsLen; // Cache 4 times the number of items that fit in the container viewport this.cachedItemsLen = this.screenItemsLen + this.offsetItems * 2; this._renderChunk(this.container, 0); var self = this; self.lastRepaintY = 0; var maxBuffer = this.screenItemsLen * itemHeight; var lastScrolled = 0; var requestInterval; function onScroll(e) { var scrollTop = e.target.scrollTop; // Triggers reflow if (!self.lastRepaintY || Math.abs(scrollTop - self.lastRepaintY) >= (self.offsetItems * self.itemHeight)) { var first = parseInt(scrollTop / itemHeight, 10) - self.offsetItems; self._renderChunk(self.container, first < 0 ? 0 : first); self.lastRepaintY = scrollTop; } self.lastScrolled = lastScrolled = Date.now(); if (self.scrollFn != null) { self.scrollFn(); } e.preventDefault && e.preventDefault(); } self.dispose = function () { if (self.container) { if (self.container.parentNode) { self.container.parentNode.removeChild(self.container); } } self.container.removeEventListener('scroll', onScroll); }; self.container.addEventListener('scroll', onScroll); } ThumbList.prototype.reset = function (height) { //container.find(".df-vrow").remove(); this.screenItemsLen = Math.ceil(height / this.itemHeight); this.cachedItemsLen = this.screenItemsLen + this.offsetItems * 2; var first = parseInt(this.lastRepaintY / this.itemHeight, 10) - this.offsetItems; //this.lastRepaintY = 0; this.needReset = true; this._renderChunk(this.container, Math.max(first, 0)); }; ThumbList.prototype.createRow = function (i) { var item; if (this.generatorFn) { item = this.generatorFn(i); item.classList.add('df-vrow'); item.style.position = 'absolute'; item.style.top = (i * this.itemHeight) + 'px'; item.setAttribute("index", i); } return item; }; /** * Renders a particular, consecutive chunk of the total rows in the list. To * keep acceleration while scrolling, we mark the nodes that are candidate for * deletion instead of deleting them right away, which would suddenly stop the * acceleration. We delete them once scrolling has finished. * * @param {Node} node Parent node where we want to append the children chunk. * @param {Number} from Starting position, i.e. first children index. * @return {void} */ ThumbList.prototype._renderChunk = function (node, from) { var isEmpty = this.range == null; this.range = this.range || {min: 0, max: this.cachedItemsLen}; var range = this.range; var min = range.min, max = range.max; var isAdd = isEmpty ? true : from >= min; if (!isEmpty && from == min && this.needReset == false) return; var countVar; var start = isEmpty ? min : isAdd ? max : from;// - this.cachedItemsLen/3; start = start > this.totalRows ? this.totalRows : start < 0 ? 0 : start; var end = from + this.cachedItemsLen;//this.cachedItemsLen/3); end = end > this.totalRows ? this.totalRows : end; for (countVar = start; countVar < end; countVar++) { if (isAdd) node.appendChild(this.createRow(countVar)); else node.insertBefore(this.createRow(countVar), node.childNodes[1 + countVar - start]); if (this.addFn != null) { this.addFn(countVar); } } var difference = Math.abs(from - min); this.needReset = false; if (!isEmpty && node.childNodes.length > (this.cachedItemsLen + 1)) { // Hide and mark obsolete nodes for deletion. var delStart = isAdd ? 1 : 1 + this.cachedItemsLen, delEnd = delStart + (end - start); for (var j = delEnd; j > delStart; j--) { if (node.childNodes[delStart]) this.container.removeChild(node.childNodes[delStart]); } } this.range.min = from; this.range.max = end; }; ThumbList.createContainer = function (w, h) { var c = document.createElement('div'); c.style.width = w; c.style.height = h; c.style.overflow = 'auto'; c.style.position = 'relative'; c.style.padding = 0; //c.style.border = '1px solid black'; return c; }; ThumbList.createScroller = function (h) { var scroller = document.createElement('div'); scroller.style.opacity = 0; scroller.style.position = 'absolute'; scroller.style.top = 0; scroller.style.left = 0; scroller.style.width = '1px'; scroller.style.height = h + 'px'; return scroller; }; return ThumbList; })(); /** * @typedef {Object} BookMarkViewerOptions * @property {HTMLDivElement} container - The viewer element. * @property {IPDFLinkService} linkService - The navigation/linking service. */ /** * @typedef {Object} BookMarkViewerRenderParameters * @property {Array|null} outline - An array of outline objects. */ /** * @class */ var BookMarkViewer = (function BookMarkViewerClosure() { /** * @constructs BookMarkViewer * @param {BookMarkViewerOptions} options */ function BookMarkViewer(options) { this.outline = null; this.lastToggleIsShow = true; this.container = options.container; this.linkService = options.linkService; this.outlineItemClass = options.outlineItemClass || "outlineItem"; this.outlineToggleClass = options.outlineToggleClass || "outlineItemToggler"; this.outlineToggleHiddenClass = options.outlineToggleHiddenClass || "outlineItemsHidden"; } BookMarkViewer.prototype = { dispose: function () { if (this.container) { if (this.container.parentNode) { this.container.parentNode.removeChild(this.container); } } this.linkService = null; }, reset: function BookMarkViewer_reset() { this.outline = null; this.lastToggleIsShow = true; var container = this.container; while (container.firstChild) { container.removeChild(container.firstChild); } }, /** * @private */ _dispatchEvent: function BookMarkViewer_dispatchEvent(outlineCount) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('outlineloaded', true, true, { outlineCount: outlineCount }); this.container.dispatchEvent(event); }, /** * @private */ _bindLink: function BookMarkViewer_bindLink(element, item) { var linkService = this.linkService; if (item.custom == true) { element.href = linkService.getCustomDestinationHash(item.dest); element.onclick = function goToDestination(e) { linkService.customNavigateTo(item.dest); return false; }; } else { if (item.url) { pdfjsLib.addLinkAttributes(element, {url: item.url}); return; } element.href = linkService.getDestinationHash(item.dest); element.onclick = function goToDestination(e) { linkService.navigateTo(item.dest); return false; }; } }, /** * Prepend a button before an outline item which allows the user to toggle * the visibility of all outline items at that level. * * @private */ _addToggleButton: function BookMarkViewer_addToggleButton(div) { var toggler = document.createElement('div'); toggler.className = this.outlineToggleClass + " " + this.outlineToggleHiddenClass; toggler.onclick = function (event) { event.stopPropagation(); toggler.classList.toggle(this.outlineToggleHiddenClass); if (event.shiftKey) { var shouldShowAll = !toggler.classList.contains(this.outlineToggleHiddenClass); this._toggleOutlineItem(div, shouldShowAll); } }.bind(this); div.insertBefore(toggler, div.firstChild); }, /** * Toggle the visibility of the subtree of an outline item. * * @param {Element} root - the root of the outline (sub)tree. * @param {boolean} show - whether to show the outline (sub)tree. If false, * the outline subtree rooted at |root| will be collapsed. * * @private */ _toggleOutlineItem: function BookMarkViewer_toggleOutlineItem(root, show) { this.lastToggleIsShow = show; var togglers = root.querySelectorAll('.' + this.outlineToggleClass); for (var i = 0, ii = togglers.length; i < ii; ++i) { togglers[i].classList[show ? 'remove' : 'add'](this.outlineToggleHiddenClass); } }, /** * Collapse or expand all subtrees of the outline. */ toggleOutlineTree: function BookMarkViewer_toggleOutlineTree() { if (!this.outline) { return; } this._toggleOutlineItem(this.container, !this.lastToggleIsShow); }, /** * @param {BookMarkViewerRenderParameters} params */ render: function BookMarkViewer_render(params) { var outline = (params && params.outline) || null; var outlineCount = 0; if (this.outline) { this.reset(); } this.outline = outline; if (!outline) { //this._dispatchEvent(outlineCount); return; } var fragment = document.createDocumentFragment(); var queue = [{parent: fragment, items: this.outline}]; var hasAnyNesting = false; while (queue.length > 0) { var levelData = queue.shift(); var isCustom = levelData.custom; for (var i = 0, len = levelData.items.length; i < len; i++) { var item = levelData.items[i]; var div = document.createElement('div'); div.className = this.outlineItemClass; var element = document.createElement('a'); if (item.custom == null && isCustom != null) item.custom = isCustom; this._bindLink(element, item); //element. element.textContent = item.title.replace(/\x00/g, ''); //PDFJS.removeNullCharacters(item.title) || "Untitled Bookmark"; div.appendChild(element); if (item.items && item.items.length > 0) { hasAnyNesting = true; this._addToggleButton(div); var itemsDiv = document.createElement('div'); itemsDiv.className = this.outlineItemClass + "s"; div.appendChild(itemsDiv); queue.push({parent: itemsDiv, custom: item.custom, items: item.items}); } levelData.parent.appendChild(div); outlineCount++; } } if (hasAnyNesting) { if (this.container.classList != null) { this.container.classList.add(this.outlineItemClass + "s"); } else if (this.container.className != null) { this.container.className += " picWindow"; } } this.container.appendChild(fragment); this._dispatchEvent(outlineCount); } }; return BookMarkViewer; })(); //PDFJS.PDFOutlineViewer = PDFOutlineViewer; var DFLightBox = (function DFLightBoxClosure($) { /** * @constructs DFLightBox * @param closeCallback callBack function required to dispose object properly when lighbox is closed */ function DFLightBox(closeCallback, options) { this.duration = 300; //cache this var _this = this; //lightbox wrapper div _this.lightboxWrapper = $("<div>").addClass("df-lightbox-wrapper"); //lightbox container _this.container = $("<div>").addClass("df-container").appendTo(_this.lightboxWrapper); //lightbox controls _this.controls = $("<div>").addClass("df-lightbox-controls").appendTo(_this.lightboxWrapper); //lightbox close button _this.closeButton = $("<div>").addClass("df-lightbox-close df-ui-btn") .on("click", function () { _this.close(closeCallback); }) .appendTo(_this.controls); _this.lightboxWrapper.append(_this.container); return _this; } DFLightBox.prototype.show = function (callback) { if (this.lightboxWrapper.parent().length == 0) $("body").append(this.lightboxWrapper); $("html,body").addClass("df-lightbox-open"); this.lightboxWrapper.fadeIn(this.duration, callback); return this; }; DFLightBox.prototype.close = function (callback) { this.lightboxWrapper.fadeOut(this.duration); setTimeout(callback, this.duration); $("html,body").removeClass("df-lightbox-open"); return this; }; return DFLightBox; })(jQuery); DFLIP.Share = (function ShareClosure($) { function Share(container, options) { var _this = this; var htmlDiv = '<div>'; var shareButtonClass = "df-share-button"; var windowParameters = "width=500,height=400"; _this.isOpen = false; _this.shareUrl = ""; _this.wrapper = $('<div class="df-share-wrapper" style="display: none;">') .on("click", function (e) { _this.close(); }); _this.box = $('<div class="df-share-box">') .on("click", function (e) { e.preventDefault(); e.stopPropagation(); }).appendTo(_this.wrapper).html('<span class="df-share-title">' + options.text.share + '</span>'); _this.urlInput = $('<textarea class="df-share-url">').on("click", function () { $(this).select(); }); _this.facebook = $(htmlDiv, { class: shareButtonClass + " df-share-facebook " + options.icons['facebook'] }).on("click", function (e) { window.open('https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(_this.shareUrl), "Sharer", windowParameters); }); _this.google = $(htmlDiv, { class: shareButtonClass + " df-share-google " + options.icons['google'] }).on("click", function (e) { window.open('https://plus.google.com/share?url=' + encodeURIComponent(_this.shareUrl), "Sharer", windowParameters); }); _this.twitter = $(htmlDiv, { class: shareButtonClass + " df-share-twitter " + options.icons['twitter'] }).on("click", function (e) { window.open('http://twitter.com/share?url=' + encodeURIComponent(_this.shareUrl), "Sharer", windowParameters); }); _this.mail = $('<a>', { class: shareButtonClass + " df-share-mail " + options.icons['mail'], href: 'mailto:?subject=' + options.text['mailSubject'] + '&body=' + options.text['mailBody'].replace('{{url}}', encodeURIComponent(_this.shareUrl)), target: '_blank' }).on("click", function (e) { $(this).attr('href', 'mailto:?subject=' + options.text['mailSubject'] + '&body=' + options.text['mailBody'].replace('{{url}}', encodeURIComponent(_this.shareUrl))); e.stopPropagation();//so the default event is not cancelled by parent element }); _this.box.append(_this.urlInput).append(_this.facebook).append(_this.twitter).append(_this.mail); $(container).append(_this.wrapper); } Share.prototype.show = function () { this.wrapper.fadeIn(300); this.urlInput.val(this.shareUrl); this.urlInput.trigger("click"); this.isOpen = true; } Share.prototype.dispose = function () { var _this = this; _this.box.off(); _this.google.off(); _this.twitter.off(); _this.facebook.off(); _this.mail.off(); _this.urlInput.off(); _this.wrapper.off().remove(); } Share.prototype.close = function () { this.wrapper.fadeOut(300); this.isOpen = false; } Share.prototype.update = function (url) { this.shareUrl = url; } return Share; })(jQuery); DFLIP.Popup = (function PopupClosure($) { function Popup(container, options) { var _this = this; var htmlDiv = '<div>'; var windowParameters = "width=500,height=400"; _this.isOpen = false; _this.wrapper = $('<div class="df-popup-wrapper" style="display: none;">') .on("click", function (e) { _this.close(); }); _this.box = $('<div class="df-popup-box">') .on("click", function (e) { e.preventDefault(); e.stopPropagation(); }).appendTo(_this.wrapper); $(container).append(_this.wrapper); } Popup.prototype.show = function () { this.wrapper.fadeIn(300); this.isOpen = true; } Popup.prototype.dispose = function () { var _this = this; _this.box.off(); _this.wrapper.off().remove(); } Popup.prototype.close = function () { this.wrapper.fadeOut(300); this.isOpen = false; } return Popup; })(jQuery); /** * Performs navigation functions inside PDF, such as opening specified page, * or destination. * @class * @implements {IPDFLinkService} */ var PDFLinkService = (function () { /** * @constructs PDFLinkService */ function PDFLinkService() { this.baseUrl = null; this.pdfDocument = null; this.pdfViewer = null; this.pdfHistory = null; this._pagesRefCache = null; } PDFLinkService.prototype = { dispose: function () { this.baseUrl = null; this.pdfDocument = null; this.pdfViewer = null; this.pdfHistory = null; this._pagesRefCache = null; }, setDocument: function PDFLinkService_setDocument(pdfDocument, baseUrl) { this.baseUrl = baseUrl; this.pdfDocument = pdfDocument; this._pagesRefCache = Object.create(null); }, setViewer: function PDFLinkService_setViewer(pdfViewer) { this.pdfViewer = pdfViewer; this.externalLinkTarget = pdfViewer.previewObject.options.linkTarget; }, setHistory: function PDFLinkService_setHistory(pdfHistory) { this.pdfHistory = pdfHistory; }, /** * @returns {number} */ get pagesCount() { return this.pdfDocument.numPages; }, /** * @returns {number} */ get page() { return this.pdfViewer.currentPageNumber; }, /** * @param {number} value */ set page(value) { this.pdfViewer.currentPageNumber = value; }, /** * @param dest - The PDF destination object. */ navigateTo:function(dest) {//Deprecated in pdf.js 2.7.570 this.goToDestination(dest); }, /** * @param dest - The PDF destination object. */ goToDestination:function(dest) { var destString = ''; var self = this; var goToDestination = function (destRef) { // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..> var pageNumber = destRef instanceof Object ? self._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1); if (pageNumber) { //case double internal if (self.pdfViewer.contentProvider.options.pageSize == DFLIP.PAGE_SIZE.DOUBLEINTERNAL && pageNumber > 2) { pageNumber = pageNumber * 2 - 1; } if (pageNumber > self.pdfViewer.pageCount) { pageNumber = self.pdfViewer.pageCount; } self.pdfViewer.gotoPage(pageNumber); // self.pdfViewer.scrollPageIntoView(pageNumber, dest); if (self.pdfHistory) { // Update the browsing history. self.pdfHistory.push({ dest: dest, hash: destString, page: pageNumber }); } } else { self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { var pageNum = pageIndex + 1; var cacheKey = destRef.num + ' ' + destRef.gen + ' R'; self._pagesRefCache[cacheKey] = pageNum; goToDestination(destRef); }); } }; var destinationPromise; if (typeof dest === 'string') { destString = dest; destinationPromise = this.pdfDocument.getDestination(dest); } else { destinationPromise = Promise.resolve(dest); } destinationPromise.then(function (destination) { dest = destination; if (!(destination instanceof Array)) { return; // invalid destination } goToDestination(destination[0]); }); }, /** * @param dest - The PDF destination object. */ customNavigateTo: function PDFLinkService_navigateTo(dest) { if (dest == '' || dest == null || dest == 'null') return; var pageNumber = null; if (!isNaN(Math.round(dest))) { pageNumber = dest; } else if (typeof dest === 'string') { pageNumber = parseInt(dest.replace("#", ""), 10); if (isNaN(pageNumber)) { window.open(dest, (DFLIP.defaults.linkTarget == DFLIP.LINK_TARGET.SELF ? "_self" : "_blank")); return; } } if (pageNumber != null) this.pdfViewer.gotoPage(pageNumber); }, /** * @param dest - The PDF destination object. * @returns {string} The hyperlink to the PDF object. */ getDestinationHash: function PDFLinkService_getDestinationHash(dest) { if (typeof dest === 'string') { return this.getAnchorUrl('#' + escape(dest)); } if (dest instanceof Array) { var destRef = dest[0]; // see navigateTo method for dest format var pageNumber = destRef instanceof Object ? this._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1); if (pageNumber) { var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber); var destKind = dest[1]; if (typeof destKind === 'object' && 'name' in destKind && destKind.name === 'XYZ') { var scale = (dest[4] || this.pdfViewer.currentScaleValue); var scaleNumber = parseFloat(scale); if (scaleNumber) { scale = scaleNumber * 100; } pdfOpenParams += '&zoom=' + scale; if (dest[2] || dest[3]) { pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0); } } return pdfOpenParams; } } return this.getAnchorUrl(''); }, /** * @param dest - The PDF destination object. * @returns {string} The hyperlink to the PDF object. */ getCustomDestinationHash: function PDFLinkService_getCustomDestinationHash(dest) { //if (typeof dest === 'string') { return '#' + escape(dest); //} //return this.getAnchorUrl(''); }, /** * Prefix the full url on anchor links to make sure that links are resolved * relative to the current URL instead of the one defined in <base href>. * @param {String} anchor The anchor hash, including the #. * @returns {string} The hyperlink to the PDF object. */ getAnchorUrl: function PDFLinkService_getAnchorUrl(anchor) { return (this.baseUrl || '') + anchor; }, /** * @param {string} hash */ setHash: function PDFLinkService_setHash(hash) { if (hash.indexOf('=') >= 0) { var params = parseQueryString(hash); // borrowing syntax from "Parameters for Opening PDF Files" if ('nameddest' in params) { if (this.pdfHistory) { this.pdfHistory.updateNextHashParam(params.nameddest); } this.navigateTo(params.nameddest); return; } var pageNumber, dest; if ('page' in params) { pageNumber = (params.page | 0) || 1; } if ('zoom' in params) { // Build the destination array. var zoomArgs = params.zoom.split(','); // scale,left,top var zoomArg = zoomArgs[0]; var zoomArgNumber = parseFloat(zoomArg); if (zoomArg.indexOf('Fit') === -1) { // If the zoomArg is a number, it has to get divided by 100. If it's // a string, it should stay as it is. dest = [null, {name: 'XYZ'}, zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null, zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null, (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)]; } else { if (zoomArg === 'Fit' || zoomArg === 'FitB') { dest = [null, {name: zoomArg}]; } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') || (zoomArg === 'FitV' || zoomArg === 'FitBV')) { dest = [null, {name: zoomArg}, zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null]; } else if (zoomArg === 'FitR') { if (zoomArgs.length !== 5) { console.error('PDFLinkService_setHash: ' + 'Not enough parameters for \'FitR\'.'); } else { dest = [null, {name: zoomArg}, (zoomArgs[1] | 0), (zoomArgs[2] | 0), (zoomArgs[3] | 0), (zoomArgs[4] | 0)]; } } else { console.error('PDFLinkService_setHash: \'' + zoomArg + '\' is not a valid zoom value.'); } } } if (dest) { this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest); } else if (pageNumber) { this.page = pageNumber; // simple page } if ('pagemode' in params) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagemode', true, true, { mode: params.pagemode }); this.pdfViewer.container.dispatchEvent(event); } } else if (/^\d+$/.test(hash)) { // page number this.page = hash; } else { // named destination if (this.pdfHistory) { this.pdfHistory.updateNextHashParam(unescape(hash)); } this.navigateTo(unescape(hash)); } }, /** * @param {string} action */ executeNamedAction: function PDFLinkService_executeNamedAction(action) { // See PDF reference, table 8.45 - Named action switch (action) { case 'GoBack': if (this.pdfHistory) { this.pdfHistory.back(); } break; case 'GoForward': if (this.pdfHistory) { this.pdfHistory.forward(); } break; case 'NextPage': this.page++; break; case 'PrevPage': this.page--; break; case 'LastPage': this.page = this.pagesCount; break; case 'FirstPage': this.page = 1; break; default: break; // No action according to spec } var event = document.createEvent('CustomEvent'); event.initCustomEvent('namedaction', true, true, { action: action }); this.pdfViewer.container.dispatchEvent(event); }, /** * @param {number} pageNum - page number. * @param {Object} pageRef - reference to the page. */ cachePageRef: function PDFLinkService_cachePageRef(pageNum, pageRef) { var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; this._pagesRefCache[refStr] = pageNum; } }; return PDFLinkService; })(); //PDFJS.PDFLinkService = PDFLinkService; var FindStates = { FIND_FOUND: 0, FIND_NOTFOUND: 1, FIND_WRAPPED: 2, FIND_PENDING: 3 }; var FIND_SCROLL_OFFSET_TOP = -50; var FIND_SCROLL_OFFSET_LEFT = -400; var CHARACTERS_TO_NORMALIZE = { '\u2018': '\'', '\u2019': '\'', '\u201A': '\'', '\u201B': '\'', '\u201C': '"', '\u201D': '"', '\u201E': '"', '\u201F': '"', '\u00BC': '1/4', '\u00BD': '1/2', '\u00BE': '3/4' }; DFLIP.PDFFindController = (function PDFFindControllerClosure() { function PDFFindController(options) { this.pdfViewer = options.pdfViewer || null; this.onUpdateResultsCount = null; this.onUpdateState = null; this.reset(); var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(''); this.normalizationRegex = new RegExp('[' + replace + ']', 'g'); } PDFFindController.prototype = { reset: function PDFFindController_reset() { this.startedTextExtraction = false; this.extractTextPromises = []; this.pendingFindMatches = Object.create(null); this.active = false; this.pageContents = []; this.pageMatches = []; this.pageMatchesLength = null; this.matchCount = 0; this.selected = { pageIdx: -1, matchIdx: -1 }; this.offset = { pageIdx: null, matchIdx: null }; this.pagesToSearch = null; this.resumePageIdx = null; this.state = null; this.dirtyMatch = false; this.findTimeout = null; this.firstPagePromise = new Promise(function (resolve) { this.resolveFirstPage = resolve; }.bind(this)); }, normalize: function PDFFindController_normalize(text) { return text.replace(this.normalizationRegex, function (ch) { return CHARACTERS_TO_NORMALIZE[ch]; }); }, _prepareMatches: function PDFFindController_prepareMatches(matchesWithLength, matches, matchesLength) { function isSubTerm(matchesWithLength, currentIndex) { var currentElem, prevElem, nextElem; currentElem = matchesWithLength[currentIndex]; nextElem = matchesWithLength[currentIndex + 1]; if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) { currentElem.skipped = true; return true; } for (var i = currentIndex - 1; i >= 0; i--) { prevElem = matchesWithLength[i]; if (prevElem.skipped) { continue; } if (prevElem.match + prevElem.matchLength < currentElem.match) { break; } if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) { currentElem.skipped = true; return true; } } return false; } var i, len; matchesWithLength.sort(function (a, b) { return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match; }); for (i = 0, len = matchesWithLength.length; i < len; i++) { if (isSubTerm(matchesWithLength, i)) { continue; } matches.push(matchesWithLength[i].match); matchesLength.push(matchesWithLength[i].matchLength); } }, calcFindPhraseMatch: function PDFFindController_calcFindPhraseMatch(query, pageIndex, pageContent) { var matches = []; var queryLen = query.length; var matchIdx = -queryLen; while (true) { matchIdx = pageContent.indexOf(query, matchIdx + queryLen); if (matchIdx === -1) { break; } matches.push(matchIdx); } this.pageMatches[pageIndex] = matches; }, calcFindWordMatch: function PDFFindController_calcFindWordMatch(query, pageIndex, pageContent) { var matchesWithLength = []; var queryArray = query.match(/\S+/g); var subquery, subqueryLen, matchIdx; for (var i = 0, len = queryArray.length; i < len; i++) { subquery = queryArray[i]; subqueryLen = subquery.length; matchIdx = -subqueryLen; while (true) { matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen); if (matchIdx === -1) { break; } matchesWithLength.push({ match: matchIdx, matchLength: subqueryLen, skipped: false }); } } if (!this.pageMatchesLength) { this.pageMatchesLength = []; } this.pageMatchesLength[pageIndex] = []; this.pageMatches[pageIndex] = []; this._prepareMatches(matchesWithLength, this.pageMatches[pageIndex], this.pageMatchesLength[pageIndex]); }, calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) { var pageContent = this.normalize(this.pageContents[pageIndex]); var query = this.normalize(this.state.query); var caseSensitive = this.state.caseSensitive; var phraseSearch = this.state.phraseSearch; var queryLen = query.length; if (queryLen === 0) { return; } if (!caseSensitive) { pageContent = pageContent.toLowerCase(); query = query.toLowerCase(); } if (phraseSearch) { this.calcFindPhraseMatch(query, pageIndex, pageContent); } else { this.calcFindWordMatch(query, pageIndex, pageContent); } this.updatePage(pageIndex); if (this.resumePageIdx === pageIndex) { this.resumePageIdx = null; this.nextPageMatch(); } if (this.pageMatches[pageIndex].length > 0) { this.matchCount += this.pageMatches[pageIndex].length; this.updateUIResultsCount(); } }, extractText: function PDFFindController_extractText() { if (this.startedTextExtraction) { return; } this.startedTextExtraction = true; this.pageContents = []; var extractTextPromisesResolves = []; var numPages = this.pdfViewer.contentProvider.pdfDocument.numPages; for (var i = 0; i < numPages; i++) { this.extractTextPromises.push(new Promise(function (resolve) { extractTextPromisesResolves.push(resolve); })); } var self = this; function extractPageText(pageIndex) { self.pdfViewer.getPageTextContent(pageIndex).then(function textContentResolved(textContent) { var textItems = textContent.items; var str = []; for (var i = 0, len = textItems.length; i < len; i++) { str.push(textItems[i].str); } self.pageContents.push(str.join('')); extractTextPromisesResolves[pageIndex](pageIndex); console.log("extracting Page" + pageIndex); if (pageIndex + 1 < self.pdfViewer.contentProvider.pdfDocument.numPages) { extractPageText(pageIndex + 1); } }); } extractPageText(0); }, executeCommand: function PDFFindController_executeCommand(cmd, state) { if (this.state === null || cmd !== 'findagain') { this.dirtyMatch = true; } this.state = state; this.updateUIState(FindStates.FIND_PENDING); this.firstPagePromise.then(function () { this.extractText(); clearTimeout(this.findTimeout); if (cmd === 'find') { this.findTimeout = setTimeout(this.nextMatch.bind(this), 250); } else { this.nextMatch(); } }.bind(this)); }, updatePage: function PDFFindController_updatePage(index) { if (this.selected.pageIdx === index) { this.pdfViewer.currentPageNumber = index + 1; } var page = this.pdfViewer.getPageView(index); if (page.textLayer) { page.textLayer.updateMatches(); } }, nextMatch: function PDFFindController_nextMatch() { var previous = this.state.findPrevious; var currentPageIndex = this.pdfViewer.currentPageNumber - 1; var numPages = this.pdfViewer.contentProvider.pageCount; this.active = true; if (this.dirtyMatch) { this.dirtyMatch = false; this.selected.pageIdx = this.selected.matchIdx = -1; this.offset.pageIdx = currentPageIndex; this.offset.matchIdx = null; this.hadMatch = false; this.resumePageIdx = null; this.pageMatches = []; this.matchCount = 0; this.pageMatchesLength = null; var self = this; for (var i = 0; i < numPages; i++) { this.updatePage(i); if (!(i in this.pendingFindMatches)) { this.pendingFindMatches[i] = true; this.extractTextPromises[i].then(function (pageIdx) { delete self.pendingFindMatches[pageIdx]; self.calcFindMatch(pageIdx); }); } } } if (this.state.query === '') { this.updateUIState(FindStates.FIND_FOUND); return; } if (this.resumePageIdx) { return; } var offset = this.offset; this.pagesToSearch = numPages; if (offset.matchIdx !== null) { var numPageMatches = this.pageMatches[offset.pageIdx].length; if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { this.hadMatch = true; offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; this.updateMatch(true); return; } this.advanceOffsetPage(previous); } this.nextPageMatch(); }, matchesReady: function PDFFindController_matchesReady(matches) { var offset = this.offset; var numMatches = matches.length; var previous = this.state.findPrevious; if (numMatches) { this.hadMatch = true; offset.matchIdx = previous ? numMatches - 1 : 0; this.updateMatch(true); return true; } this.advanceOffsetPage(previous); if (offset.wrapped) { offset.matchIdx = null; if (this.pagesToSearch < 0) { this.updateMatch(false); return true; } } return false; }, updateMatchPosition: function PDFFindController_updateMatchPosition(pageIndex, index, elements, beginIdx) { if (this.selected.matchIdx === index && this.selected.pageIdx === pageIndex) { var spot = { top: FIND_SCROLL_OFFSET_TOP, left: FIND_SCROLL_OFFSET_LEFT }; scrollIntoView(elements[beginIdx], spot, true); } }, nextPageMatch: function PDFFindController_nextPageMatch() { if (this.resumePageIdx !== null) { console.error('There can only be one pending page.'); } do { var pageIdx = this.offset.pageIdx; var matches = this.pageMatches[pageIdx]; if (!matches) { this.resumePageIdx = pageIdx; break; } } while (!this.matchesReady(matches)); }, advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) { var offset = this.offset; var numPages = this.extractTextPromises.length; offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1; offset.matchIdx = null; this.pagesToSearch--; if (offset.pageIdx >= numPages || offset.pageIdx < 0) { offset.pageIdx = previous ? numPages - 1 : 0; offset.wrapped = true; } }, updateMatch: function PDFFindController_updateMatch(found) { var state = FindStates.FIND_NOTFOUND; var wrapped = this.offset.wrapped; this.offset.wrapped = false; if (found) { var previousPage = this.selected.pageIdx; this.selected.pageIdx = this.offset.pageIdx; this.selected.matchIdx = this.offset.matchIdx; state = wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND; if (previousPage !== -1 && previousPage !== this.selected.pageIdx) { this.updatePage(previousPage); } } this.updateUIState(state, this.state.findPrevious); if (this.selected.pageIdx !== -1) { this.updatePage(this.selected.pageIdx); } }, updateUIResultsCount: function PDFFindController_updateUIResultsCount() { if (this.onUpdateResultsCount) { this.onUpdateResultsCount(this.matchCount); } }, updateUIState: function PDFFindController_updateUIState(state, previous) { if (this.onUpdateState) { this.onUpdateState(state, previous, this.matchCount); } } }; return PDFFindController; })(); /** * @typedef {Object} TextLayerBuilderOptions * @property {HTMLDivElement} textLayerDiv - The text layer container. * @property {EventBus} eventBus - The application event bus. * @property {number} pageIndex - The page index. * @property {PageViewport} viewport - The viewport of the text layer. * @property {PDFFindController} findController * @property {boolean} enhanceTextSelection - Option to turn on improved * text selection. */ /** * TextLayerBuilder provides text-selection functionality for the PDF. * It does this by creating overlay divs over the PDF text. These divs * contain text that matches the PDF text they are overlaying. This object * also provides a way to highlight text that is being searched for. * @class */ DFLIP.TextLayerBuilder = (function TextLayerBuilderClosure() { function TextLayerBuilder(options) { this.textLayerDiv = options.textLayerDiv; this.renderingDone = false; this.divContentDone = false; this.pageIdx = options.pageIndex; this.pageNumber = this.pageIdx + 1; this.matches = []; this.viewport = options.viewport; this.textDivs = []; this.findController = options.findController || null; this.textLayerRenderTask = null; this.enhanceTextSelection = options.enhanceTextSelection; this._bindMouse(); } TextLayerBuilder.prototype = { _finishRendering: function TextLayerBuilder_finishRendering() { this.renderingDone = true; if (!this.enhanceTextSelection) { var endOfContent = document.createElement('div'); endOfContent.className = 'endOfContent'; this.textLayerDiv.appendChild(endOfContent); } /* this.eventBus.dispatch('textlayerrendered', { source: this, pageNumber: this.pageNumber });*/ }, /** * Renders the text layer. * @param {number} timeout (optional) if specified, the rendering waits * for specified amount of ms. */ render: function TextLayerBuilder_render(timeout) { if (!this.divContentDone || this.renderingDone) { return; } if (this.textLayerRenderTask) { this.textLayerRenderTask.cancel(); this.textLayerRenderTask = null; } this.textDivs = []; var textLayerFrag = document.createDocumentFragment(); this.textLayerRenderTask = pdfjsLib.renderTextLayer({ textContent: this.textContent, container: textLayerFrag, viewport: this.viewport, textDivs: this.textDivs, timeout: timeout, enhanceTextSelection: this.enhanceTextSelection, }); this.textLayerRenderTask.promise.then(function () { this.textLayerDiv.appendChild(textLayerFrag); this._finishRendering(); this.updateMatches(); }.bind(this), function (reason) { // canceled or failed to render text layer -- skipping errors }); }, setTextContent: function TextLayerBuilder_setTextContent(textContent) { if (this.textLayerRenderTask) { this.textLayerRenderTask.cancel(); this.textLayerRenderTask = null; } this.textContent = textContent; this.divContentDone = true; }, convertMatches: function TextLayerBuilder_convertMatches(matches, matchesLength) { var i = 0; var iIndex = 0; var bidiTexts = this.textContent.items; var end = bidiTexts.length - 1; var queryLen = (this.findController === null ? 0 : this.findController.state.query.length); var ret = []; if (!matches) { return ret; } for (var m = 0, len = matches.length; m < len; m++) { // Calculate the start position. var matchIdx = matches[m]; // Loop over the divIdxs. while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) { iIndex += bidiTexts[i].str.length; i++; } if (i === bidiTexts.length) { console.error('Could not find a matching mapping'); } var match = { begin: { divIdx: i, offset: matchIdx - iIndex } }; // Calculate the end position. if (matchesLength) { // multiterm search matchIdx += matchesLength[m]; } else { // phrase search matchIdx += queryLen; } // Somewhat the same array as above, but use > instead of >= to get // the end position right. while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) { iIndex += bidiTexts[i].str.length; i++; } match.end = { divIdx: i, offset: matchIdx - iIndex }; ret.push(match); } return ret; }, renderMatches: function TextLayerBuilder_renderMatches(matches) { // Early exit if there is nothing to render. if (matches.length === 0) { return; } var bidiTexts = this.textContent.items; var textDivs = this.textDivs; var prevEnd = null; var pageIdx = this.pageIdx; var isSelectedPage = (this.findController === null ? false : (pageIdx === this.findController.selected.pageIdx)); var selectedMatchIdx = (this.findController === null ? -1 : this.findController.selected.matchIdx); var highlightAll = (this.findController === null ? false : this.findController.state.highlightAll); var infinity = { divIdx: -1, offset: undefined }; function beginText(begin, className) { var divIdx = begin.divIdx; textDivs[divIdx].textContent = ''; appendTextToDiv(divIdx, 0, begin.offset, className); } function appendTextToDiv(divIdx, fromOffset, toOffset, className) { var div = textDivs[divIdx]; var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset); var node = document.createTextNode(content); if (className) { var span = document.createElement('span'); span.className = className; span.appendChild(node); div.appendChild(span); return; } div.appendChild(node); } var i0 = selectedMatchIdx, i1 = i0 + 1; if (highlightAll) { i0 = 0; i1 = matches.length; } else if (!isSelectedPage) { // Not highlighting all and this isn't the selected page, so do nothing. return; } for (var i = i0; i < i1; i++) { var match = matches[i]; var begin = match.begin; var end = match.end; var isSelected = (isSelectedPage && i === selectedMatchIdx); var highlightSuffix = (isSelected ? ' selected' : ''); if (this.findController) { this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx); } // Match inside new div. if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { // If there was a previous div, then add the text at the end. if (prevEnd !== null) { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); } // Clear the divs and set the content until the starting point. beginText(begin); } else { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); } if (begin.divIdx === end.divIdx) { appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix); } else { appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix); for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { textDivs[n0].className = 'highlight middle' + highlightSuffix; } beginText(end, 'highlight end' + highlightSuffix); } prevEnd = end; } if (prevEnd) { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); } }, updateMatches: function TextLayerBuilder_updateMatches() { // Only show matches when all rendering is done. if (!this.renderingDone) { return; } // Clear all matches. var matches = this.matches; var textDivs = this.textDivs; var bidiTexts = this.textContent.items; var clearedUntilDivIdx = -1; // Clear all current matches. for (var i = 0, len = matches.length; i < len; i++) { var match = matches[i]; var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); for (var n = begin, end = match.end.divIdx; n <= end; n++) { var div = textDivs[n]; div.textContent = bidiTexts[n].str; div.className = ''; } clearedUntilDivIdx = match.end.divIdx + 1; } if (this.findController === null || !this.findController.active) { return; } // Convert the matches on the page controller into the match format // used for the textLayer. var pageMatches, pageMatchesLength; if (this.findController !== null) { pageMatches = this.findController.pageMatches[this.pageIdx] || null; pageMatchesLength = (this.findController.pageMatchesLength) ? this.findController.pageMatchesLength[this.pageIdx] || null : null; } this.matches = this.convertMatches(pageMatches, pageMatchesLength); this.renderMatches(this.matches); }, /** * Fixes text selection: adds additional div where mouse was clicked. * This reduces flickering of the content if mouse slowly dragged down/up. * @private */ _bindMouse: function TextLayerBuilder_bindMouse() { var div = this.textLayerDiv; var self = this; div.addEventListener('mousedown', function (e) { if (self.enhanceTextSelection && self.textLayerRenderTask) { self.textLayerRenderTask.expandTextDivs(true); return; } var end = div.querySelector('.endOfContent'); if (!end) { return; } // On non-Firefox browsers, the selection will feel better if the height // of the endOfContent div will be adjusted to start at mouse click // location -- this will avoid flickering when selections moves up. // However it does not work when selection started on empty space. var adjustTop = e.target !== div; adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none'; if (adjustTop) { var divBounds = div.getBoundingClientRect(); var r = Math.max(0, (e.pageY - divBounds.top) / divBounds.height); end.style.top = (r * 100).toFixed(2) + '%'; } end.classList.add('active'); }); div.addEventListener('mouseup', function (e) { if (self.enhanceTextSelection && self.textLayerRenderTask) { self.textLayerRenderTask.expandTextDivs(false); return; } var end = div.querySelector('.endOfContent'); if (!end) { return; } end.style.top = ''; end.classList.remove('active'); }); }, }; return TextLayerBuilder; })(); DFLIP.ConvertPageLinks = function () { var w = arguments[0] / 100, h = arguments[1] / 100; var toPercent = function (_x, _y, _w, _h, _dest) { return { x: _x / w, y: _y / h, w: _w / w, h: _h / h, dest: _dest }; }; var percents = []; var input; for (var index = 2; index < arguments.length; index++) { input = arguments[index]; percents[index - 2] = toPercent.apply(this, input); } return percents; }; DFLIP.parseLinks = function (links) { var _links; if (links != null && links.length > 0) { for (var index = 0; index < links.length; index++) { _links = links[index]; if (_links != null && _links[0] != null && _links[0].dest == null) { _links = DFLIP.ConvertPageLinks.apply(this, _links); links[index] = _links; } } } return links; }; /** * DFLIP.parseBooks */ (function ($) { //php and javascript interpret booleans differently so we use string checks function isTrue(val) { return val == "true" || val == true; } function checkValues(options) { //boolean values if (options.webgl != null) options.webgl = isTrue(options.webgl); if (options.enableDownload != null) options.enableDownload = isTrue(options.enableDownload); if (options.search != null) options.search = isTrue(options.search); if (options.enableAnalytics != null) options.enableAnalytics = isTrue(options.enableAnalytics); if (options.scrollWheel != null) options.scrollWheel = isTrue(options.scrollWheel); if (options.autoEnableOutline != null) options.autoEnableOutline = isTrue(options.autoEnableOutline); if (options.autoEnableThumbnail != null) options.autoEnableThumbnail = isTrue(options.autoEnableThumbnail); if (options.transparent != null) options.transparent = isTrue(options.transparent); if (options.overwritePDFOutline != null) options.overwritePDFOutline = isTrue(options.overwritePDFOutline); if (options.soundEnable != null) options.soundEnable = isTrue(options.soundEnable); if (options.forceFit != null) options.forceFit = isTrue(options.forceFit); if (options.enableAnnotation != null) options.enableAnnotation = isTrue(options.enableAnnotation); if (options.webglShadow != null) options.webglShadow = isTrue(options.webglShadow); if (options.autoPlay != null) options.autoPlay = isTrue(options.autoPlay); if (options.autoPlayStart != null) options.autoPlayStart = isTrue(options.autoPlayStart); //integer value if (options.paddingTop != null) options.paddingTop = parseInt(options.paddingTop, 10); if (options.paddingRight != null) options.paddingRight = parseInt(options.paddingRight, 10); if (options.paddingBottom != null) options.paddingBottom = parseInt(options.paddingBottom, 10); if (options.paddingLeft != null) options.paddingLeft = parseInt(options.paddingLeft, 10); if (options.zoomRatio != null) options.zoomRatio = parseFloat(options.zoomRatio, 10); if (options.stiffness != null) options.stiffness = parseFloat(options.stiffness, 10); if (options.autoPlayDuration != null) options.autoPlayDuration = parseInt(options.autoPlayDuration, 10); if (options.linkTarget != null) options.linkTarget = parseInt(options.linkTarget, 10); if (options.pageMode == 0 || options.pageMode == "0") options.pageMode = null; if (options.singlePageMode == 0 || options.singlePageMode == "0") options.singlePageMode = null; } function parseOptions(options) { //bail out if already parsed or failed if (options.parsed == true) return; options.parsed = true; //options.links are in json format //{"1":[]} //convert them to array format var links = []; checkValues(options); if (typeof dFlipWPGlobal !== 'undefined' && options.wpOptions == 'true') { try { for (var key in options.links) { var _pagelinks = options.links[key]; var pagelink = [100, 100]; for (var l = 0; l < _pagelinks.length; l++) { var _link = _pagelinks[l]; var _values = _link.substr(1).slice(0, -1).split(","); var _linkarr = []; for (var v = 0; v < 5; v++) { _linkarr[v] = _values[v]; } pagelink.push(_linkarr); } links[parseInt(key, 10) + 1] = pagelink; } } catch (error) { console.error(error.stack); } options.links = DFLIP.parseLinks(links); } else { options.links = DFLIP.parseLinks(options.links); } } DFLIP.getOptions = function (book) { book = $(book); var book_id = book.attr("id"); var options = "option_" + book_id, source = book.attr("source") || book.attr("df-source"); //verify and optimize the values options = options == null || options == "" || window[options] == null ? {} : window[options]; options.source = source == null || source == "" ? options.source : source; /*As of 1.2.6 attribute values are also considered as options in some cases*/ var attrOptions = { webgl: book.attr("webgl"), height: book.attr("height"), soundEnable: book.attr("sound"), bookTitle: book.data("title"), transparent: book.attr("transparent"), enableDownload: book.attr("download"), search: book.attr("search"), duration: book.attr("duration"), hard: book.attr("hard"), openPage: book.data("page"), pageMode: book.attr("pagemode"), direction: book.attr("direction"), backgroundColor: book.attr("backgroundcolor"), scrollWheel: book.attr("scrollwheel"), backgroundImage: book.attr("backgroundimage"), paddingTop: book.attr("paddingtop"), paddingRight: book.attr("paddingright"), paddingBottom: book.attr("paddingbottom"), paddingLeft: book.attr("paddingleft"), wpOptions: book.attr("wpoptions") }; options = $.extend(true, {}, options, attrOptions); parseOptions(options); return options; } DFLIP.parseBooks = function () { $('._df_button, ._df_thumb, ._df_custom, ._df_book').each(function () { var book = $(this); //fetch any existing values var parsed = book.attr("parsed") || book.attr("df-parsed"); //skip if already parsed or failed if (parsed !== "true") { book.attr("df-parsed", "true") if (book.hasClass("_df_book")) { var book_id = book.attr("id"), slug = book.attr("slug"); var options = DFLIP.getOptions(book); options.id = book_id; if (slug != null) options.slug = slug; if (book_id) { window[book_id.toString()] = $(book).flipBook(options.source, options); } else { $(book).flipBook(options.source, options); } } else { if (book.hasClass("_df_thumb")) { var wrapper = $("<div class='_df_book-cover'>"); var text = book.html().trim(); book.html(""); var title = $("<span class='_df_book-title'>").html(text).appendTo(wrapper); var thumb = book.attr("thumb") || book.attr("df-thumb"), thumbType = book.attr("thumbtype") || DFLIP.defaults.thumbElement || "div", tags = book.attr("tags") || book.attr("df-tags"); if (tags) { tags = tags.split(","); if (tags.length > 0) { for (var tagcount = 0; tagcount < tags.length; tagcount++) { book.append("<span class='_df_book-tag'>" + tags[tagcount] + "</span>"); } } } if (thumb != null && thumb.toString().trim() != '') { if (thumbType == 'img') { wrapper.append('<img src="' + thumb + '" alt="' + text + '"/>'); book.attr("thumb-type", "img"); } else { wrapper.css({ backgroundImage: "url('" + thumb + "')" }); } } else { wrapper.addClass("_df_thumb-not-found"); } book.append(wrapper); } } } }); }; $(document).ready(function () { var body = $('body'); //Autodetection if the folder structure is copied properly if (typeof dFlipLocation == 'undefined' && DFLIP.autoDetectLocation != false) { $("script").each(function () { var src = $(this)[0].src; if ((src.indexOf("/dflip.js") > -1 || src.indexOf("/dflip.min.js") > -1) && (src.indexOf("https://") > -1 || src.indexOf("http://") > -1) && src.indexOf("js/dflip.") > -1) { var splits = src.split("/"); window.dFlipLocation = splits.slice(0, -2).join("/"); } }); } if (typeof dFlipLocation !== 'undefined') { //add ending forward slash trail for safety if (dFlipLocation.length > 2 && dFlipLocation.slice(-1) !== "/") { window.dFlipLocation += "/"; } //PRESENTATION.defaults.backgroundImage = "blank"; "images/textures/white.jpg"; //PRESENTATION.defaults.textureLoadFallback = dFlipLocation + "images/textures/white.jpg"; DFLIP.defaults.mockupjsSrc = dFlipLocation + "js/libs/mockup.min.js"; DFLIP.defaults.pdfjsSrc = dFlipLocation + "js/libs/pdf.min.js"; DFLIP.defaults.pdfjsCompatibilitySrc = dFlipLocation + "js/libs/compatibility.js"; DFLIP.defaults.threejsSrc = dFlipLocation + "js/libs/three.min.js"; DFLIP.defaults.pdfjsWorkerSrc = dFlipLocation + "js/libs/pdf.worker.min.js"; DFLIP.defaults.soundFile = dFlipLocation + "sound/turn2.mp3"; DFLIP.defaults.imagesLocation = dFlipLocation + "images"; DFLIP.defaults.imageResourcesPath = dFlipLocation + "images/pdfjs/"; DFLIP.defaults.cMapUrl = dFlipLocation + "js/libs/cmaps/"; if (typeof dFlipWPGlobal !== 'undefined') { if (dFlipWPGlobal.pdfVersion !== undefined) { if (dFlipWPGlobal.pdfVersion !== "default") { DFLIP.defaults.pdfjsSrc = dFlipLocation + "js/libs/pdfjs/" + dFlipWPGlobal.pdfVersion + "/pdf.min.js"; DFLIP.defaults.pdfjsWorkerSrc = dFlipLocation + "js/libs/pdfjs/" + dFlipWPGlobal.pdfVersion + "/pdf.worker.min.js"; } } checkValues(dFlipWPGlobal); $.extend(true, DFLIP.defaults, dFlipWPGlobal); } } DFLIP.preParseHash = window.location.hash; body.on('click', '._df_button, ._df_thumb, ._df_custom', function (event) { //incase the element is link type event.preventDefault(); //cache the book element var book = $(this); if (!window.dfLightBox) { window.dfLightBox = new DFLightBox(function () { Array.prototype.forEach.call(DFLIP.utils.getSharePrefixes(), function (prefix) { if (window.location.hash.indexOf("#" + prefix) == 0) window.location.hash = "#_"; }); window.dfActiveLightBoxBook.analytics({ eventAction: "Book Closed", options: window.dfActiveLightBoxBook.options }); window.dfActiveLightBoxBook.dispose(); window.dfActiveLightBoxBook = null; }); } window.dfLightBox.duration = 500; if (window.dfActiveLightBoxBook && window.dfActiveLightBoxBook.dispose) { window.dfActiveLightBoxBook.dispose(); } else { window.dfLightBox.show( function () { // $("body").addClass("df-no-scroll"); var options = DFLIP.getOptions(book); options.transparent = false; options.height = "100%"; options.id = book.attr("id"); var slug = book.attr("slug"); if (slug != null) options.slug = slug; options.isLightBox = true; window.dfActiveLightBoxBook = $(window.dfLightBox.container).flipBook(options.source, options); } ); } }); if (DFLIP.utils.isSafari || DFLIP.utils.isIOS) { $('body').addClass("df-webkit"); } //parse hash and check if any exists var hash_triggered = false; Array.prototype.forEach.call(DFLIP.utils.getSharePrefixes(), function (prefix) { if (DFLIP.preParseHash && DFLIP.preParseHash.indexOf(prefix) >= 0 && hash_triggered === false) { var id = DFLIP.preParseHash.split(prefix)[1].split('/')[0]; var page = DFLIP.preParseHash.split(prefix)[1].split('/')[1]; if (page != null) { page = page.split('/')[0]; } var book; //first check for slug pattern book = $("[slug=" + id + "]"); //then id pattern if (book.length === 0) book = $('#' + id); //then _slug pattern if (book.length === 0) book = $("[_slug=" + id + "]") if (book.length > 0) { //var oldHash = window.location.hash; //window.location.hash = id; //window.location.hash = DFLIP.preParseHash; if (page != null) { book.data("page", page) } if (book.is('._df_button, ._df_thumb, ._df_custom')) { book.trigger("click"); hash_triggered = true; } } } }); DFLIP.parseBooks(); //opening lightbox in attachment page. if (body.hasClass('attachment-pdf')) { var attachments = $("[attachment_pdf_flipbook_lightbox]"); if (attachments.length > 0) { $(attachments[0]).trigger("click"); } } body.on('click', '.df-ui-sidemenu-close', function () { var $this = $(this); $this.closest(".df-container").find(".df-ui-outline.df-active , .df-ui-thumbnail.df-active").trigger("click"); }); body.on('mouseout', '.annotationDiv section.squareAnnotation', function () { var el = $(this); DFLIP.handlePopup(el, false); }); body.on('mouseover', '.annotationDiv section.squareAnnotation', function () { var el = $(this); DFLIP.handlePopup(el, true); }); DFLIP.handlePopup = function (el, show) { if (show === void 0) show = true; var container = el.closest('.df-container'); var commentPopup = container.find('.df-comment-popup'); commentPopup.toggleClass("df-active", show); if (show) { var elBounds = el[0].getBoundingClientRect(); var containerBounds = container[0].getBoundingClientRect(); var popup = el.find(".popupWrapper").first(); commentPopup.html(popup.html()); var left = elBounds.left - containerBounds.left; if (left + 360 > containerBounds.width) left = containerBounds.width - 360 - 10; else if (left < 10) left = 10; var top = elBounds.top - containerBounds.top + elBounds.height + 5; if (top + commentPopup.height() > containerBounds.height) top = elBounds.top - commentPopup.height() - elBounds.height - 10; else if (top < 10) top = 10; commentPopup.css({ "left": left, "top": top }); } } }); })(jQuery);