!function(){function t(){if(this.complete){const e=this.getAttribute("data-lazy-src");if(e&&this.src!==e)return void this.addEventListener("onload",t);const n=this.width,d=this.height;n&&n>0&&d&&d>0&&(this.setAttribute("width",n),this.setAttribute("height",d),i(this))}else this.addEventListener("onload",t)}var e=function(){const e=document.querySelectorAll("img[data-recalc-dims]");for(let i=0;i 1 ); //Quick test for mobile devices. let isMobileDevice = (isSafariIOSDesktopMode || /Mobi|Tablet|Android|iPad|iPhone/.test(ua)); //Safari desktop requires special handling let isSafariDesktop = ( !isMobileDevice && nav.vendor !== undefined && /Apple/.test(nav.vendor) && /Safari/.test(ua) ); //Firefox started shipping PDF.js in Firefox 19. If this is Firefox 19 or greater, assume PDF.js is available let isFirefoxWithPDFJS = (!isMobileDevice && /irefox/.test(ua) && ua.split("rv:").length > 1) ? (parseInt(ua.split("rv:")[1].split(".")[0], 10) > 18) : false; /* ---------------------------------------------------- Supporting functions ---------------------------------------------------- */ let createAXO = function (type){ var ax; try { ax = new ActiveXObject(type); } catch (e) { ax = null; //ensure ax remains null } return ax; }; //If either ActiveX support for "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true //Constructed as a method (not a prop) to avoid unneccesarry overhead -- will only be evaluated if needed let supportsPdfActiveX = function (){ return !!(createAXO("AcroPDF.PDF") || createAXO("PDF.PdfCtrl")); }; //Determines whether PDF support is available let supportsPDFs = ( //As of Sept 2020 no mobile browsers properly support PDF embeds !isMobileDevice && ( //We're moving into the age of MIME-less browsers. They mostly all support PDF rendering without plugins. isModernBrowser || //Modern versions of Firefox come bundled with PDFJS isFirefoxWithPDFJS || //Browsers that still support the original MIME type check supportsPdfMimeType || //Pity the poor souls still using IE (isIE && supportsPdfActiveX()) ) ); //Create a fragment identifier for using PDF Open parameters when embedding PDF let buildURLFragmentString = function(pdfParams){ let string = ""; let prop; if(pdfParams){ for (prop in pdfParams) { if (pdfParams.hasOwnProperty(prop)) { string += encodeURIComponent(prop) + "=" + encodeURIComponent(pdfParams[prop]) + "&"; } } //The string will be empty if no PDF Params found if(string){ string = "#" + string; //Remove last ampersand string = string.slice(0, string.length - 1); } } return string; }; let embedError = function (msg, suppressConsole){ if(!suppressConsole){ // console.log("[PDFObject] " + msg); //added by EP developer } return false; }; let emptyNodeContents = function (node){ while(node.firstChild){ node.removeChild(node.firstChild); } }; let getTargetElement = function (targetSelector){ //Default to body for full-browser PDF let targetNode = document.body; //If a targetSelector is specified, check to see whether //it's passing a selector, jQuery object, or an HTML element if(typeof targetSelector === "string"){ //Is CSS selector targetNode = document.querySelector(targetSelector); } else if (window.jQuery !== undefined && targetSelector instanceof jQuery && targetSelector.length) { //Is jQuery element. Extract HTML node targetNode = targetSelector.get(0); } else if (targetSelector.nodeType !== undefined && targetSelector.nodeType === 1){ //Is HTML element targetNode = targetSelector; } return targetNode; }; let generatePDFJSMarkup = function (targetNode, url, pdfOpenFragment, PDFJS_URL, id, omitInlineStyles){ //Ensure target element is empty first emptyNodeContents(targetNode); let fullURL = PDFJS_URL + "?file=" + encodeURIComponent(url) + pdfOpenFragment; let div = document.createElement("div"); let iframe = document.createElement("iframe"); iframe.src = fullURL; iframe.className = "pdfobject"; iframe.type = "application/pdf"; iframe.frameborder = "0"; iframe.allow = "fullscreen"; if(id){ iframe.id = id; } if(!omitInlineStyles){ div.style.cssText = "position: absolute; top: 0; right: 0; bottom: 0; left: 0;"; iframe.style.cssText = "border: none; width: 100%; height: 100%;"; targetNode.style.position = "relative"; targetNode.style.overflow = "auto"; } div.appendChild(iframe); targetNode.appendChild(div); targetNode.classList.add("pdfobject-container"); return targetNode.getElementsByTagName("iframe")[0]; }; let generatePDFObjectMarkup = function (embedType, targetNode, targetSelector, url, pdfOpenFragment, width, height, id, title, omitInlineStyles){ //Ensure target element is empty first emptyNodeContents(targetNode); let embed = document.createElement(embedType); if ('object' === embedType ) { embed.data = url + pdfOpenFragment; }else{ embed.src = url + pdfOpenFragment; } embed.className = "pdfobject"; embed.type = "application/pdf"; embed.title = title; if(id){ embed.id = id; } if(embedType === "iframe"){ embed.allow = "fullscreen"; } if(!omitInlineStyles){ let style = (embedType === "embed") ? "overflow: auto;" : "border: none;"; if(targetSelector && targetSelector !== document.body){ style += "width: " + width + "; height: " + height + ";"; } else { style += "position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%;"; } embed.style.cssText = style; } targetNode.classList.add("pdfobject-container"); targetNode.appendChild(embed); return targetNode.getElementsByTagName(embedType)[0]; }; let embed = function(url, targetSelector, options){ //If targetSelector is not defined, convert to boolean let selector = targetSelector || false; //Ensure options object is not undefined -- enables easier error checking below let opt = options || {}; //Get passed options, or set reasonable defaults let id = (typeof opt.id === "string") ? opt.id : ""; let page = opt.page || false; let pdfOpenParams = opt.pdfOpenParams || {}; let fallbackLink = opt.fallbackLink || true; let width = opt.width || "100%"; let height = opt.height || "100%"; let title = opt.title || "Embedded PDF"; let assumptionMode = (typeof opt.assumptionMode === "boolean") ? opt.assumptionMode : true; let forcePDFJS = (typeof opt.forcePDFJS === "boolean") ? opt.forcePDFJS : false; let supportRedirect = (typeof opt.supportRedirect === "boolean") ? opt.supportRedirect : false; let omitInlineStyles = (typeof opt.omitInlineStyles === "boolean") ? opt.omitInlineStyles : false; let suppressConsole = (typeof opt.suppressConsole === "boolean") ? opt.suppressConsole : false; let forceIframe = (typeof opt.forceIframe === "boolean") ? opt.forceIframe : false; let forceObject = (typeof opt.forceObject === "boolean") ? opt.forceObject : false; let PDFJS_URL = opt.PDFJS_URL || false; let targetNode = getTargetElement(selector); let fallbackHTML = ""; let pdfOpenFragment = ""; let fallbackHTML_default = "

This browser does not support inline PDFs. Please download the PDF to view it: Download PDF

"; //Ensure URL is available. If not, exit now. if(typeof url !== "string"){ return embedError("URL is not valid", suppressConsole); } //If target element is specified but is not valid, exit without doing anything if(!targetNode){ return embedError("Target element cannot be determined", suppressConsole); } //page option overrides pdfOpenParams, if found if(page){ pdfOpenParams.page = page; } //Stringify optional Adobe params for opening document (as fragment identifier) pdfOpenFragment = buildURLFragmentString(pdfOpenParams); // --== Do the dance: Embed attempt #1 ==-- //If the forcePDFJS option is invoked, skip everything else and embed as directed if(forcePDFJS && PDFJS_URL){ return generatePDFJSMarkup(targetNode, url, pdfOpenFragment, PDFJS_URL, id, omitInlineStyles); } // --== Embed attempt #2 ==-- //Embed PDF if traditional support is provided, or if this developer is willing to roll with assumption //that modern desktop (not mobile) browsers natively support PDFs if(supportsPDFs || (assumptionMode && !isMobileDevice)){ //Should we use or