@tindtechnologies/universalviewer
Version:
The Universal Viewer is a community-developed open source project on a mission to help you share your 📚📜📰📽️📻🗿 with the 🌎
50 lines • 90.6 kB
JavaScript
import{c as pt,e as xt,f as It}from"./chunk-J6QTJS4P.js";import{a as o}from"./chunk-M4MN2QTO.js";import{a as ft,b as d,c as V,e as bt,f as y,i as $t,l as ut,m as vt,n as S,o as F,p as _}from"./chunk-IRIM6TPQ.js";import{b as A,e as O,f as Et,g as p}from"./chunk-5XPHF4E5.js";import{d as dt}from"./chunk-L67DAW3A.js";var U=class{constructor(t,e){this.informationType=t;this.param=e}};var W=class{};W.FORBIDDEN="forbiddenResourceMessage";var D=dt(pt());var k={CONTINUE:100,SWITCHING_PROTOCOLS:101,PROCESSING:102,OK:200,CREATED:201,ACCEPTED:202,NON_AUTHORITATIVE_INFORMATION:203,NO_CONTENT:204,RESET_CONTENT:205,PARTIAL_CONTENT:206,MULTI_STATUS:207,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,MOVED_TEMPORARILY:302,SEE_OTHER:303,NOT_MODIFIED:304,USE_PROXY:305,TEMPORARY_REDIRECT:307,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIME_OUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,REQUEST_ENTITY_TOO_LARGE:413,REQUEST_URI_TOO_LARGE:414,UNSUPPORTED_MEDIA_TYPE:415,REQUESTED_RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,IM_A_TEAPOT:418,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,UNORDERED_COLLECTION:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIME_OUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,BANDWIDTH_LIMIT_EXCEEDED:509,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511};var Pt=window.$,P=class l{static loadExternalResources(t,e){return new Promise(i=>{D.Utils.loadExternalResourcesAuth09(t,e,l.clickThrough,l.restricted,l.login,l.getAccessToken,l.storeAccessToken,l.getStoredAccessToken,l.handleExternalResourceResponse).then(s=>{i(s)}).catch(s=>{switch(s.name){case D.StatusCode.AUTHORIZATION_FAILED.toString():l.publish(o.LOGIN_FAILED);break;case D.StatusCode.FORBIDDEN.toString():l.publish(o.FORBIDDEN);break;case D.StatusCode.RESTRICTED.toString():break;default:l.publish(o.SHOW_MESSAGE,[s.message||s])}})})}static clickThrough(t){return new Promise(e=>{l.publish(o.SHOW_CLICKTHROUGH_DIALOGUE,[{resource:t,acceptCallback:()=>{if(t.clickThroughService){let i=window.open(t.clickThroughService.id),s=window.setInterval(()=>{i&&i.closed&&(window.clearInterval(s),l.publish(o.CLICKTHROUGH),e())},500)}}}])})}static restricted(t){return new Promise((e,i)=>{l.publish(o.SHOW_RESTRICTED_DIALOGUE,[{resource:t,acceptCallback:()=>{l.publish(p.LOAD_FAILED),i(t)}}])})}static login(t){return new Promise(e=>{let i={};t.status===k.FORBIDDEN&&(i.warningMessage=W.FORBIDDEN,i.showCancelButton=!0),console.log("login"),l.publish(o.SHOW_LOGIN_DIALOGUE,[{resource:t,loginCallback:()=>{if(t.loginService){let s=window.open(t.loginService.id+"?t="+new Date().getTime()),n=window.setInterval(function(){s&&s.closed&&(window.clearInterval(n),l.publish(o.LOGIN),e())},500)}},logoutCallback:()=>{if(t.logoutService){let s=window.open(t.logoutService.id+"?t="+new Date().getTime()),n=window.setInterval(function(){s&&s.closed&&(window.clearInterval(n),l.publish(o.LOGOUT),e())},500)}},options:i}])})}static getAccessToken(t,e){return new Promise((i,s)=>{if(t.tokenService){let n=t.tokenService.id,a=n+"|"+new Date().getTime(),r=c=>{window.removeEventListener("message",r);let v=c.data;v.error?s(e?v.errorDescription:void 0):i(v)};window.addEventListener("message",r,!1);let h=n+"?messageId="+a;Pt("#commsFrame").prop("src",h)}else s("Token service not found")})}static storeAccessToken(t,e,i){return new Promise((s,n)=>{t.tokenService?(S.set(t.tokenService.id,e,e.expiresIn,i),s()):n("Token service not found")})}static getStoredAccessToken(t,e){return new Promise((i,s)=>{let n=[],a=null;if(t.tokenService&&(a=S.get(t.tokenService.id,e)),a)n.push(a);else{let h=_.getUrlParts(t.dataUri).hostname,c=S.getItems(e);for(let v=0;v<c.length;v++)a=c[v],a.key.includes(h)&&n.push(a)}n=n.sort((h,c)=>h.expiresAt-c.expiresAt);let r;n.length&&(r=n[n.length-1].value,i(r))})}static handleExternalResourceResponse(t){return new Promise((e,i)=>{if(t.isResponseHandled=!0,t.status===k.OK)e(t);else if(t.status===k.MOVED_TEMPORARILY)e(t),l.publish(o.RESOURCE_DEGRADED,[t]);else if(t.error.status===k.UNAUTHORIZED||t.error.status===k.INTERNAL_SERVER_ERROR)i(t.error.statusText);else if(t.error.status===k.FORBIDDEN){let s=new Error;s.message="Forbidden",s.name=D.StatusCode.FORBIDDEN.toString(),i(s)}else i(t.error.statusText)})}static handleDegraded(t){let e=new U(1,t);l.publish(o.SHOW_INFORMATION,[e])}};var Q=dt(pt());var Qt=window.$,u=class u{static loadExternalResources(t,e,i){return new Promise(s=>{u.storageStrategy=e,t=t.map(n=>(n.authAPIVersion=1,n.options=i,n)),Q.Utils.loadExternalResourcesAuth1(t,u.openContentProviderInteraction,u.openTokenService,u.getStoredAccessToken,u.userInteractedWithContentProvider,u.getContentProviderInteraction,u.handleMovedTemporarily,u.showOutOfOptionsMessages).then(n=>{s(n)}).catch(n=>{switch(n.name){case Q.StatusCode.AUTHORIZATION_FAILED.toString():u.publish(o.LOGIN_FAILED);break;case Q.StatusCode.FORBIDDEN.toString():u.publish(o.FORBIDDEN);break;case Q.StatusCode.RESTRICTED.toString():break;default:u.publish(o.SHOW_MESSAGE,[n.message||n])}})})}static getCookieServiceUrl(t){return t.id+"?origin="+u.getOrigin()}static openContentProviderInteraction(t){let e=u.getCookieServiceUrl(t);return window.open(e)}static getOrigin(t){let e=window.location;return t&&(e=document.createElement("a"),e.href=t),e.protocol+"//"+e.hostname+(e.port?":"+e.port:"")}static userInteractedWithContentProvider(t){return new Promise(e=>{let i=window.setInterval(()=>{t.closed&&(window.clearInterval(i),e(!0))},500)})}static handleMovedTemporarily(t){return new Promise(e=>{u.showDegradedMessage(t),t.isResponseHandled=!0,e()})}static showDegradedMessage(t){if(t.kioskService)u.publish(o.OPEN_EXTERNAL_RESOURCE,[[t]]);else{let e=new U(1,t);u.publish(o.SHOW_INFORMATION,[e])}}static storeAccessToken(t,e){return new Promise((i,s)=>{t.tokenService?(S.set(t.tokenService.id,e,e.expiresIn||3600,u.storageStrategy),i()):s("Token service not found")})}static getStoredAccessToken(t){return new Promise((e,i)=>{let s=[],n=null;if(t.tokenService&&(n=S.get(t.tokenService.id,u.storageStrategy)),n)s.push(n);else{let r=_.getUrlParts(t.dataUri).hostname,h=S.getItems(u.storageStrategy);for(let c=0;c<h.length;c++)n=h[c],n.key.includes(r)&&s.push(n)}s=s.sort((r,h)=>r.expiresAt-h.expiresAt);let a=null;s.length&&(a=s[s.length-1].value),e(a)})}static getContentProviderInteraction(t,e){return new Promise(i=>{t.isResponseHandled&&!t.authHoldingPage?(u.showDegradedMessage(t),i(null)):t.authHoldingPage?(t.authHoldingPage.location.href=u.getCookieServiceUrl(e),i(t.authHoldingPage)):u.publish(o.SHOW_AUTH_DIALOGUE,[{service:e,closeCallback:()=>{i(null)},confirmCallback:()=>{let s=u.openContentProviderInteraction(e);i(s)},cancelCallback:()=>{i(null)}}])})}static openTokenService(t,e){return new Promise((i,s)=>{let n=u.getOrigin(e.id),a=new Date().getTime();u.messages[a]={resolve:i,reject:s,serviceOrigin:n,resource:t},window.addEventListener("message",u.receiveToken,!1);let r=e.id+"?messageId="+a+"&origin="+u.getOrigin();Qt("#commsFrame").prop("src",r);let h=5e3;setTimeout(()=>{u.messages[a]&&(u.messages[a].reject("Message unhandled after "+h+"ms, rejecting"),delete u.messages[a])},h)})}static receiveToken(t){if(t.data.hasOwnProperty("messageId")){let e=u.messages[t.data.messageId];e&&t.origin==e.serviceOrigin&&u.storeAccessToken(e.resource,t.data).then(()=>{e.resolve(t.data),delete u.messages[t.data.messageId]})}}static showOutOfOptionsMessages(t,e){if(t.status==k.MOVED_TEMPORARILY)return;let i="";e.getFailureHeader()&&(i+="<p>"+e.getFailureHeader()+"</p>"),e.getFailureDescription()&&(i+=e.getFailureDescription()),u.publish(o.SHOW_MESSAGE,[A(i)])}};u.messages={};var q=u;var j=class{constructor(t,e,i){this.isResized=!1;this.$element=t,this.fitToParentWidth=e||!1,this.fitToParentHeight=i||!1,this.create()}create(){this.extensionHost?.subscribe(p.RESIZE,()=>{this.resize()})}whenResized(t){ft.waitFor(()=>this.isResized,t)}onAccessibleClick(t,e,i=!0,s=!1){i&&t.on("click",n=>{e(n)}),t.on("keydown",n=>{let a=n.target.nodeName==="A"&&!s;(n.which===32&&!a||n.which===13)&&(n.preventDefault(),e(n))})}resize(){let t=this.$element.parent();this.fitToParentWidth&&this.$element.width(t.width()),this.fitToParentHeight&&this.$element.height(t.height()),this.isResized=!0}};var Jt=window.$,C=class extends j{constructor(t,e,i){super(t,e,i)}create(){this.extensionHost=this.$element.closest(".uv-iiif-extension-host").data("component"),super.create(),this.extension=this.extensionHost.extension,this.config={},this.config.content={},this.config.options={};var t=this;t.modules&&t.modules.length&&(t.modules=t.modules.reverse(),t.modules.forEach(e=>{t.config=Jt.extend(!0,t.config,t.extension.data.config.modules[e])})),this.content=this.config.content,this.options=this.config.options}init(){}setConfig(t){this.modules||(this.modules=[]),this.modules.push(t)}resize(){super.resize()}};var G=window.$,E=class extends C{constructor(e){super(e,!1,!1);this.allowClose=!0;this.isActive=!1;this.isUnopened=!0}create(){this.setConfig("dialogue"),super.create(),this.extensionHost.subscribe(o.CLOSE_ACTIVE_DIALOGUE,()=>{this.isActive&&this.allowClose&&this.close()}),this.extensionHost.subscribe(o.ESCAPE,()=>{this.isActive&&this.allowClose&&this.close()}),this.$top=G('<div class="top"></div>'),this.$element.append(this.$top),this.$closeButton=G('<button type="button" class="btn btn-default close" tabindex="0">'+this.content.close+"</button>"),this.$middle=G('<div class="middle"></div>'),this.$element.append(this.$middle),this.$content=G('<div class="content"></div>'),this.$middle.append(this.$content),this.$buttons=G('<div class="buttons"></div>'),this.$middle.append(this.$buttons),this.$bottom=G('<div class="bottom"></div>'),this.$element.append(this.$bottom),this.options.topCloseButtonEnabled?this.$top.append(this.$closeButton):this.$buttons.append(this.$closeButton),this.$closeButton.on("click",e=>{e.preventDefault(),this.close()}),this.returnFunc=this.close}enableClose(){this.allowClose=!0,this.$closeButton.show()}disableClose(){this.allowClose=!1,this.$closeButton.hide()}setDockedPosition(){let e=Math.floor(this.extension.height()-this.$element.outerHeight(!0)),i=0,s=0,n=0;if(this.$triggerButton){let h=this.$triggerButton.offset().top,c=this.extension.$element.offset().top,v=this.$element.outerHeight(!0);e=h-c-v+4;let f=this.$triggerButton.offset().left,b=this.extension.$element.offset().left,x=f-b;n=$t.normalise(x,0,this.extension.width()),i=Math.floor(this.extension.width()*n-this.$element.width()*n)+2,s=Math.floor(this.$element.width()*n)}this.$bottom.css("backgroundPosition",s+"px 0px"),this.$element.css({top:e,left:i})}open(e){this.extensionHost.publish(o.CLOSE_ACTIVE_DIALOGUE),this.$element.attr("aria-hidden","false"),this.$element.show(),e?(this.$triggerButton=G(e),this.$bottom.show()):this.$bottom.hide(),this.isActive=!0,setTimeout(()=>{let i=this.$element.find(".default");if(i.length)i.focus();else{let s=this.$element.find("input:visible, select:visible").first();s.length?s.focus():this.$closeButton.focus()}},1),this.$element.on("keydown",i=>this.handleKeydown(i)),this.extensionHost.publish(o.SHOW_OVERLAY),this.isUnopened&&(this.isUnopened=!1,this.afterFirstOpen()),this.resize()}afterFirstOpen(){}close(){this.isActive&&(this.$element.attr("aria-hidden","true"),this.$element.hide(),this.isActive=!1,this.$element.off("keydown"),this.extensionHost.publish(this.closeCommand),this.extensionHost.publish(o.HIDE_OVERLAY))}resize(){super.resize(),this.$element.css({top:Math.floor(this.extension.height()/2-this.$element.height()/2),left:Math.floor(this.extension.width()/2-this.$element.width()/2)})}handleKeydown(e){if(e.key==="Tab"){let s=this.$element.find('a[href], button, textarea, input[type="text"], input[type="radio"], input[type="checkbox"], select, [tabindex="0"]').filter(":visible"),n=s.first()[0],a=s.last()[0],r=document.activeElement;e.shiftKey?r===n&&(e.preventDefault(),a.focus()):r===a&&(e.preventDefault(),n.focus())}}};var Tt=window.$,Z=class extends E{constructor(t){super(t)}create(){this.setConfig("authDialogue"),super.create(),this.openCommand=o.SHOW_AUTH_DIALOGUE,this.closeCommand=o.HIDE_AUTH_DIALOGUE,this.extensionHost.subscribe(this.openCommand,t=>{let e=Array.isArray(t)?t[0]:t;this.closeCallback=e.closeCallback,this.confirmCallback=e.confirmCallback,this.cancelCallback=e.cancelCallback,this.service=e.service,this.open()}),this.extensionHost.subscribe(this.closeCommand,()=>{this.close()}),this.$title=Tt('<div role="heading" class="heading"></div>'),this.$content.append(this.$title),this.$content.append(' <div> <p class="message scroll"></p> </div>'),this.$buttons.prepend(this._buttonsToAdd()),this.$message=this.$content.find(".message"),this.$confirmButton=this.$buttons.find(".confirm"),this.$confirmButton.text(this.content.confirm),this.$cancelButton=this.$buttons.find(".close"),this.$cancelButton.text(this.content.cancel),this.$element.hide(),this.$confirmButton.on("click",t=>{t.preventDefault(),this.confirmCallback&&this.confirmCallback(),this.close()}),this.$cancelButton.on("click",t=>{t.preventDefault(),this.cancelCallback&&this.cancelCallback(),this.close()})}open(){if(!this.service){console.error("NO SERVICE");return}super.open();let t=this.service.getHeader(),e=this.service.getDescription(),i=this.service.getConfirmLabel();t&&this.$title.text(A(t)),e&&(this.$message.html(A(e)),this.$message.targetBlank(),this.$message.find("a").on("click",function(){let s=Tt(this).attr("href");this.extensionHost.publish(o.EXTERNAL_LINK_CLICKED,s)})),i&&this.$confirmButton.text(A(i)),this.resize()}resize(){super.resize()}_buttonsToAdd(){var t='<a class="confirm btn btn-primary" href="#" target="_parent"></a>';return this.options.topCloseButtonEnabled&&(t+='<button class="close btn btn-default"></button>'),t}};var St=window.$,K=class extends E{constructor(t){super(t)}create(){this.setConfig("clickThroughDialogue"),super.create(),this.openCommand=o.SHOW_CLICKTHROUGH_DIALOGUE,this.closeCommand=o.HIDE_CLICKTHROUGH_DIALOGUE,this.extensionHost.subscribe(this.openCommand,t=>{this.acceptCallback=t.acceptCallback,this.resource=t.resource,this.open()}),this.extensionHost.subscribe(this.closeCommand,()=>{this.close()}),this.$title=St('<div role="heading" class="heading"></div>'),this.$content.append(this.$title),this.$content.append(' <div> <p class="message scroll"></p> <div class="buttons"> <a class="acceptTerms btn btn-primary" href="#" target="_parent"></a> </div> </div>'),this.$message=this.$content.find(".message"),this.$acceptTermsButton=this.$content.find(".acceptTerms"),this.$acceptTermsButton.text("Accept Terms and Open"),this.$element.hide(),this.$acceptTermsButton.on("click",t=>{t.preventDefault(),this.close(),this.extensionHost.publish(o.ACCEPT_TERMS),this.acceptCallback&&this.acceptCallback()})}open(){super.open(),this.resource.clickThroughService&&(this.$title.text(this.resource.clickThroughService.getProperty("label")),this.$message.html(this.resource.clickThroughService.getProperty("description")),this.$message.targetBlank()),this.$message.find("a").on("click",function(){var t=St(this).attr("href");this.extensionHost.publish(o.EXTERNAL_LINK_CLICKED,t)}),this.resize()}resize(){super.resize()}};var _t=window.$,tt=class extends E{constructor(t){super(t)}create(){this.setConfig("loginDialogue"),super.create(),this.openCommand=o.SHOW_LOGIN_DIALOGUE,this.closeCommand=o.HIDE_LOGIN_DIALOGUE,this.extensionHost.subscribe(this.openCommand,t=>{this.loginCallback=t.loginCallback,this.logoutCallback=t.logoutCallback,this.options=t.options,this.resource=t.resource,this.open()}),this.extensionHost.subscribe(this.closeCommand,()=>{this.close()}),this.$title=_t('<div role="heading" class="heading"></div>'),this.$content.append(this.$title),this.$content.append(' <div> <p class="message scroll"></p> <div class="buttons"> <a class="logout btn btn-primary" href="#" target="_parent"></a> <a class="login btn btn-primary" href="#" target="_parent"></a> <a class="cancel btn btn-primary" href="#"></a> </div> </div>'),this.$message=this.$content.find(".message"),this.$loginButton=this.$content.find(".login"),this.$loginButton.text(this.content.login),this.$logoutButton=this.$content.find(".logout"),this.$logoutButton.text(this.content.logout),this.$cancelButton=this.$content.find(".cancel"),this.$cancelButton.text(this.content.cancel),this.$element.hide(),this.$loginButton.on("click",t=>{t.preventDefault(),this.close(),this.loginCallback&&this.loginCallback()}),this.$logoutButton.on("click",t=>{t.preventDefault(),this.close(),this.logoutCallback&&this.logoutCallback()}),this.$cancelButton.on("click",t=>{t.preventDefault(),this.close()}),this.updateLogoutButton()}open(){super.open();let t="";this.resource.loginService&&(this.$title.text(this.resource.loginService.getProperty("label")),t=this.resource.loginService.getProperty("description")),this.options.warningMessage&&(t='<span class="warning">'+this.extension.data.config.content[this.options.warningMessage]+'</span><span class="description">'+t+"</span>"),this.updateLogoutButton(),this.$message.html(t),this.$message.targetBlank(),this.$message.find("a").on("click",function(){var e=_t(this).attr("href");this.extensionHost.publish(o.EXTERNAL_LINK_CLICKED,e)}),this.options.showCancelButton?this.$cancelButton.show():this.$cancelButton.hide(),this.resize()}updateLogoutButton(){this.extension.isLoggedIn?this.$logoutButton.show():this.$logoutButton.hide()}resize(){super.resize()}};var At=window.$,et=class extends E{constructor(t){super(t)}create(){this.setConfig("restrictedDialogue"),super.create(),this.openCommand=o.SHOW_RESTRICTED_DIALOGUE,this.closeCommand=o.HIDE_RESTRICTED_DIALOGUE,this.extensionHost.subscribe(this.openCommand,t=>{this.acceptCallback=t.acceptCallback,this.options=t.options,this.resource=t.resource,this.open()}),this.extensionHost.subscribe(this.closeCommand,()=>{this.close()}),this.$title=At('<div role="heading" class="heading"></div>'),this.$content.append(this.$title),this.$content.append(' <div> <p class="message scroll"></p> <div class="buttons"> <a class="cancel btn btn-primary" href="#" target="_parent"></a> </div> </div>'),this.$message=this.$content.find(".message"),this.$message.targetBlank(),this.$cancelButton=this.$content.find(".cancel"),this.$cancelButton.text(this.content.cancel),this.$element.hide(),this.$cancelButton.on("click",t=>{t.preventDefault(),this.close()})}open(){super.open(),this.isAccepted=!1;let t="";this.resource.restrictedService&&(this.$title.text(this.resource.restrictedService.getProperty("label")),t=this.resource.restrictedService.getProperty("description")),this.$message.html(t),this.$message.targetBlank(),this.$message.find("a").on("click",function(){var e=At(this).attr("href");this.extensionHost.publish(o.EXTERNAL_LINK_CLICKED,e)}),this.resize()}close(){super.close(),!this.isAccepted&&this.acceptCallback&&(this.isAccepted=!0,this.acceptCallback())}resize(){super.resize()}};var Ot=window.$,it=class extends E{constructor(t){super(t)}create(){this.setConfig("genericDialogue"),super.create(),this.openCommand=o.SHOW_GENERIC_DIALOGUE,this.closeCommand=o.HIDE_GENERIC_DIALOGUE,this.extensionHost.subscribe(this.openCommand,t=>{this.acceptCallback=t.acceptCallback,this.showMessage(t)}),this.extensionHost.subscribe(this.closeCommand,()=>{this.close()}),this.$message=Ot("<p></p>"),this.$content.append(this.$message),this.$acceptButton=Ot(`
<button class="btn btn-primary accept default">
${this.content.ok}
</button>
`),this.$buttons.append(this.$acceptButton),this.$buttons.find(".close").hide(),this.$acceptButton.onPressed(()=>{this.accept()}),this.returnFunc=()=>{this.isActive&&this.accept()},this.$element.hide()}accept(){this.extensionHost.publish(o.CLOSE_ACTIVE_DIALOGUE),this.acceptCallback&&this.acceptCallback()}showMessage(t){this.$message.html(t.message),t.buttonText?this.$acceptButton.text(t.buttonText):this.$acceptButton.text(this.content.ok),t.allowClose===!1&&this.disableClose(),this.open()}resize(){super.resize()}};var R=window.$,st=class extends C{constructor(t){super(t,!0,!0)}create(){super.create(),this.extensionHost.subscribe(o.SHOW_OVERLAY,()=>{this.$overlays.show()}),this.extensionHost.subscribe(o.HIDE_OVERLAY,()=>{this.$overlays.hide()}),this.$element.append('<a class="sr-only" href="#download-btn">'+this.extension.data.config.content.skipToDownload+"</a>"),this.$headerPanel=R('<div class="headerPanel"></div>'),this.$element.append(this.$headerPanel),this.$mainPanel=R('<div class="mainPanel"></div>'),this.$element.append(this.$mainPanel),this.$centerPanel=R('<div class="centerPanel"></div>'),this.$centerPanel.append('<h2 class="sr-only">'+this.extension.data.config.content.mediaViewer+"</h2>"),this.$mainPanel.append(this.$centerPanel),this.$leftPanel=R('<div class="leftPanel"></div>'),this.$mainPanel.append(this.$leftPanel),this.$rightPanel=R('<div class="rightPanel"></div>'),this.$mainPanel.append(this.$rightPanel),this.$footerPanel=R('<div class="footerPanel"></div>'),this.$element.append(this.$footerPanel),this.$mobileFooterPanel=R('<div class="mobileFooterPanel"></div>'),this.$element.append(this.$mobileFooterPanel),this.$overlays=R('<div class="overlays"></div>'),this.$element.append(this.$overlays),this.$overlays.hide(),this.$genericDialogue=R('<div class="overlay genericDialogue" aria-hidden="true"></div>'),this.$overlays.append(this.$genericDialogue),this.$overlays.on("click",t=>{R(t.target).hasClass("overlays")&&(t.preventDefault(),this.extensionHost.publish(o.CLOSE_ACTIVE_DIALOGUE))}),new it(this.$genericDialogue)}resize(){super.resize(),setTimeout(()=>{this.$overlays.width(this.extension.width()),this.$overlays.height(this.extension.height())},1);let t=this.$element.height()-parseInt(this.$mainPanel.css("paddingTop"))-(O(this.$headerPanel)?this.$headerPanel.height():0)-(O(this.$footerPanel)?this.$footerPanel.height():0)-(O(this.$mobileFooterPanel)?this.$mobileFooterPanel.height():0);this.$mainPanel.height(t)}};var L=window.$,Bt=class{constructor(){this.annotations=[];this.isCreated=!1;this.isLoggedIn=!1;this.metrics=[];this.shifted=!1;this.tabbing=!1;this.locales={};this.defaultConfig={};this.localeLoaders={"en-GB":()=>import("./en-GB-NZX2ZWUE.js"),"cy-GB":()=>import("./cy-GB-U3P4USVK.js"),"fr-FR":()=>import("./fr-FR-52NLPE7H.js"),"pl-PL":()=>import("./pl-PL-2SE72SET.js"),"sv-SE":()=>import("./sv-SE-EUXIBEVC.js")}}create(){let t=this;if(this.browserDetect=new mt,this.browserDetect.init(),P.publish=this.extensionHost.publish.bind(this.extensionHost),q.publish=this.extensionHost.publish.bind(this.extensionHost),this.$element=L(this.extensionHost.options.target),this.$element.data("component",this.extensionHost),this._parseMetrics(),this._updateMetric(),this._initLocales(),this.$element.empty(),this.$element.removeClass(),this.$element.addClass("uv-iiif-extension-host"),this.$element.addClass("loading"),this.data.locales?(this.$element.addClass(this.data.locales[0].name.toLowerCase()),this.$element.prop("lang",this.data.locales[0].name.substring(0,2))):this.$element.prop("lang",Et[0].name.substring(0,2)),this.isRightPanelEnabled()&&this.$element.addClass("right-panel-enabled"),this.isLeftPanelEnabled()&&this.$element.addClass("left-panel-enabled"),this.isFooterPanelEnabled()&&this.$element.addClass("footer-panel-enabled"),this.$element.addClass(this.type.name),this.$element.addClass("browser-"+this.browserDetect.browser),this.$element.addClass("browser-version-"+this.browserDetect.version),this.$element.prop("tabindex",-1),this.data.embedded&&this.$element.addClass("embedded"),this.isMobile()&&this.$element.addClass("mobile"),y.supportsFullscreen()&&this.$element.addClass("fullscreen-supported"),this.isFullScreen()&&this.$element.addClass("fullscreen"),this.$element.on("mousemove",e=>{this.mouseX=e.pageX,this.mouseY=e.pageY}),!this.data.isReload){let e=y.getHiddenProp();if(e){let i=e.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(i,()=>{y.isHidden()||this.resize()})}d.getBool(this.data.config.options.dropEnabled,!0)&&this.$element.on("drop",i=>{i.preventDefault();let s=i.originalEvent.dataTransfer.getData("URL"),n=_.getUrlParts(s),a=_.getQuerystringParameterFromString("manifest",n.search);if(a||(a=_.getQuerystringParameterFromString("collection",n.search)),a){this.fire(p.DROP,a);let r={};r.iiifManifestId=a,this.reload(r)}}),this.$element.on("dragover",i=>{i.preventDefault()}),this.$element.on("keyup keydown",i=>{this.shifted=i.shiftKey,this.tabbing=i.keyCode===9}),this.$element.on("keydown",i=>{let s=null,n=!0;!i.ctrlKey&&!i.altKey&&!i.shiftKey&&(i.keyCode===13&&(s=o.RETURN,n=!1),i.keyCode===27&&(s=o.ESCAPE),i.keyCode===33&&(s=o.PAGE_UP),i.keyCode===34&&(s=o.PAGE_DOWN),i.keyCode===35&&(s=o.END),i.keyCode===36&&(s=o.HOME),(i.keyCode===107||i.keyCode===171||i.keyCode===187)&&(s=o.PLUS,n=!1),(i.keyCode===109||i.keyCode===173||i.keyCode===189)&&(s=o.MINUS,n=!1),t.useArrowKeysToNavigate()&&(i.keyCode===37&&(s=o.LEFT_ARROW),i.keyCode===38&&(s=o.UP_ARROW),i.keyCode===39&&(s=o.RIGHT_ARROW),i.keyCode===40&&(s=o.DOWN_ARROW))),s&&(n&&i.preventDefault(),this.extensionHost.publish(s))})}this.extensionHost.subscribe(p.EXIT_FULLSCREEN,()=>{this.isOverlayActive()&&this.extensionHost.publish(o.ESCAPE),this.extensionHost.publish(o.ESCAPE),this.extensionHost.publish(p.RESIZE)}),this.$element.append('<iframe id="commsFrame"></iframe>'),this.extensionHost.subscribeAll((e,i)=>{[p.LOAD,p.DROP,p.TOGGLE_FULLSCREEN,p.EXTERNAL_RESOURCE_OPENED,p.RELOAD].includes(e)||this.fire(e,i)}),this.extensionHost.subscribe(p.EXTERNAL_RESOURCE_OPENED,()=>{this.fire(p.EXTERNAL_RESOURCE_OPENED)}),this.extensionHost.subscribe(o.LOGIN_FAILED,()=>{this.showMessage(this.data.config.content.authorisationFailedMessage)}),this.extensionHost.subscribe(o.LOGIN,()=>{this.isLoggedIn=!0}),this.extensionHost.subscribe(o.LOGOUT,()=>{this.isLoggedIn=!1}),this.extensionHost.subscribe(o.BOOKMARK,()=>{this.bookmark()}),this.extensionHost.subscribe(o.CANVAS_INDEX_CHANGE,e=>{this.data.canvasIndex=e,this.lastCanvasIndex=this.helper.canvasIndex,this.helper.canvasIndex=e}),this.extensionHost.subscribe(o.CLOSE_LEFT_PANEL,()=>{t.$element.hasClass("loading")&&t.$element.removeClass("loading"),this.resize()}),this.extensionHost.subscribe(o.CLOSE_RIGHT_PANEL,()=>{this.resize()}),this.extensionHost.subscribe(o.COLLECTION_INDEX_CHANGE,e=>{this.data.collectionIndex=e}),this.extensionHost.subscribe(p.CREATED,()=>{this.isCreated=!0}),this.extensionHost.subscribe(o.ESCAPE,()=>{this.isFullScreen()&&!this.isOverlayActive()&&this.extensionHost.publish(p.TOGGLE_FULLSCREEN)}),this.extensionHost.subscribe(p.LOAD,()=>{setTimeout(()=>{this.extensionHost.publish(p.RESIZE),this.fire(p.LOAD,this.helper.getCurrentCanvas().id),this.$element.removeClass("loading")},100)}),this.extensionHost.subscribe(o.FEEDBACK,()=>{this.feedback()}),this.extensionHost.subscribe(o.FORBIDDEN,()=>{this.extensionHost.publish(o.OPEN_EXTERNAL_RESOURCE)}),this.extensionHost.subscribe(p.LOAD_FAILED,()=>{!t.lastCanvasIndex==null&&t.lastCanvasIndex!==t.helper.canvasIndex&&this.extensionHost.publish(o.CANVAS_INDEX_CHANGE,t.lastCanvasIndex)}),this.extensionHost.subscribe(o.MANIFEST_INDEX_CHANGE,e=>{this.data.manifestIndex=e}),this.extensionHost.subscribe(o.OPEN,()=>{let e=F.format(this.data.config.options.openTemplate,this.helper.manifestUri);window.open(e)}),this.extensionHost.subscribe(o.OPEN_LEFT_PANEL,()=>{this.$element.hasClass("loading")||this.resize()}),this.extensionHost.subscribe(o.OPEN_RIGHT_PANEL,()=>{this.$element.hasClass("loading")||this.resize()}),this.extensionHost.subscribe(o.RANGE_CHANGE,e=>{e?(this.data.rangeId=e.id,this.helper.rangeId=e.id):(this.data.rangeId=void 0,this.helper.rangeId=void 0)}),this.extensionHost.subscribe(o.RESOURCE_DEGRADED,e=>{P.handleDegraded(e)}),this.extensionHost.subscribe(o.SHOW_MESSAGE,e=>{this.showMessage(e)}),this.extensionHost.subscribe(o.SHOW_TERMS_OF_USE,()=>{let e=this.helper.getLicense();if(!e){let i=this.helper.getRequiredStatement();i&&i.value&&(e=i.value)}e&&this.showMessage(e)}),this.extensionHost.subscribe(p.TOGGLE_FULLSCREEN,()=>{let e=this.data.config.options.overrideFullScreen;this.extensionHost.isFullScreen=!this.extensionHost.isFullScreen,e||(L("#top").focus(),this.extensionHost.isFullScreen?this.$element.addClass("fullscreen"):this.$element.removeClass("fullscreen")),this.fire(p.TOGGLE_FULLSCREEN,{isFullScreen:this.extensionHost.isFullScreen,overrideFullScreen:e})}),this.shell=new st(this.$element),this.createModules(),this.extensionHost.publish(p.RESIZE),setTimeout(()=>{this.render(),this.extensionHost.publish(p.CREATED),this._setDefaultFocus()},1)}async loadConfig(t,e){return this.translateLocale(this.defaultConfig,t)}async translateLocale(t,e){let s=await(this.localeLoaders[e]||this.localeLoaders["en-GB"])()||{},n=JSON.stringify(t);for(let a in s){let r=a.replace("$",""),h=new RegExp(`\\$${r}\\b`,"g");n=n.replace(h,s[a])}return n=JSON.parse(n),n}createModules(){this.$authDialogue=L('<div class="overlay auth" aria-hidden="true"></div>'),this.shell.$overlays.append(this.$authDialogue),this.authDialogue=new Z(this.$authDialogue),this.$clickThroughDialogue=L('<div class="overlay clickthrough" aria-hidden="true"></div>'),this.shell.$overlays.append(this.$clickThroughDialogue),this.clickThroughDialogue=new K(this.$clickThroughDialogue),this.$restrictedDialogue=L('<div class="overlay login" aria-hidden="true"></div>'),this.shell.$overlays.append(this.$restrictedDialogue),this.restrictedDialogue=new et(this.$restrictedDialogue),this.$loginDialogue=L('<div class="overlay login" aria-hidden="true"></div>'),this.shell.$overlays.append(this.$loginDialogue),this.loginDialogue=new tt(this.$loginDialogue)}_setDefaultFocus(){setTimeout(()=>{this.data.config.options.allowStealFocus&&L("[tabindex=0]").focus()},1)}width(){return this.$element.width()}height(){return this.$element.height()}exitFullScreen(){this.extensionHost.publish(p.EXIT_FULLSCREEN)}fire(t,...e){this.data.debug&&console.log(t,arguments[1]),this.extensionHost.fire(t,arguments[1])}redirect(t){this.fire(o.REDIRECT,t)}refresh(){this.fire(o.REFRESH,null)}render(){if((!this.isCreated||this.data.collectionIndex!==this.helper.collectionIndex)&&this.extensionHost.publish(o.COLLECTION_INDEX_CHANGE,this.data.collectionIndex),(!this.isCreated||this.data.manifestIndex!==this.helper.manifestIndex)&&this.data.iiifManifestId!==void 0&&this.extensionHost.publish(o.MANIFEST_INDEX_CHANGE,this.data.manifestIndex),(!this.isCreated||this.data.canvasIndex!==this.helper.canvasIndex)&&(this.data.canvasIndex===void 0&&(this.data.canvasIndex=0),this.data.canvasId&&(this.data.canvasIndex=this.helper.canvasIndex),this.extensionHost.publish(o.CANVAS_INDEX_CHANGE,this.data.canvasIndex)),(!this.isCreated||this.data.rangeId!==this.helper.rangeId)&&this.data.rangeId){let t=this.helper.getRangeById(this.data.rangeId);t?this.extensionHost.publish(o.RANGE_CHANGE,t):console.warn("range id not found:",this.data.rangeId)}}_initLocales(){let t=this.data.config.localisation.locales.slice(0),e=this.data.locales,i=[];e?(e.forEach(n=>{let a=t.filter(h=>h.name===n.name);if(a.length){var r=a[0];n.label&&(r.label=n.label),r.added=!0,i.push(r)}}),d.getBool(this.data.config.options.limitLocales,!1)||t.forEach(n=>{n.added||i.push(n),delete n.added}),this.data.locales=i):console.warn("No locales configured")}_parseMetrics(){let t=this.data.config.options.metrics;if(t)for(let e=0;e<t.length;e++){let i=t[e];this.metrics.push(i)}}_updateMetric(){for(let e=this.metrics.length-1;e>=0;e--){let i=this.metrics[e];if(window.innerWidth>=i.minWidth){if(this.metric!==i.type){this.metric=i.type;for(var t=0;t<this.metrics.length;t++)this.$element.removeClass(this.metrics[t].type);this.$element.addClass(i.type),this.extensionHost.publish(o.METRIC_CHANGE)}break}}}resize(){this._updateMetric(),this.extensionHost.publish(p.RESIZE)}reload(t){this.extensionHost.publish(p.RELOAD,t)}getShareUrl(){if(this.data.embedded){if(this.helper.hasRelatedPage()){var t=this.helper.getRelated();return t&&t.length&&(t=t[0]),t["@id"]}let e=this.helper.manifest,i=e&&e.getHomepage();if(i)return i}else if(y.isInIFrame())try{return parent.document.location.href}catch{return null}else return document.location.href;return null}getIIIFShareUrl(t=!1){let e;return t&&(this.helper.manifest?e=this.helper.manifest.id:e=this.helper.manifestUri),`${e}?manifest=${e}`}getDomain(){return _.getUrlParts(this.helper.manifestUri).host}getSettings(){if(d.getBool(this.data.config.options.saveUserSettings,!1)){let t=S.get("uv.settings","local");if(t)return L.extend(this.data.config.options,t.value)}return this.data.config.options}updateSettings(t){if(d.getBool(this.data.config.options.saveUserSettings,!1)){let e=S.get("uv.settings","local");e&&(t=L.extend(e.value,t)),S.set("uv.settings",t,31536e4,"local")}this.data.config.options=L.extend(this.data.config.options,t)}getLocale(){return this.helper.options.locale}getSharePreview(){let t=this.helper.getLabel(),e=this.helper.getCurrentCanvas(),i=e.getProperty("thumbnail");return(!i||typeof i!="string")&&(i=e.getCanonicalImageUri(this.data.config.options.bookmarkThumbWidth)),{title:t,image:i}}getAppUri(){let t=this.data.config.modules.shareDialogue.options,e=t?.embedHost??`${window.location.protocol}//${window.location.hostname}`,i=t?.embedPort??window.location.port,s=t?.embedPath??"/uv.html";return`${e}${i?`:${i}`:""}${s}`}buildEmbedScript(t,e,i,s){let n=this.getAppUri(),a=this.helper.getLabel()??"";return(s?.size??0)>0&&(n+=`#?${s.toString()}`),F.format(t,n,e.toString(),i.toString(),a)}getPagedIndices(t=this.helper.canvasIndex){return[t]}getCurrentCanvases(){let t=this.getPagedIndices(this.helper.canvasIndex),e=[];for(let i=0;i<t.length;i++){let s=t[i],n=this.helper.getCanvasByIndex(s);n&&e.push(n)}return e}getCanvasLabels(t){let e=this.getPagedIndices(),i="";if(e.length===1)i=t;else for(let s=1;s<=e.length;s++)i.length&&(i+=","),i+=t+" "+s;return i}getCurrentCanvasRange(){return this.helper.getCanvasRange(this.helper.getCurrentCanvas())}getExternalResources(t){let e=this.getPagedIndices(),i=[];e.forEach(a=>{let r=this.helper.getCanvasByIndex(a),h;if(r.externalResource?h=r.externalResource:h=new xt(r,{authApiVersion:this.data.config.options.authAPIVersion}),t){let c=t.find(v=>v.dataUri===h.dataUri);c?i.push(c):i.push(h)}else i.push(h)});let s=this.data.config.options.tokenStorage;return this.data.config.options.authAPIVersion===1?new Promise(a=>{let r={locale:this.helper.options.locale};q.loadExternalResources(i,s,r).then(h=>{this.resources=h.map(c=>this._prepareResourceData(c)),a(this.resources)})}):new Promise(a=>{P.loadExternalResources(i,s).then(r=>{this.resources=r.map(h=>this._prepareResourceData(h)),a(this.resources)})})}_prepareResourceData(t){return t.data.hasServiceDescriptor=t.hasServiceDescriptor(),t.hasServiceDescriptor()||(t.data.id=t.dataUri,t.data.width=t.width,t.data.height=t.height),t.data.index=t.index,vt.toPlainObject(t.data)}getMediaFormats(t){let e=t.getContent();return e&&e.length?e[0].getBody():[{id:t.id,type:t.getType(),getFormat:function(){return""}}]}viewCanvas(t){if(this.helper.isCanvasIndexOutOfRange(t)){this.showMessage(this.data.config.content.canvasIndexOutOfRange);return}this.extensionHost.publish(o.OPEN_EXTERNAL_RESOURCE)}showMessage(t,e,i,s){this.closeActiveDialogue(),this.extensionHost.publish(o.SHOW_GENERIC_DIALOGUE,{message:t,acceptCallback:e,buttonText:i,allowClose:s})}closeActiveDialogue(){this.extensionHost.publish(o.CLOSE_ACTIVE_DIALOGUE)}isOverlayActive(){return O(this.shell.$overlays)}isDesktopMetric(){return this.metric==="lg"||this.metric==="xl"}isMobileMetric(){return this.metric==="sm"||this.metric==="md"}isMetric(t){return typeof t=="string"?this.metric===t:t.some(e=>this.metric===e)}viewManifest(t){let e={};e.iiifManifestId=this.helper.manifestUri,e.collectionIndex=this.helper.getCollectionIndex(t),e.manifestIndex=t.index,e.canvasIndex=0,this.reload(e)}viewCollection(t){let e={};e.iiifManifestId=t.parentCollection?t.parentCollection.id:this.helper.manifestUri,e.collectionIndex=t.index,e.manifestIndex=0,e.canvasIndex=0,this.reload(e)}isFullScreen(){return this.extensionHost.isFullScreen}isHeaderPanelEnabled(){return d.getBool(this.data.config.options.headerPanelEnabled,!0)}isLeftPanelEnabled(){if(d.getBool(this.data.config.options.leftPanelEnabled,!0)){if(this.helper.hasParentCollection())return!0;if(this.helper.isMultiCanvas()&&!this.helper.isContinuous())return!0}return!1}isRightPanelEnabled(){return d.getBool(this.data.config.options.rightPanelEnabled,!0)}isFooterPanelEnabled(){return d.getBool(this.data.config.options.footerPanelEnabled,!0)}isMobile(){let t=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|android|ipad|playbook|silk|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/i.test(t)||/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(t.substr(0,4))}useArrowKeysToNavigate(){return d.getBool(this.data.config.options.useArrowKeysToNavigate,!0)}bookmark(){}feedback(){this.fire(o.FEEDBACK,this.data)}getAlternateLocale(){let t=null;return this.data.locales&&this.data.locales.length>1&&(t=this.data.locales[1]),t}getSerializedLocales(){return this.data.locales?this.serializeLocales(this.data.locales):null}serializeLocales(t){let e="";for(let i=0;i<t.length;i++){let s=t[i];i>0&&(e+=","),e+=s.name,s.label&&(e+=":"+s.label)}return e}changeLocale(t){let e={};if(this.data.locales){e.locales=this.data.locales.slice(0);let i=e.locales.findIndex(n=>n.name===t);e.locales.splice(0,0,e.locales.splice(i,1)[0]),this.reload(e)}}dispose(){this.store?.setState(null)}},mt=class{constructor(){this.dataBrowser=[{string:navigator.userAgent,subString:"Chrome",identity:"Chrome"},{string:navigator.userAgent,subString:"MSIE",identity:"Explorer"},{string:navigator.userAgent,subString:"Trident",identity:"Explorer"},{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:navigator.userAgent,subString:"Safari",identity:"Safari"},{string:navigator.userAgent,subString:"Opera",identity:"Opera"}]}init(){this.browser=this.searchString(this.dataBrowser)||"Other",this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"Unknown",this.browser=="Explorer"&&this.version=="7"&&navigator.userAgent.match(/Trident/i)&&(this.version=this.searchVersionIE())}searchString(t){for(var e=0;e<t.length;e++){var i=t[e].string;if(this.versionSearchString=t[e].subString,i.indexOf(t[e].subString)!=-1)return t[e].identity}}searchVersion(t){var e=t.indexOf(this.versionSearchString);if(e!=-1)return parseFloat(t.substring(e+this.versionSearchString.length+1))}searchVersionIE(){var t=navigator.userAgent.toString().toLowerCase(),e=/(trident)(?:.*rv:([\w.]+))?/.exec(t)||/(msie) ([\w.]+)/.exec(t)||["",null,-1],i="unknown";return e!==null&&e.length===3&&e[2]&&(i=e[2].split(".")[0]),i}};var m=window.$,Rt=class extends C{constructor(t){super(t)}create(){this.setConfig("footerPanel"),super.create(),this.extensionHost.subscribe(p.TOGGLE_FULLSCREEN,()=>{this.updateFullScreenButton(),this.extensionHost.isFullScreen||setTimeout(()=>{this.resize()},1001)}),this.extensionHost.subscribe(o.METRIC_CHANGE,()=>{this.updateMinimisedButtons(),this.updateMoreInfoButton()}),this.extensionHost.subscribe(o.SETTINGS_CHANGE,()=>{this.updateDownloadButton()}),this.$options=m('<div class="options"></div>'),this.$element.append(this.$options),this.$leftOptions=m('<div class="left-options"></div>'),this.$options.prepend(this.$leftOptions),this.$mainOptions=m('<div class="main-options"></div>'),this.$options.append(this.$mainOptions),this.$rightOptions=m('<div class="right-options"></div>'),this.$options.append(this.$rightOptions),this.$feedbackButton=m(`
<button class="feedback btn imageBtn" title="${this.content.feedback}">
<i class="uv-icon uv-icon-feedback" aria-hidden="true"></i>
<span class="sr-only">${this.content.feedback}</span>
</button>
`),this.$mainOptions.prepend(this.$feedbackButton),this.$openButton=m(`
<button class="open btn imageBtn" title="${this.content.open}">
<i class="uv-icon-open" aria-hidden="true"></i>
<span class="sr-only">${this.content.open}</span>
</button>
`),this.$mainOptions.prepend(this.$openButton),this.$bookmarkButton=m(`
<button class="bookmark btn imageBtn" title="${this.content.bookmark}">
<i class="uv-icon uv-icon-bookmark" aria-hidden="true"></i>
<span class="sr-only">${this.content.bookmark}</span>
</button>
`),this.$mainOptions.prepend(this.$bookmarkButton),this.$shareButton=m(`
<button class="share btn imageBtn" title="${this.content.share}">
<i class="uv-icon uv-icon-share" aria-hidden="true"></i>
<span class="sr-only">${this.content.share}</span>
</button>
`),this.$mainOptions.append(this.$shareButton),this.$embedButton=m(`
<button class="embed btn imageBtn" title="${this.content.embed}">
<i class="uv-icon uv-icon-embed" aria-hidden="true"></i>
<span class="sr-only">${this.content.embed}</span>
</button>
`),this.$mainOptions.append(this.$embedButton),this.$downloadButton=m(`
<button class="download btn imageBtn" title="${this.content.download}" id="download-btn">
<i class="uv-icon uv-icon-download" aria-hidden="true"></i>
<span class="sr-only">${this.content.download}</span>
</button>
`),this.$mainOptions.prepend(this.$downloadButton),this.$fullScreenBtn=m(`
<button class="fullScreen btn imageBtn" title="${this.content.fullScreen}">
<i class="uv-icon uv-icon-fullscreen" aria-hidden="true"></i>
<span class="sr-only">${this.content.fullScreen}</span>
</button>
`),this.$mainOptions.append(this.$fullScreenBtn),this.$moreInfoButton=m(`
<button class="moreInfo btn imageBtn" title="${m(".mainPanel.rightPanelOpen").length!==0?this.content.closeRightPanel:this.content.openRightPanel}">
<i class="uv-icon uv-icon-more-info" aria-hidden="true"></i>
<span class="sr-only">${m(".mainPanel.rightPanelOpen").length!==0?this.content.closeRightPanel:this.content.openRightPanel}</span>
</button>
`),this.$rightOptions.append(this.$moreInfoButton),this.$toggleLeftPanelButton=m(`
<button class="toggleLeftPanelButton btn imageBtn" title="${m(".mainPanel.leftPanelOpen").length!==0?this.content.closeLeftPanel:this.content.openLeftPanel}">
<i class="uv-icon uv-icon-toggle-left-panel" aria-hidden="true"></i>
<span class="sr-only">${m(".mainPanel.leftPanelOpen").length!==0?this.content.closeLeftPanel:this.content.openLeftPanel}</span>
</button>
`),this.$leftOptions.append(this.$toggleLeftPanelButton),(m(".leftPanel").css("display")==="none"||m(".leftPanel").contents().length===0)&&this.$toggleLeftPanelButton.hide(),this.$openButton.onPressed(()=>{this.extensionHost.publish(o.OPEN)}),this.$feedbackButton.onPressed(()=>{this.extensionHost.publish(o.FEEDBACK)}),this.$bookmarkButton.onPressed(()=>{this.extensionHost.publish(o.BOOKMARK)}),this.$shareButton.onPressed(()=>{this.extensionHost.publish(o.SHOW_SHARE_DIALOGUE,this.$shareButton)}),this.$embedButton.onPressed(()=>{this.extensionHost.publish(o.SHOW_EMBED_DIALOGUE,this.$embedButton)}),this.$downloadButton.onPressed(()=>{this.extensionHost.publish(o.SHOW_DOWNLOAD_DIALOGUE,this.$downloadButton)}),this.$moreInfoButton.onPressed(()=>{this.extensionHost.publish(o.TOGGLE_RIGHT_PANEL,this.$moreInfoButton);let t=m(".mainPanel.rightPanelOpen").length!==0?this.content.closeRightPanel:this.content.openRightPanel;this.$moreInfoButton.attr("title",t),this.$moreInfoButton.find(".sr-only").text(t)}),this.$toggleLeftPanelButton.onPressed(()=>{this.extensionHost.publish(o.TOGGLE_LEFT_PANEL,this.$moreInfoButton);let t=m(".mainPanel.leftPanelOpen").length!==0?this.content.closeLeftPanel:this.content.openLeftPanel;this.$toggleLeftPanelButton.attr("title",t),this.$toggleLeftPanelButton.find(".sr-only").text(t)}),this.onAccessibleClick(this.$fullScreenBtn,t=>{t.preventDefault(),this.extensionHost.publish(p.TOGGLE_FULLSCREEN)},!0),d.getBool(this.options.embedEnabled,!0)||this.$embedButton.hide(),this.updateMoreInfoButton(),this.updateOpenButton(),this.updateFeedbackButton(),this.updateBookmarkButton(),this.updateEmbedButton(),this.updateDownloadButton(),this.updateFullScreenButton(),this.updateShareButton(),this.updateMinimisedButtons()}updateMinimisedButtons(){d.getBool(this.options.minimiseButtons,!1)||!this.extension.isDesktopMetric()?this.$options.find("span").addClass("sr-only"):this.$options.find("span").removeClass("sr-only")}updateMoreInfoButton(){}updateOpenButton(){d.getBool(this.options.openEnabled,!1)&&y.isInIFrame()?this.$openButton.show():this.$openButton.hide()}updateFullScreenButton(){if(!d.getBool(this.options.fullscreenEnabled,!0)||!y.supportsFullscreen()){this.$fullScreenBtn.hide();return}this.extension.isFullScreen()?(this.$fullScreenBtn.switchClass("fullScreen","exitFullscreen"),this.$fullScreenBtn.find("i").switchClass("uv-icon-fullscreen","uv-icon-exit-fullscreen"),this.$fullScreenBtn.attr("title",this.content.exitFullScreen),m(this.$fullScreenBtn[0].firstChild.nextSibling.nextSibling).replaceWith(this.content.exitFullScreen)):(this.$fullScreenBtn.switchClass("exitFullscreen","fullScreen"),this.$fullScreenBtn.find("i").switchClass("uv-icon-exit-fullscreen","uv-icon-fullscreen"),this.$fullScreenBtn.attr("title",this.content.fullScreen),m(this.$fullScreenBtn[0].firstChild.nextSibling.nextSibling).replaceWith(this.content.fullScreen))}updateEmbedButton(){this.extension.helper.isUIEnabled("embed")&&d.getBool(this.options.embedEnabled,!1)?this.extension.isMobile()||this.$embedButton.show():this.$embedButton.hide()}updateShareButton(){this.extension.helper.isUIEnabled("share")&&d.getBool(this.options.shareEnabled,!0)?this.$shareButton.show():this.$shareButton.hide()}updateDownloadButton(){d.getBool(this.options.downloadEnabled,!0)?this.$downloadButton.show():this.$downloadButton.hide()}updateFeedbackButton(){d.getBool(this.options.feedbackEnabled,!1)?this.$feedbackButton.show():this.$feedbackButton.hide()}updateBookmarkButton(){d.getBool(this.options.bookmarkEnabled,!1)?this.$bookmarkButton.show():this.$bookmarkButton.hide()}resize(){super.resize()}};var X=class{constructor(t,e){this.message=t;this.actions=e}};var nt=class{constructor(){}};var ot=class{constructor(t){this.extension=t}Get(t){switch(t.informationType){case 0:return new X(this.extension.data.config.content.authCORSError,[]);case 1:let e=[],i=new nt,s;t.param.loginService?s=t.param.loginService.getConfirmLabel():s=t.param.kioskService.getConfirmLabel(),s||(s=this.extension.data.config.content.fallbackDegradedLabel||"login"),i.label=s;let n=t.param;i.action=()=>{t.param.loginService&&(n.authHoldingPage=window.open("","_blank")),this.extension.extensionHost.publish(o.HIDE_INFORMATION),this.extension.extensionHost.publish(o.OPEN_EXTERNAL_RESOURCE,[[n]])},e.push(i);let a;return t.param.loginService?a=t.param.loginService.getServiceLabel():a=t.param.kioskService.getServiceLabel(),a||(a=this.extension.data.config.content.fallbackDegradedMessage),new X(a,e)}}};var M=window.$,Lt=class extends C{constructor(t){super(t,!1,!1)}create(){this.setConfig("headerPanel"),super.create(),this.extensionHost.subscribe(o.SHOW_INFORMATION,e=>{this.showInformation(Array.isArray(e)?e[0]:e)}),this.extensionHost.subscribe(o.HIDE_INFORMATION,()=>{this.hideInformation()}),this.$opti