Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
<!DOCTYPE HTML> <!-- Pannellum 2.5.6, https://github.com/mpetroff/pannellum --> <html> <head> <meta charset=utf-8> <meta name=viewport content="width=device-width, initial-scale=1.0"> <title>Pannellum</title> <style type="text/css"> .pnlm-container { margin: 0; padding: 0; overflow: hidden; position: relative; cursor: default; width: 100%; height: 100%; font-family: Helvetica,"Nimbus Sans L","Liberation Sans",Arial,sans-serif; background: #f4f4f4 url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2267%22%20height%3D%22100%22%20viewBox%3D%220%200%2067%20100%22%3E%0A%3Cpath%20stroke%3D%22%23ccc%22%20fill%3D%22none%22%20d%3D%22M33.5%2C50%2C0%2C63%2C33.5%2C75%2C67%2C63%2C33.5%2C50m-33.5-50%2C67%2C25m-0.5%2C0%2C0%2C75m-66.5-75%2C67-25m-33.5%2C75%2C0%2C25m0-100%2C0%2C50%22%2F%3E%0A%3C%2Fsvg%3E%0A') repeat; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -o-user-select: none; -ms-user-select: none; user-select: none; outline: 0; line-height: 1.4; contain: content } .pnlm-container * { box-sizing: content-box } .pnlm-ui { position: absolute; width: 100%; height: 100%; z-index: 1 } .pnlm-grab { cursor: grab; cursor: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2226%22%20width%3D%2226%22%3E%0A%3Cpath%20stroke%3D%22%23000%22%20stroke-width%3D%221px%22%20fill%3D%22%23fff%22%20d%3D%22m15.3%2020.5s6.38-6.73%204.64-8.24-3.47%201.01-3.47%201.01%203.61-5.72%201.41-6.49c-2.2-0.769-3.33%204.36-3.33%204.36s0.873-5.76-1.06-5.76-1.58%205.39-1.58%205.39-0.574-4.59-2.18-4.12c-1.61%200.468-0.572%205.51-0.572%205.51s-1.58-4.89-2.93-3.79c-1.35%201.11%200.258%205.25%200.572%206.62%200.836%202.43%202.03%202.94%202.17%205.55%22%2F%3E%0A%3C%2Fsvg%3E%0A') 12 8,default } .pnlm-grabbing { cursor: grabbing; cursor: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2226%22%20width%3D%2226%22%3E%0A%3Cpath%20stroke%3D%22%23000%22%20stroke-width%3D%221px%22%20fill%3D%22%23fff%22%20d%3D%22m15.3%2020.5s5.07-5.29%203.77-6.74c-1.31-1.45-2.53%200.14-2.53%200.14s2.74-3.29%200.535-4.06c-2.2-0.769-2.52%201.3-2.52%201.3s0.81-2.13-1.12-2.13-1.52%201.77-1.52%201.77-0.261-1.59-1.87-1.12c-1.61%200.468-0.874%202.17-0.874%202.17s-0.651-1.55-2-0.445c-1.35%201.11-0.68%202.25-0.365%203.62%200.836%202.43%202.03%202.94%202.17%205.55%22%2F%3E%0A%3C%2Fsvg%3E%0A') 12 8,default } .pnlm-sprite { background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2226%22%20height%3D%22208%22%3E%0A%3Ccircle%20fill-opacity%3D%22.78%22%20cy%3D%22117%22%20cx%3D%2213%22%20r%3D%2211%22%20fill%3D%22%23fff%22%2F%3E%0A%3Ccircle%20fill-opacity%3D%22.78%22%20cy%3D%22143%22%20cx%3D%2213%22%20r%3D%2211%22%20fill%3D%22%23fff%22%2F%3E%0A%3Ccircle%20cy%3D%22169%22%20cx%3D%2213%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%0A%3Ccircle%20cy%3D%22195%22%20cx%3D%2213%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%0A%3Ccircle%20cx%3D%2213%22%20cy%3D%22195%22%20r%3D%222.5%22%2F%3E%0A%3Cpath%20d%3D%22m5%2083v6h2v-4h4v-2zm10%200v2h4v4h2v-6zm-5%205v6h6v-6zm-5%205v6h6v-2h-4v-4zm14%200v4h-4v2h6v-6z%22%2F%3E%0A%3Cpath%20d%3D%22m13%20110a7%207%200%200%200%20-7%207%207%207%200%200%200%207%207%207%207%200%200%200%207%20-7%207%207%200%200%200%20-7%20-7zm-1%203h2v2h-2zm0%203h2v5h-2z%22%2F%3E%0A%3Cpath%20d%3D%22m5%2057v6h2v-4h4v-2zm10%200v2h4v4h2v-6zm-10%2010v6h6v-2h-4v-4zm14%200v4h-4v2h6v-6z%22%2F%3E%0A%3Cpath%20d%3D%22m17%2038v2h-8v-2z%22%2F%3E%0A%3Cpath%20d%3D%22m12%209v3h-3v2h3v3h2v-3h3v-2h-3v-3z%22%2F%3E%0A%3Cpath%20d%3D%22m13%20136-6.125%206.125h4.375v7.875h3.5v-7.875h4.375z%22%2F%3E%0A%3Cpath%20d%3D%22m10.428%20173.33v-5.77l5-2.89v5.77zm1-1.73%203-1.73-3.001-1.74z%22%2F%3E%0A%3C%2Fsvg%3E%0A') } .pnlm-container:-moz-full-screen { height: 100%!important; width: 100%!important; position: static!important } .pnlm-container:-webkit-full-screen { height: 100%!important; width: 100%!important; position: static!important } .pnlm-container:-ms-fullscreen { height: 100%!important; width: 100%!important; position: static!important } .pnlm-container:fullscreen { height: 100%!important; width: 100%!important; position: static!important } .pnlm-render-container { cursor: inherit; position: absolute; height: 100%; width: 100% } .pnlm-controls { margin-top: 4px; background-color: #fff; border: 1px solid #999; border-color: rgba(0,0,0,0.4); border-radius: 3px; cursor: pointer; z-index: 2; -webkit-transform: translateZ(9999px); transform: translateZ(9999px) } .pnlm-control:hover { background-color: #f8f8f8 } .pnlm-controls-container { position: absolute; top: 0; left: 4px; z-index: 1 } .pnlm-zoom-controls { width: 26px; height: 52px } .pnlm-zoom-in { width: 100%; height: 50%; position: absolute; top: 0; border-radius: 3px 3px 0 0 } .pnlm-zoom-out { width: 100%; height: 50%; position: absolute; bottom: 0; background-position: 0 -26px; border-top: 1px solid #ddd; border-top-color: rgba(0,0,0,0.10); border-radius: 0 0 3px 3px } .pnlm-fullscreen-toggle-button,.pnlm-orientation-button,.pnlm-hot-spot-debug-indicator { width: 26px; height: 26px } .pnlm-hot-spot-debug-indicator { position: absolute; top: 50%; left: 50%; width: 26px; height: 26px; margin: -13px 0 0 -13px; background-color: rgba(255,255,255,0.5); border-radius: 13px; display: none } .pnlm-orientation-button-inactive { background-position: 0 -156px } .pnlm-orientation-button-active { background-position: 0 -182px } .pnlm-fullscreen-toggle-button-inactive { background-position: 0 -52px } .pnlm-fullscreen-toggle-button-active { background-position: 0 -78px } .pnlm-panorama-info { position: absolute; bottom: 4px; background-color: rgba(0,0,0,0.7); border-radius: 0 3px 3px 0; padding-right: 10px; color: #fff; text-align: left; display: none; z-index: 2; -webkit-transform: translateZ(9999px); transform: translateZ(9999px) } .pnlm-title-box { position: relative; font-size: 20px; display: table; padding-left: 5px; margin-bottom: 3px } .pnlm-author-box { position: relative; font-size: 12px; display: table; padding-left: 5px } .pnlm-load-box { position: absolute; top: 50%; left: 50%; width: 200px; height: 150px; margin: -75px 0 0 -100px; background-color: rgba(0,0,0,0.7); border-radius: 3px; text-align: center; font-size: 20px; display: none; color: #fff } .pnlm-load-box p { margin: 20px 0 } .pnlm-lbox { position: absolute; top: 50%; left: 50%; width: 20px; height: 20px; margin: -10px 0 0 -10px; display: none } .pnlm-loading { animation-duration: 1.5s; -webkit-animation-duration: 1.5s; animation-name: pnlm-mv; -webkit-animation-name: pnlm-mv; animation-iteration-count: infinite; -webkit-animation-iteration-count: infinite; animation-timing-function: linear; -webkit-animation-timing-function: linear; height: 10px; width: 10px; background-color: #fff; position: relative } @keyframes pnlm-mv { from { left: 0; top: 0 } 25% { left: 10px; top: 0 } 50% { left: 10px; top: 10px } 75% { left: 0; top: 10px } to { left: 0; top: 0 } } @-webkit-keyframes pnlm-mv { from { left: 0; top: 0 } 25% { left: 10px; top: 0 } 50% { left: 10px; top: 10px } 75% { left: 0; top: 10px } to { left: 0; top: 0 } } .pnlm-load-button { position: absolute; top: 50%; left: 50%; width: 200px; height: 100px; margin: -50px 0 0 -100px; background-color: rgba(0,0,0,.7); border-radius: 3px; text-align: center; font-size: 20px; display: table; color: #fff; cursor: pointer } .pnlm-load-button:hover { background-color: rgba(0,0,0,.8) } .pnlm-load-button p { display: table-cell; vertical-align: middle } .pnlm-info-box { font-size: 15px; position: absolute; top: 50%; left: 50%; width: 200px; height: 150px; margin: -75px 0 0 -100px; background-color: #000; border-radius: 3px; display: table; text-align: center; color: #fff; table-layout: fixed } .pnlm-info-box a,.pnlm-author-box a { color: #fff; word-wrap: break-word; overflow-wrap: break-word } .pnlm-info-box p { display: table-cell; vertical-align: middle; padding: 0 5px 0 5px } .pnlm-error-msg { display: none } .pnlm-about-msg { font-size: 11px; line-height: 11px; color: #fff; padding: 5px 8px 5px 8px; background: rgba(0,0,0,0.7); border-radius: 3px; position: absolute; top: 50px; left: 50px; display: none; opacity: 0; -moz-transition: opacity .3s ease-in-out; -webkit-transition: opacity .3s ease-in-out; -o-transition: opacity .3s ease-in-out; -ms-transition: opacity .3s ease-in-out; transition: opacity .3s ease-in-out; z-index: 1 } .pnlm-about-msg a:link,.pnlm-about-msg a:visited { color: #fff } .pnlm-about-msg a:hover,.pnlm-about-msg a:active { color: #eee } .pnlm-hotspot-base { position: absolute; visibility: hidden; cursor: default; vertical-align: middle; top: 0; z-index: 1 } .pnlm-hotspot { height: 26px; width: 26px; border-radius: 13px } .pnlm-hotspot:hover { background-color: rgba(255,255,255,0.2) } .pnlm-hotspot.pnlm-info { background-position: 0 -104px } .pnlm-hotspot.pnlm-scene { background-position: 0 -130px } div.pnlm-tooltip span { visibility: hidden; position: absolute; border-radius: 3px; background-color: rgba(0,0,0,0.7); color: #fff; text-align: center; max-width: 200px; padding: 5px 10px; margin-left: -220px; cursor: default } div.pnlm-tooltip:hover span { visibility: visible } div.pnlm-tooltip:hover span:after { content: ''; position: absolute; width: 0; height: 0; border-width: 10px; border-style: solid; border-color: rgba(0,0,0,0.7) transparent transparent transparent; bottom: -20px; left: -10px; margin: 0 50% } .pnlm-compass { position: absolute; width: 50px; height: 50px; right: 4px; bottom: 4px; border-radius: 25px; background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2250%22%20width%3D%2250%22%3E%0A%3Cpath%20d%3D%22m24.5078%206-3.2578%2018h7.5l-3.25781-18h-0.984376zm-3.2578%2020%203.2578%2018h0.9844l3.2578-18h-7.5zm1.19531%200.9941h5.10938l-2.5547%2014.1075-2.5547-14.1075z%22%2F%3E%0A%3C%2Fsvg%3E%0A'); cursor: default; display: none } .pnlm-world { position: absolute; left: 50%; top: 50% } .pnlm-face { position: absolute; -webkit-transform-origin: 0 0; transform-origin: 0 0 } .pnlm-dragfix,.pnlm-preview-img { position: absolute; height: 100%; width: 100% } .pnlm-preview-img { background-size: cover; background-position: center } .pnlm-lbar { width: 150px; margin: 0 auto; border: #fff 1px solid; height: 6px } .pnlm-lbar-fill { background: #fff; height: 100%; width: 0 } .pnlm-lmsg { font-size: 12px } .pnlm-fade-img { position: absolute; top: 0; left: 0 } .pnlm-pointer { cursor: pointer } html { height: 100% } body { margin: 0; padding: 0; overflow: hidden; position: fixed; cursor: default; width: 100%; height: 100% } </style> </head> <body> <div id=container> <noscript> <div class=pnlm-info-box> <p> Javascript is required to view this panorama.<br>(It could be worse; you could need a plugin.) </p> </div> </noscript> </div> <script type="text/javascript"> window.libpannellum = function(y, c, p) { function H(L) { function H(a, f) { return 1 == a.level && 1 != f.level ? -1 : 1 == f.level && 1 != a.level ? 1 : f.timestamp - a.timestamp } function Q(a, f) { return a.level != f.level ? a.level - f.level : a.diff - f.diff } function ka(a, f, d, c, m, e) { this.vertices = a; this.side = f; this.level = d; this.x = c; this.y = m; this.path = e.replace("%s", f).replace("%l", d).replace("%x", c).replace("%y", m) } function Ha(a, f, c, p, m) { var e; var g = f.vertices; e = la(a, g.slice(0, 3)); var t = la(a, g.slice(3, 6)) , x = la(a, g.slice(6, 9)) , g = la(a, g.slice(9, 12)) , s = e[0] + t[0] + x[0] + g[0]; -4 == s || 4 == s ? e = !1 : (s = e[1] + t[1] + x[1] + g[1], e = -4 == s || 4 == s ? !1 : 4 != e[2] + t[2] + x[2] + g[2]); if (e) { e = f.vertices; t = e[0] + e[3] + e[6] + e[9]; x = e[1] + e[4] + e[7] + e[10]; g = e[2] + e[5] + e[8] + e[11]; s = Math.sqrt(t * t + x * x + g * g); g = Math.asin(g / s); t = Math.atan2(x, t) - p; t += t > Math.PI ? -2 * Math.PI : t < -Math.PI ? 2 * Math.PI : 0; t = Math.abs(t); f.diff = Math.acos(Math.sin(c) * Math.sin(g) + Math.cos(c) * Math.cos(g) * Math.cos(t)); t = !1; for (x = 0; x < d.nodeCache.length; x++) if (d.nodeCache[x].path == f.path) { t = !0; d.nodeCache[x].timestamp = d.nodeCacheTimestamp++; d.nodeCache[x].diff = f.diff; d.currentNodes.push(d.nodeCache[x]); break } t || (f.timestamp = d.nodeCacheTimestamp++, d.currentNodes.push(f), d.nodeCache.push(f)); if (f.level < d.level) { var g = n.cubeResolution * Math.pow(2, f.level - n.maxLevel) , t = Math.ceil(g * n.invTileResolution) - 1 , x = g % n.tileResolution * 2 , k = 2 * g % n.tileResolution; 0 === k && (k = n.tileResolution); 0 === x && (x = 2 * n.tileResolution); s = 0.5; if (f.x == t || f.y == t) s = 1 - n.tileResolution / (n.tileResolution + k); var l = 1 - s , g = [] , z = s , y = s , E = s , J = l , A = l , C = l; if (k < n.tileResolution) if (f.x == t && f.y != t) { if (A = y = 0.5, "d" == f.side || "u" == f.side) C = E = 0.5 } else f.x != t && f.y == t && (J = z = 0.5, "l" == f.side || "r" == f.side) && (C = E = 0.5); x <= n.tileResolution && (f.x == t && (z = 0, J = 1, "l" == f.side || "r" == f.side) && (E = 0, C = 1), f.y == t && (y = 0, A = 1, "d" == f.side || "u" == f.side) && (E = 0, C = 1)); k = [e[0], e[1], e[2], e[0] * z + e[3] * J, e[1] * s + e[4] * l, e[2] * E + e[5] * C, e[0] * z + e[6] * J, e[1] * y + e[7] * A, e[2] * E + e[8] * C, e[0] * s + e[9] * l, e[1] * y + e[10] * A, e[2] * E + e[11] * C]; k = new ka(k,f.side,f.level + 1,2 * f.x,2 * f.y,n.fullpath); g.push(k); f.x == t && x <= n.tileResolution || (k = [e[0] * z + e[3] * J, e[1] * s + e[4] * l, e[2] * E + e[5] * C, e[3], e[4], e[5], e[3] * s + e[6] * l, e[4] * y + e[7] * A, e[5] * E + e[8] * C, e[0] * z + e[6] * J, e[1] * y + e[7] * A, e[2] * E + e[8] * C], k = new ka(k,f.side,f.level + 1,2 * f.x + 1,2 * f.y,n.fullpath), g.push(k)); f.x == t && x <= n.tileResolution || f.y == t && x <= n.tileResolution || (k = [e[0] * z + e[6] * J, e[1] * y + e[7] * A, e[2] * E + e[8] * C, e[3] * s + e[6] * l, e[4] * y + e[7] * A, e[5] * E + e[8] * C, e[6], e[7], e[8], e[9] * z + e[6] * J, e[10] * s + e[7] * l, e[11] * E + e[8] * C], k = new ka(k,f.side,f.level + 1,2 * f.x + 1,2 * f.y + 1,n.fullpath), g.push(k)); f.y == t && x <= n.tileResolution || (k = [e[0] * s + e[9] * l, e[1] * y + e[10] * A, e[2] * E + e[11] * C, e[0] * z + e[6] * J, e[1] * y + e[7] * A, e[2] * E + e[8] * C, e[9] * z + e[6] * J, e[10] * s + e[7] * l, e[11] * E + e[8] * C, e[9], e[10], e[11]], k = new ka(k,f.side,f.level + 1,2 * f.x,2 * f.y + 1,n.fullpath), g.push(k)); for (f = 0; f < g.length; f++) Ha(a, g[f], c, p, m) } } } function sa() { return [-1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1] } function ta(a, f, d) { var c = Math.sin(f); f = Math.cos(f); if ("x" == d) return [a[0], f * a[1] + c * a[2], f * a[2] - c * a[1], a[3], f * a[4] + c * a[5], f * a[5] - c * a[4], a[6], f * a[7] + c * a[8], f * a[8] - c * a[7]]; if ("y" == d) return [f * a[0] - c * a[2], a[1], f * a[2] + c * a[0], f * a[3] - c * a[5], a[4], f * a[5] + c * a[3], f * a[6] - c * a[8], a[7], f * a[8] + c * a[6]]; if ("z" == d) return [f * a[0] + c * a[1], f * a[1] - c * a[0], a[2], f * a[3] + c * a[4], f * a[4] - c * a[3], a[5], f * a[6] + c * a[7], f * a[7] - c * a[6], a[8]] } function ma(a) { return [a[0], a[4], a[8], a[12], a[1], a[5], a[9], a[13], a[2], a[6], a[10], a[14], a[3], a[7], a[11], a[15]] } function Ia(a) { Ja(a, a.path + "." + n.extension, function(f, c) { a.texture = f; a.textureLoaded = c ? 2 : 1 }, ua.crossOrigin) } function la(a, f) { var c = [a[0] * f[0] + a[1] * f[1] + a[2] * f[2], a[4] * f[0] + a[5] * f[1] + a[6] * f[2], a[11] + a[8] * f[0] + a[9] * f[1] + a[10] * f[2], 1 / (a[12] * f[0] + a[13] * f[1] + a[14] * f[2])] , d = c[0] * c[3] , m = c[1] * c[3] , c = c[2] * c[3] , e = [0, 0, 0]; -1 > d && (e[0] = -1); 1 < d && (e[0] = 1); -1 > m && (e[1] = -1); 1 < m && (e[1] = 1); if (-1 > c || 1 < c) e[2] = 1; return e } function Ca() { console.log("Reducing canvas size due to error 1286!"); A.width = Math.round(A.width / 2); A.height = Math.round(A.height / 2) } var A = c.createElement("canvas"); A.style.width = A.style.height = "100%"; L.appendChild(A); var d, a, V, W, aa, S, va, ha, n, z, F, da, Da, Z, na, ua; this.init = function(M, f, y, I, m, e, g, t) { function x(a) { if (Q) { var f = a * a * 4 , e = new Uint8ClampedArray(f) , c = t.backgroundColor ? t.backgroundColor : [0, 0, 0]; c[0] *= 255; c[1] *= 255; c[2] *= 255; for (var b = 0; b < f; b++) e[b++] = c[0], e[b++] = c[1], e[b++] = c[2]; a = new ImageData(e,a,a); for (s = 0; 6 > s; s++) 0 == n[s].width && (n[s] = a) } } f === p && (f = "equirectangular"); if ("equirectangular" != f && "cubemap" != f && "multires" != f) throw console.log("Error: invalid image type specified!"), { type: "config error" }; z = f; n = M; F = y; ua = t || {}; if (d) { V && (a.detachShader(d, V), a.deleteShader(V)); W && (a.detachShader(d, W), a.deleteShader(W)); a.bindBuffer(a.ARRAY_BUFFER, null); a.bindBuffer(a.ELEMENT_ARRAY_BUFFER, null); d.texture && a.deleteTexture(d.texture); if (d.nodeCache) for (M = 0; M < d.nodeCache.length; M++) a.deleteTexture(d.nodeCache[M].texture); a.deleteProgram(d); d = p } ha = p; var s, Q = !1, B; if ("cubemap" == z) for (s = 0; 6 > s; s++) 0 < n[s].width ? (B === p && (B = n[s].width), B != n[s].width && console.log("Cube faces have inconsistent widths: " + B + " vs. " + n[s].width)) : Q = !0; "cubemap" == z && 0 !== (B & B - 1) && (navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 8_/) || navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 9_/) || navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 10_/) || navigator.userAgent.match(/Trident.*rv[ :]*11\./)) || (a || (a = A.getContext("experimental-webgl", { alpha: !1, depth: !1 })), a && 1286 == a.getError() && Ca()); if (!a && ("multires" == z && n.hasOwnProperty("fallbackPath") || "cubemap" == z) && ("WebkitAppearance"in c.documentElement.style || navigator.userAgent.match(/Trident.*rv[ :]*11\./) || -1 !== navigator.appVersion.indexOf("MSIE 10"))) { S && L.removeChild(S); S = c.createElement("div"); S.className = "pnlm-world"; I = n.basePath ? n.basePath + n.fallbackPath : n.fallbackPath; var H = "frblud".split("") , T = 0; m = function() { var a = c.createElement("canvas"); a.className = "pnlm-face pnlm-" + H[this.side] + "face"; S.appendChild(a); var f = a.getContext("2d"); a.style.width = this.width + 4 + "px"; a.style.height = this.height + 4 + "px"; a.width = this.width + 4; a.height = this.height + 4; f.drawImage(this, 2, 2); var e = f.getImageData(0, 0, a.width, a.height), g = e.data, b, d; for (b = 2; b < a.width - 2; b++) for (d = 0; 4 > d; d++) g[4 * (b + a.width) + d] = g[4 * (b + 2 * a.width) + d], g[4 * (b + a.width * (a.height - 2)) + d] = g[4 * (b + a.width * (a.height - 3)) + d]; for (b = 2; b < a.height - 2; b++) for (d = 0; 4 > d; d++) g[4 * (b * a.width + 1) + d] = g[4 * (b * a.width + 2) + d], g[4 * ((b + 1) * a.width - 2) + d] = g[4 * ((b + 1) * a.width - 3) + d]; for (d = 0; 4 > d; d++) g[4 * (a.width + 1) + d] = g[4 * (2 * a.width + 2) + d], g[4 * (2 * a.width - 2) + d] = g[4 * (3 * a.width - 3) + d], g[4 * (a.width * (a.height - 2) + 1) + d] = g[4 * (a.width * (a.height - 3) + 2) + d], g[4 * (a.width * (a.height - 1) - 2) + d] = g[4 * (a.width * (a.height - 2) - 3) + d]; for (b = 1; b < a.width - 1; b++) for (d = 0; 4 > d; d++) g[4 * b + d] = g[4 * (b + a.width) + d], g[4 * (b + a.width * (a.height - 1)) + d] = g[4 * (b + a.width * (a.height - 2)) + d]; for (b = 1; b < a.height - 1; b++) for (d = 0; 4 > d; d++) g[b * a.width * 4 + d] = g[4 * (b * a.width + 1) + d], g[4 * ((b + 1) * a.width - 1) + d] = g[4 * ((b + 1) * a.width - 2) + d]; for (d = 0; 4 > d; d++) g[d] = g[4 * (a.width + 1) + d], g[4 * (a.width - 1) + d] = g[4 * (2 * a.width - 2) + d], g[a.width * (a.height - 1) * 4 + d] = g[4 * (a.width * (a.height - 2) + 1) + d], g[4 * (a.width * a.height - 1) + d] = g[4 * (a.width * (a.height - 1) - 2) + d]; f.putImageData(e, 0, 0); E.call(this) } ; var E = function() { 0 < this.width ? (aa === p && (aa = this.width), aa != this.width && console.log("Fallback faces have inconsistent widths: " + aa + " vs. " + this.width)) : Q = !0; T++; 6 == T && (aa = this.width, L.appendChild(S), g()) } , Q = !1; for (s = 0; 6 > s; s++) e = new Image, e.crossOrigin = ua.crossOrigin ? ua.crossOrigin : "anonymous", e.side = s, e.onload = m, e.onerror = E, e.src = "multires" == z ? I.replace("%s", H[s]) + "." + n.extension : n[s].src; x(aa) } else { if (!a) throw console.log("Error: no WebGL support detected!"), { type: "no webgl" }; "cubemap" == z && x(B); n.fullpath = n.basePath ? n.basePath + n.path : n.path; n.invTileResolution = 1 / n.tileResolution; M = sa(); va = []; for (s = 0; 6 > s; s++) va[s] = M.slice(12 * s, 12 * s + 12), M = sa(); M = 0; if ("equirectangular" == z) { if (M = a.getParameter(a.MAX_TEXTURE_SIZE), Math.max(n.width / 2, n.height) > M) throw console.log("Error: The image is too big; it's " + n.width + "px wide, but this device's maximum supported size is " + 2 * M + "px."), { type: "webgl size error", width: n.width, maxWidth: 2 * M }; } else if ("cubemap" == z && B > a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE)) throw console.log("Error: The image is too big; it's " + B + "px wide, but this device's maximum supported size is " + M + "px."), { type: "webgl size error", width: B, maxWidth: M }; t === p || t.horizonPitch === p && t.horizonRoll === p || (ha = [t.horizonPitch == p ? 0 : t.horizonPitch, t.horizonRoll == p ? 0 : t.horizonRoll]); B = a.TEXTURE_2D; a.viewport(0, 0, a.drawingBufferWidth, a.drawingBufferHeight); a.getShaderPrecisionFormat && (f = a.getShaderPrecisionFormat(a.FRAGMENT_SHADER, a.HIGH_FLOAT)) && 1 > f.precision && (oa = oa.replace("highp", "mediump")); V = a.createShader(a.VERTEX_SHADER); f = l; "multires" == z && (f = k); a.shaderSource(V, f); a.compileShader(V); W = a.createShader(a.FRAGMENT_SHADER); f = pa; "cubemap" == z ? (B = a.TEXTURE_CUBE_MAP, f = bb) : "multires" == z && (f = Ra); a.shaderSource(W, f); a.compileShader(W); d = a.createProgram(); a.attachShader(d, V); a.attachShader(d, W); a.linkProgram(d); a.getShaderParameter(V, a.COMPILE_STATUS) || console.log(a.getShaderInfoLog(V)); a.getShaderParameter(W, a.COMPILE_STATUS) || console.log(a.getShaderInfoLog(W)); a.getProgramParameter(d, a.LINK_STATUS) || console.log(a.getProgramInfoLog(d)); a.useProgram(d); d.drawInProgress = !1; f = t.backgroundColor ? t.backgroundColor : [0, 0, 0]; a.clearColor(f[0], f[1], f[2], 1); a.clear(a.COLOR_BUFFER_BIT); d.texCoordLocation = a.getAttribLocation(d, "a_texCoord"); a.enableVertexAttribArray(d.texCoordLocation); "multires" != z ? (da || (da = a.createBuffer()), a.bindBuffer(a.ARRAY_BUFFER, da), a.bufferData(a.ARRAY_BUFFER, new Float32Array([-1, 1, 1, 1, 1, -1, -1, 1, 1, -1, -1, -1]), a.STATIC_DRAW), a.vertexAttribPointer(d.texCoordLocation, 2, a.FLOAT, !1, 0, 0), d.aspectRatio = a.getUniformLocation(d, "u_aspectRatio"), a.uniform1f(d.aspectRatio, a.drawingBufferWidth / a.drawingBufferHeight), d.psi = a.getUniformLocation(d, "u_psi"), d.theta = a.getUniformLocation(d, "u_theta"), d.f = a.getUniformLocation(d, "u_f"), d.h = a.getUniformLocation(d, "u_h"), d.v = a.getUniformLocation(d, "u_v"), d.vo = a.getUniformLocation(d, "u_vo"), d.rot = a.getUniformLocation(d, "u_rot"), a.uniform1f(d.h, I / (2 * Math.PI)), a.uniform1f(d.v, m / Math.PI), a.uniform1f(d.vo, e / Math.PI * 2), "equirectangular" == z && (d.backgroundColor = a.getUniformLocation(d, "u_backgroundColor"), a.uniform4fv(d.backgroundColor, f.concat([1]))), d.texture = a.createTexture(), a.bindTexture(B, d.texture), "cubemap" == z ? (a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n[1]), a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n[3]), a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n[4]), a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n[5]), a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n[0]), a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n[2])) : n.width <= M ? (a.uniform1i(a.getUniformLocation(d, "u_splitImage"), 0), a.texImage2D(B, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n)) : (a.uniform1i(a.getUniformLocation(d, "u_splitImage"), 1), I = c.createElement("canvas"), I.width = n.width / 2, I.height = n.height, I = I.getContext("2d"), I.drawImage(n, 0, 0), m = I.getImageData(0, 0, n.width / 2, n.height), a.texImage2D(B, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, m), d.texture2 = a.createTexture(), a.activeTexture(a.TEXTURE1), a.bindTexture(B, d.texture2), a.uniform1i(a.getUniformLocation(d, "u_image1"), 1), I.drawImage(n, -n.width / 2, 0), m = I.getImageData(0, 0, n.width / 2, n.height), a.texImage2D(B, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, m), a.texParameteri(B, a.TEXTURE_WRAP_S, a.CLAMP_TO_EDGE), a.texParameteri(B, a.TEXTURE_WRAP_T, a.CLAMP_TO_EDGE), a.texParameteri(B, a.TEXTURE_MIN_FILTER, a.LINEAR), a.texParameteri(B, a.TEXTURE_MAG_FILTER, a.LINEAR), a.activeTexture(a.TEXTURE0)), a.texParameteri(B, a.TEXTURE_WRAP_S, a.CLAMP_TO_EDGE), a.texParameteri(B, a.TEXTURE_WRAP_T, a.CLAMP_TO_EDGE), a.texParameteri(B, a.TEXTURE_MIN_FILTER, a.LINEAR), a.texParameteri(B, a.TEXTURE_MAG_FILTER, a.LINEAR)) : (d.vertPosLocation = a.getAttribLocation(d, "a_vertCoord"), a.enableVertexAttribArray(d.vertPosLocation), Da || (Da = a.createBuffer()), Z || (Z = a.createBuffer()), na || (na = a.createBuffer()), a.bindBuffer(a.ARRAY_BUFFER, Z), a.bufferData(a.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]), a.STATIC_DRAW), a.bindBuffer(a.ELEMENT_ARRAY_BUFFER, na), a.bufferData(a.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), a.STATIC_DRAW), d.perspUniform = a.getUniformLocation(d, "u_perspMatrix"), d.cubeUniform = a.getUniformLocation(d, "u_cubeMatrix"), d.level = -1, d.currentNodes = [], d.nodeCache = [], d.nodeCacheTimestamp = 0); I = a.getError(); if (0 !== I) throw console.log("Error: Something went wrong with WebGL!", I), { type: "webgl error" }; g() } } ; this.destroy = function() { L !== p && (A !== p && L.contains(A) && L.removeChild(A), S !== p && L.contains(S) && L.removeChild(S)); if (a) { var d = a.getExtension("WEBGL_lose_context"); d && d.loseContext() } } ; this.resize = function() { var c = y.devicePixelRatio || 1; A.width = A.clientWidth * c; A.height = A.clientHeight * c; a && (1286 == a.getError() && Ca(), a.viewport(0, 0, a.drawingBufferWidth, a.drawingBufferHeight), "multires" != z && a.uniform1f(d.aspectRatio, A.clientWidth / A.clientHeight)) } ; this.resize(); this.setPose = function(a, d) { ha = [a, d] } ; this.render = function(c, f, k, l) { var m, e = 0; l === p && (l = {}); l.roll && (e = l.roll); if (ha !== p) { m = ha[0]; var g = ha[1] , t = c , x = f , s = Math.cos(g) * Math.sin(c) * Math.sin(m) + Math.cos(c) * (Math.cos(m) * Math.cos(f) + Math.sin(g) * Math.sin(m) * Math.sin(f)) , y = -Math.sin(c) * Math.sin(g) + Math.cos(c) * Math.cos(g) * Math.sin(f); c = Math.cos(g) * Math.cos(m) * Math.sin(c) + Math.cos(c) * (-Math.cos(f) * Math.sin(m) + Math.cos(m) * Math.sin(g) * Math.sin(f)); c = Math.asin(Math.max(Math.min(c, 1), -1)); f = Math.atan2(y, s); m = [Math.cos(t) * (Math.sin(g) * Math.sin(m) * Math.cos(x) - Math.cos(m) * Math.sin(x)), Math.cos(t) * Math.cos(g) * Math.cos(x), Math.cos(t) * (Math.cos(m) * Math.sin(g) * Math.cos(x) + Math.sin(x) * Math.sin(m))]; g = [-Math.cos(c) * Math.sin(f), Math.cos(c) * Math.cos(f)]; g = Math.acos(Math.max(Math.min((m[0] * g[0] + m[1] * g[1]) / (Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]) * Math.sqrt(g[0] * g[0] + g[1] * g[1])), 1), -1)); 0 > m[2] && (g = 2 * Math.PI - g); e += g } if (a || "multires" != z && "cubemap" != z) { if ("multires" != z) k = 2 * Math.atan(Math.tan(0.5 * k) / (a.drawingBufferWidth / a.drawingBufferHeight)), k = 1 / Math.tan(0.5 * k), a.uniform1f(d.psi, f), a.uniform1f(d.theta, c), a.uniform1f(d.rot, e), a.uniform1f(d.f, k), !0 === F && "equirectangular" == z && (a.bindTexture(a.TEXTURE_2D, d.texture), a.texImage2D(a.TEXTURE_2D, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, n)), a.drawArrays(a.TRIANGLES, 0, 6); else { m = a.drawingBufferWidth / a.drawingBufferHeight; g = 2 * Math.atan(Math.tan(k / 2) * a.drawingBufferHeight / a.drawingBufferWidth); g = 1 / Math.tan(g / 2); m = [g / m, 0, 0, 0, 0, g, 0, 0, 0, 0, 100.1 / -99.9, 20 / -99.9, 0, 0, -1, 0]; for (g = 1; g < n.maxLevel && a.drawingBufferWidth > n.tileResolution * Math.pow(2, g - 1) * Math.tan(k / 2) * 0.707; ) g++; d.level = g; g = [1, 0, 0, 0, 1, 0, 0, 0, 1]; g = ta(g, -e, "z"); g = ta(g, -c, "x"); g = ta(g, f, "y"); g = [g[0], g[1], g[2], 0, g[3], g[4], g[5], 0, g[6], g[7], g[8], 0, 0, 0, 0, 1]; a.uniformMatrix4fv(d.perspUniform, !1, new Float32Array(ma(m))); a.uniformMatrix4fv(d.cubeUniform, !1, new Float32Array(ma(g))); e = [m[0] * g[0], m[0] * g[1], m[0] * g[2], 0, m[5] * g[4], m[5] * g[5], m[5] * g[6], 0, m[10] * g[8], m[10] * g[9], m[10] * g[10], m[11], -g[8], -g[9], -g[10], 0]; d.nodeCache.sort(H); if (200 < d.nodeCache.length && d.nodeCache.length > d.currentNodes.length + 50) for (m = d.nodeCache.splice(200, d.nodeCache.length - 200), g = 0; g < m.length; g++) a.deleteTexture(m[g].texture); d.currentNodes = []; g = "fbudlr".split(""); for (m = 0; 6 > m; m++) t = new ka(va[m],g[m],1,0,0,n.fullpath), Ha(e, t, c, f, k); d.currentNodes.sort(Q); for (c = T.length - 1; 0 <= c; c--) -1 === d.currentNodes.indexOf(T[c].node) && (T[c].node.textureLoad = !1, T.splice(c, 1)); if (0 === T.length) for (c = 0; c < d.currentNodes.length; c++) if (f = d.currentNodes[c], !f.texture && !f.textureLoad) { f.textureLoad = !0; setTimeout(Ia, 0, f); break } if (!d.drawInProgress) { d.drawInProgress = !0; a.clear(a.COLOR_BUFFER_BIT); for (c = 0; c < d.currentNodes.length; c++) 1 < d.currentNodes[c].textureLoaded && (a.bindBuffer(a.ARRAY_BUFFER, Da), a.bufferData(a.ARRAY_BUFFER, new Float32Array(d.currentNodes[c].vertices), a.STATIC_DRAW), a.vertexAttribPointer(d.vertPosLocation, 3, a.FLOAT, !1, 0, 0), a.bindBuffer(a.ARRAY_BUFFER, Z), a.vertexAttribPointer(d.texCoordLocation, 2, a.FLOAT, !1, 0, 0), a.bindTexture(a.TEXTURE_2D, d.currentNodes[c].texture), a.drawElements(a.TRIANGLES, 6, a.UNSIGNED_SHORT, 0)); d.drawInProgress = !1 } } if (l.returnImage !== p) return A.toDataURL("image/png") } else for (m = aa / 2, l = { f: "translate3d(-" + (m + 2) + "px, -" + (m + 2) + "px, -" + m + "px)", b: "translate3d(" + (m + 2) + "px, -" + (m + 2) + "px, " + m + "px) rotateX(180deg) rotateZ(180deg)", u: "translate3d(-" + (m + 2) + "px, -" + m + "px, " + (m + 2) + "px) rotateX(270deg)", d: "translate3d(-" + (m + 2) + "px, " + m + "px, -" + (m + 2) + "px) rotateX(90deg)", l: "translate3d(-" + m + "px, -" + (m + 2) + "px, " + (m + 2) + "px) rotateX(180deg) rotateY(90deg) rotateZ(180deg)", r: "translate3d(" + m + "px, -" + (m + 2) + "px, -" + (m + 2) + "px) rotateY(270deg)" }, k = 1 / Math.tan(k / 2), k = k * A.clientWidth / 2 + "px", f = "perspective(" + k + ") translateZ(" + k + ") rotateX(" + c + "rad) rotateY(" + f + "rad) ", k = Object.keys(l), c = 0; 6 > c; c++) if (e = S.querySelector(".pnlm-" + k[c] + "face")) e.style.webkitTransform = f + l[k[c]], e.style.transform = f + l[k[c]] } ; this.isLoading = function() { if (a && "multires" == z) for (var c = 0; c < d.currentNodes.length; c++) if (!d.currentNodes[c].textureLoaded) return !0; return !1 } ; this.getCanvas = function() { return A } ; var T = [] , Ja = function() { function c() { var d = this; this.texture = this.callback = null; this.image = new Image; this.image.crossOrigin = m ? m : "anonymous"; var f = function() { if (0 < d.image.width && 0 < d.image.height) { var c = d.image; a.bindTexture(a.TEXTURE_2D, d.texture); a.texImage2D(a.TEXTURE_2D, 0, a.RGB, a.RGB, a.UNSIGNED_BYTE, c); a.texParameteri(a.TEXTURE_2D, a.TEXTURE_MAG_FILTER, a.LINEAR); a.texParameteri(a.TEXTURE_2D, a.TEXTURE_MIN_FILTER, a.LINEAR); a.texParameteri(a.TEXTURE_2D, a.TEXTURE_WRAP_S, a.CLAMP_TO_EDGE); a.texParameteri(a.TEXTURE_2D, a.TEXTURE_WRAP_T, a.CLAMP_TO_EDGE); a.bindTexture(a.TEXTURE_2D, null); d.callback(d.texture, !0) } else d.callback(d.texture, !1); T.length ? (c = T.shift(), d.loadTexture(c.src, c.texture, c.callback)) : p[k++] = d }; this.image.addEventListener("load", f); this.image.addEventListener("error", f) } function d(a, c, f, e) { this.node = a; this.src = c; this.texture = f; this.callback = e } var k = 4, p = {}, m; c.prototype.loadTexture = function(a, c, d) { this.texture = c; this.callback = d; this.image.src = a } ; for (var e = 0; e < k; e++) p[e] = new c; return function(c, e, n, l) { m = l; l = a.createTexture(); k ? p[--k].loadTexture(e, l, n) : T.push(new d(c,e,l,n)); return l } }() } var l = "attribute vec2 a_texCoord;varying vec2 v_texCoord;void main() {gl_Position = vec4(a_texCoord, 0.0, 1.0);v_texCoord = a_texCoord;}" , k = "attribute vec3 a_vertCoord;attribute vec2 a_texCoord;uniform mat4 u_cubeMatrix;uniform mat4 u_perspMatrix;varying mediump vec2 v_texCoord;void main(void) {gl_Position = u_perspMatrix * u_cubeMatrix * vec4(a_vertCoord, 1.0);v_texCoord = a_texCoord;}" , oa = "precision highp float;\nuniform float u_aspectRatio;\nuniform float u_psi;\nuniform float u_theta;\nuniform float u_f;\nuniform float u_h;\nuniform float u_v;\nuniform float u_vo;\nuniform float u_rot;\nconst float PI = 3.14159265358979323846264;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nuniform bool u_splitImage;\nuniform samplerCube u_imageCube;\nvarying vec2 v_texCoord;\nuniform vec4 u_backgroundColor;\nvoid main() {\nfloat x = v_texCoord.x * u_aspectRatio;\nfloat y = v_texCoord.y;\nfloat sinrot = sin(u_rot);\nfloat cosrot = cos(u_rot);\nfloat rot_x = x * cosrot - y * sinrot;\nfloat rot_y = x * sinrot + y * cosrot;\nfloat sintheta = sin(u_theta);\nfloat costheta = cos(u_theta);\nfloat a = u_f * costheta - rot_y * sintheta;\nfloat root = sqrt(rot_x * rot_x + a * a);\nfloat lambda = atan(rot_x / root, a / root) + u_psi;\nfloat phi = atan((rot_y * costheta + u_f * sintheta) / root);" , bb = oa + "float cosphi = cos(phi);\ngl_FragColor = textureCube(u_imageCube, vec3(cosphi*sin(lambda), sin(phi), cosphi*cos(lambda)));\n}" , pa = oa + "lambda = mod(lambda + PI, PI * 2.0) - PI;\nvec2 coord = vec2(lambda / PI, phi / (PI / 2.0));\nif(coord.x < -u_h || coord.x > u_h || coord.y < -u_v + u_vo || coord.y > u_v + u_vo)\ngl_FragColor = u_backgroundColor;\nelse {\nif(u_splitImage) {\nif(coord.x < 0.0)\ngl_FragColor = texture2D(u_image0, vec2((coord.x + u_h) / u_h, (-coord.y + u_v + u_vo) / (u_v * 2.0)));\nelse\ngl_FragColor = texture2D(u_image1, vec2((coord.x + u_h) / u_h - 1.0, (-coord.y + u_v + u_vo) / (u_v * 2.0)));\n} else {\ngl_FragColor = texture2D(u_image0, vec2((coord.x + u_h) / (u_h * 2.0), (-coord.y + u_v + u_vo) / (u_v * 2.0)));\n}\n}\n}" , Ra = "varying mediump vec2 v_texCoord;uniform sampler2D u_sampler;void main(void) {gl_FragColor = texture2D(u_sampler, v_texCoord);}"; return { renderer: function(c, k, p, l) { return new H(c,k,p,l) } } }(window, document); window.pannellum = function(y, c, p) { function H(l, k) { function oa() { var a = c.createElement("div"); a.innerHTML = "\x3c!--[if lte IE 9]><i></i><![endif]--\x3e"; if (1 == a.getElementsByTagName("i").length) L(); else { qa = b.hfov; Ea = b.pitch; var h; if ("cubemap" == b.type) { R = []; for (a = 0; 6 > a; a++) R.push(new Image), R[a].crossOrigin = b.crossOrigin; q.load.lbox.style.display = "block"; q.load.lbar.style.display = "none" } else if ("multires" == b.type) a = JSON.parse(JSON.stringify(b.multiRes)), b.basePath && b.multiRes.basePath && !/^(?:[a-z]+:)?\/\//i.test(b.multiRes.basePath) ? a.basePath = b.basePath + b.multiRes.basePath : b.multiRes.basePath ? a.basePath = b.multiRes.basePath : b.basePath && (a.basePath = b.basePath), R = a; else if (!0 === b.dynamic) R = b.panorama; else { if (b.panorama === p) { L(b.strings.noPanoramaError); return } R = new Image } if ("cubemap" == b.type) for (var v = 6, d = function() { v--; 0 === v && pa() }, f = function(a) { var fa = c.createElement("a"); fa.href = a.target.src; fa.textContent = fa.href; L(b.strings.fileAccessError.replace("%s", fa.outerHTML)) }, a = 0; a < R.length; a++) h = b.cubeMap[a], "null" == h ? (console.log("Will use background instead of missing cubemap face " + a), d()) : (b.basePath && !H(h) && (h = b.basePath + h), R[a].onload = d, R[a].onerror = f, R[a].src = J(h)); else if ("multires" == b.type) pa(); else if (h = "", b.basePath && (h = b.basePath), !0 !== b.dynamic) { h = H(b.panorama) ? b.panorama : h + b.panorama; R.onload = function() { y.URL.revokeObjectURL(this.src); pa() } ; var e = new XMLHttpRequest; e.onloadend = function() { if (200 != e.status) { var a = c.createElement("a"); a.href = h; a.textContent = a.href; L(b.strings.fileAccessError.replace("%s", a.outerHTML)) } Ra(this.response); q.load.msg.innerHTML = "" } ; e.onprogress = function(a) { if (a.lengthComputable) { q.load.lbarFill.style.width = a.loaded / a.total * 100 + "%"; var b, fa; 1E6 < a.total ? (b = "MB", fa = (a.loaded / 1E6).toFixed(2), a = (a.total / 1E6).toFixed(2)) : 1E3 < a.total ? (b = "kB", fa = (a.loaded / 1E3).toFixed(1), a = (a.total / 1E3).toFixed(1)) : (b = "B", fa = a.loaded, a = a.total); q.load.msg.innerHTML = fa + " / " + a + " " + b } else q.load.lbox.style.display = "block", q.load.lbar.style.display = "none" } ; try { e.open("GET", h, !0) } catch (g) { L(b.strings.malformedURLError) } e.responseType = "blob"; e.setRequestHeader("Accept", "image/*,*/*;q=0.9"); e.withCredentials = "use-credentials" === b.crossOrigin; e.send() } b.draggable && K.classList.add("pnlm-grab"); K.classList.remove("pnlm-grabbing"); Ka = !0 === b.dynamicUpdate; b.dynamic && Ka && (R = b.panorama, pa()) } } function H(a) { return /^(?:[a-z]+:)?\/\//i.test(a) || "/" == a[0] || "blob:" == a.slice(0, 5) } function pa() { D || (D = new libpannellum.renderer(N)); Sa || (Sa = !0, X.addEventListener("mousedown", ka, !1), c.addEventListener("mousemove", ta, !1), c.addEventListener("mouseup", ma, !1), b.mouseZoom && (K.addEventListener("mousewheel", V, !1), K.addEventListener("DOMMouseScroll", V, !1)), b.doubleClickZoom && X.addEventListener("dblclick", Ha, !1), l.addEventListener("mozfullscreenchange", g, !1), l.addEventListener("webkitfullscreenchange", g, !1), l.addEventListener("msfullscreenchange", g, !1), l.addEventListener("fullscreenchange", g, !1), y.addEventListener("resize", z, !1), y.addEventListener("orientationchange", z, !1), b.disableKeyboardCtrl || (l.addEventListener("keydown", W, !1), l.addEventListener("keyup", S, !1), l.addEventListener("blur", aa, !1)), c.addEventListener("mouseleave", ma, !1), "" === c.documentElement.style.pointerAction && "" === c.documentElement.style.touchAction ? (X.addEventListener("pointerdown", A, !1), X.addEventListener("pointermove", d, !1), X.addEventListener("pointerup", a, !1), X.addEventListener("pointerleave", a, !1)) : (X.addEventListener("touchstart", Ia, !1), X.addEventListener("touchmove", la, !1), X.addEventListener("touchend", Ca, !1)), y.navigator.pointerEnabled && (l.style.touchAction = "none")); ua(); x(b.hfov); setTimeout(function() {}, 500) } function Ra(a) { var h = new FileReader; h.addEventListener("loadend", function() { var v = h.result; if (navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad).* os 8_/)) { var c = v.indexOf("\u00ff\u00c2"); (0 > c || 65536 < c) && L(b.strings.iOS8WebGLError) } c = v.indexOf("<x:xmpmeta"); if (-1 < c && !0 !== b.ignoreGPanoXMP) { var d = v.substring(c, v.indexOf("</x:xmpmeta>") + 12) , e = function(a) { var b; 0 <= d.indexOf(a + '="') ? (b = d.substring(d.indexOf(a + '="') + a.length + 2), b = b.substring(0, b.indexOf('"'))) : 0 <= d.indexOf(a + ">") && (b = d.substring(d.indexOf(a + ">") + a.length + 1), b = b.substring(0, b.indexOf("<"))); return b !== p ? Number(b) : null } , v = e("GPano:FullPanoWidthPixels") , c = e("GPano:CroppedAreaImageWidthPixels") , f = e("GPano:FullPanoHeightPixels") , g = e("GPano:CroppedAreaImageHeightPixels") , k = e("GPano:CroppedAreaTopPixels") , m = e("GPano:PoseHeadingDegrees") , l = e("GPano:PosePitchDegrees") , e = e("GPano:PoseRollDegrees"); null !== v && null !== c && null !== f && null !== g && null !== k && (0 > ba.indexOf("haov") && (b.haov = c / v * 360), 0 > ba.indexOf("vaov") && (b.vaov = g / f * 180), 0 > ba.indexOf("vOffset") && (b.vOffset = -180 * ((k + g / 2) / f - 0.5)), null !== m && 0 > ba.indexOf("northOffset") && (b.northOffset = m, !1 !== b.compass && (b.compass = !0)), null !== l && null !== e && (0 > ba.indexOf("horizonPitch") && (b.horizonPitch = l), 0 > ba.indexOf("horizonRoll") && (b.horizonRoll = e))) } R.src = y.URL.createObjectURL(a) }); h.readAsBinaryString !== p ? h.readAsBinaryString(a) : h.readAsText(a) } function L(a) { a === p && (a = b.strings.genericWebGLError); q.errorMsg.innerHTML = "<p>" + a + "</p>"; u.load.style.display = "none"; q.load.box.style.display = "none"; q.errorMsg.style.display = "table"; La = !0; G = p; N.style.display = "none"; C("error", a) } function Aa(a) { var b = Q(a); ga.style.left = b.x + "px"; ga.style.top = b.y + "px"; clearTimeout(Aa.t1); clearTimeout(Aa.t2); ga.style.display = "block"; ga.style.opacity = 1; Aa.t1 = setTimeout(function() { ga.style.opacity = 0 }, 2E3); Aa.t2 = setTimeout(function() { ga.style.display = "none" }, 2500); a.preventDefault() } function Q(a) { var b = l.getBoundingClientRect() , v = {}; v.x = (a.clientX || a.pageX) - b.left; v.y = (a.clientY || a.pageY) - b.top; return v } function ka(a) { a.preventDefault(); l.focus(); if (G && b.draggable) { var h = Q(a); if (b.hotSpotDebug) { var v = sa(a); console.log("Pitch: " + v[0] + ", Yaw: " + v[1] + ", Center Pitch: " + b.pitch + ", Center Yaw: " + b.yaw + ", HFOV: " + b.hfov) } s(); Ba(); b.roll = 0; w.hfov = 0; ia = !0; O = Date.now(); wa = h.x; xa = h.y; Ma = b.yaw; Na = b.pitch; K.classList.add("pnlm-grabbing"); K.classList.remove("pnlm-grab"); C("mousedown", a); F() } } function Ha(a) { b.minHfov === b.hfov ? ea.setHfov(qa, 1E3) : (a = sa(a), ea.lookAt(a[0], a[1], b.minHfov, 1E3)) } function sa(a) { var h = Q(a); a = D.getCanvas(); var v = a.clientWidth , c = a.clientHeight; a = h.x / v * 2 - 1; var c = (1 - h.y / c * 2) * c / v , d = 1 / Math.tan(b.hfov * Math.PI / 360) , e = Math.sin(b.pitch * Math.PI / 180) , f = Math.cos(b.pitch * Math.PI / 180) , h = d * f - c * e , v = Math.sqrt(a * a + h * h) , c = 180 * Math.atan((c * f + d * e) / v) / Math.PI; a = 180 * Math.atan2(a / v, h / v) / Math.PI + b.yaw; -180 > a && (a += 360); 180 < a && (a -= 360); return [c, a] } function ta(a) { if (ia && G) { O = Date.now(); var h = D.getCanvas() , v = h.clientWidth , h = h.clientHeight; a = Q(a); var c = 180 * (Math.atan(wa / v * 2 - 1) - Math.atan(a.x / v * 2 - 1)) / Math.PI * b.hfov / 90 + Ma; w.yaw = (c - b.yaw) % 360 * 0.2; b.yaw = c; v = 360 * Math.atan(Math.tan(b.hfov / 360 * Math.PI) * h / v) / Math.PI; v = 180 * (Math.atan(a.y / h * 2 - 1) - Math.atan(xa / h * 2 - 1)) / Math.PI * v / 90 + Na; w.pitch = 0.2 * (v - b.pitch); b.pitch = v } } function ma(a) { ia && (ia = !1, 15 < Date.now() - O && (w.pitch = w.yaw = 0), K.classList.add("pnlm-grab"), K.classList.remove("pnlm-grabbing"), O = Date.now(), C("mouseup", a)) } function Ia(a) { if (G && b.draggable) { s(); Ba(); b.roll = 0; w.hfov = 0; var h = Q(a.targetTouches[0]); wa = h.x; xa = h.y; if (2 == a.targetTouches.length) { var v = Q(a.targetTouches[1]); wa += 0.5 * (v.x - h.x); xa += 0.5 * (v.y - h.y); Fa = Math.sqrt((h.x - v.x) * (h.x - v.x) + (h.y - v.y) * (h.y - v.y)) } ia = !0; O = Date.now(); Ma = b.yaw; Na = b.pitch; C("touchstart", a); F() } } function la(a) { if (b.draggable && (a.preventDefault(), G && (O = Date.now()), ia && G)) { var h = Q(a.targetTouches[0]) , v = h.x , c = h.y; 2 == a.targetTouches.length && -1 != Fa && (a = Q(a.targetTouches[1]), v += 0.5 * (a.x - h.x), c += 0.5 * (a.y - h.y), h = Math.sqrt((h.x - a.x) * (h.x - a.x) + (h.y - a.y) * (h.y - a.y)), x(b.hfov + 0.1 * (Fa - h)), Fa = h); h = b.hfov / 360 * b.touchPanSpeedCoeffFactor; v = (wa - v) * h + Ma; w.yaw = (v - b.yaw) % 360 * 0.2; b.yaw = v; c = (c - xa) * h + Na; w.pitch = 0.2 * (c - b.pitch); b.pitch = c } } function Ca() { ia = !1; 150 < Date.now() - O && (w.pitch = w.yaw = 0); Fa = -1; O = Date.now(); C("touchend", event) } function A(a) { "touch" == a.pointerType && G && b.draggable && (ja.push(a.pointerId), ya.push({ clientX: a.clientX, clientY: a.clientY }), a.targetTouches = ya, Ia(a), a.preventDefault()) } function d(a) { if ("touch" == a.pointerType && b.draggable) for (var h = 0; h < ja.length; h++) if (a.pointerId == ja[h]) { ya[h].clientX = a.clientX; ya[h].clientY = a.clientY; a.targetTouches = ya; la(a); a.preventDefault(); break } } function a(a) { if ("touch" == a.pointerType) { for (var b = !1, c = 0; c < ja.length; c++) a.pointerId == ja[c] && (ja[c] = p), ja[c] && (b = !0); b || (ja = [], ya = [], Ca()); a.preventDefault() } } function V(a) { G && ("fullscreenonly" != b.mouseZoom || za) && (a.preventDefault(), s(), O = Date.now(), a.wheelDeltaY ? (x(b.hfov - 0.05 * a.wheelDeltaY), w.hfov = 0 > a.wheelDelta ? 1 : -1) : a.wheelDelta ? (x(b.hfov - 0.05 * a.wheelDelta), w.hfov = 0 > a.wheelDelta ? 1 : -1) : a.detail && (x(b.hfov + 1.5 * a.detail), w.hfov = 0 < a.detail ? 1 : -1), F()) } function W(a) { s(); O = Date.now(); Ba(); b.roll = 0; var h = a.which || a.keycode; 0 > b.capturedKeyNumbers.indexOf(h) || (a.preventDefault(), 27 == h ? za && e() : va(h, !0)) } function aa() { for (var a = 0; 10 > a; a++) r[a] = !1 } function S(a) { var h = a.which || a.keycode; 0 > b.capturedKeyNumbers.indexOf(h) || (a.preventDefault(), va(h, !1)) } function va(a, b) { var c = !1; switch (a) { case 109: case 189: case 17: case 173: r[0] != b && (c = !0); r[0] = b; break; case 107: case 187: case 16: case 61: r[1] != b && (c = !0); r[1] = b; break; case 38: r[2] != b && (c = !0); r[2] = b; break; case 87: r[6] != b && (c = !0); r[6] = b; break; case 40: r[3] != b && (c = !0); r[3] = b; break; case 83: r[7] != b && (c = !0); r[7] = b; break; case 37: r[4] != b && (c = !0); r[4] = b; break; case 65: r[8] != b && (c = !0); r[8] = b; break; case 39: r[5] != b && (c = !0); r[5] = b; break; case 68: r[9] != b && (c = !0), r[9] = b } c && b && (ca = "undefined" !== typeof performance && performance.now() ? performance.now() : Date.now(), F()) } function ha() { if (G) { var a = !1, h = b.pitch, c = b.yaw, d = b.hfov, e; e = "undefined" !== typeof performance && performance.now() ? performance.now() : Date.now(); ca === p && (ca = e); var f = (e - ca) * b.hfov / 1700 , f = Math.min(f, 1); r[0] && !0 === b.keyboardZoom && (x(b.hfov + (0.8 * w.hfov + 0.5) * f), a = !0); r[1] && !0 === b.keyboardZoom && (x(b.hfov + (0.8 * w.hfov - 0.2) * f), a = !0); if (r[2] || r[6]) b.pitch += (0.8 * w.pitch + 0.2) * f, a = !0; if (r[3] || r[7]) b.pitch += (0.8 * w.pitch - 0.2) * f, a = !0; if (r[4] || r[8]) b.yaw += (0.8 * w.yaw - 0.2) * f, a = !0; if (r[5] || r[9]) b.yaw += (0.8 * w.yaw + 0.2) * f, a = !0; a && (O = Date.now()); if (b.autoRotate) { if (0.001 < e - ca) { var a = (e - ca) / 1E3 , g = (w.yaw / a * f - 0.2 * b.autoRotate) * a , g = (0 < -b.autoRotate ? 1 : -1) * Math.min(Math.abs(b.autoRotate * a), Math.abs(g)); b.yaw += g } b.autoRotateStopDelay && (b.autoRotateStopDelay -= e - ca, 0 >= b.autoRotateStopDelay && (b.autoRotateStopDelay = !1, $ = b.autoRotate, b.autoRotate = 0)) } P.pitch && (n("pitch"), h = b.pitch); P.yaw && (n("yaw"), c = b.yaw); P.hfov && (n("hfov"), d = b.hfov); 0 < f && !b.autoRotate && (a = 1 - b.friction, r[4] || r[5] || r[8] || r[9] || P.yaw || (b.yaw += w.yaw * f * a), r[2] || r[3] || r[6] || r[7] || P.pitch || (b.pitch += w.pitch * f * a), r[0] || r[1] || P.hfov || x(b.hfov + w.hfov * f * a)); ca = e; 0 < f && (w.yaw = 0.8 * w.yaw + (b.yaw - c) / f * 0.2, w.pitch = 0.8 * w.pitch + (b.pitch - h) / f * 0.2, w.hfov = 0.8 * w.hfov + (b.hfov - d) / f * 0.2, h = b.autoRotate ? Math.abs(b.autoRotate) : 5, w.yaw = Math.min(h, Math.max(w.yaw, -h)), w.pitch = Math.min(h, Math.max(w.pitch, -h)), w.hfov = Math.min(h, Math.max(w.hfov, -h))); r[0] && r[1] && (w.hfov = 0); (r[2] || r[6]) && (r[3] || r[7]) && (w.pitch = 0); (r[4] || r[8]) && (r[5] || r[9]) && (w.yaw = 0) } } function n(a) { var h = P[a] , c = Math.min(1, Math.max((Date.now() - h.startTime) / 1E3 / (h.duration / 1E3), 0)) , c = h.startPosition + b.animationTimingFunction(c) * (h.endPosition - h.startPosition); if (h.endPosition > h.startPosition && c >= h.endPosition || h.endPosition < h.startPosition && c <= h.endPosition || h.endPosition === h.startPosition) c = h.endPosition, w[a] = 0, delete P[a]; b[a] = c } function z() { g("resize") } function F() { Ta || (Ta = !0, da()) } function da() { if (!Za) if (Da(), Oa && clearTimeout(Oa), ia || !0 === Y) requestAnimationFrame(da); else if (r[0] || r[1] || r[2] || r[3] || r[4] || r[5] || r[6] || r[7] || r[8] || r[9] || b.autoRotate || P.pitch || P.yaw || P.hfov || 0.01 < Math.abs(w.yaw) || 0.01 < Math.abs(w.pitch) || 0.01 < Math.abs(w.hfov)) ha(), 0 <= b.autoRotateInactivityDelay && $ && Date.now() - O > b.autoRotateInactivityDelay && !b.autoRotate && (b.autoRotate = $, ea.lookAt(Ea, p, qa, 3E3)), requestAnimationFrame(da); else if (D && (D.isLoading() || !0 === b.dynamic && Ka)) requestAnimationFrame(da); else { C("animatefinished", { pitch: ea.getPitch(), yaw: ea.getYaw(), hfov: ea.getHfov() }); Ta = !1; ca = p; var a = b.autoRotateInactivityDelay - (Date.now() - O); 0 < a ? Oa = setTimeout(function() { b.autoRotate = $; ea.lookAt(Ea, p, qa, 3E3); F() }, a) : 0 <= b.autoRotateInactivityDelay && $ && (b.autoRotate = $, ea.lookAt(Ea, p, qa, 3E3), F()) } } function Da() { var a; if (G) { var h = D.getCanvas(); !1 !== b.autoRotate && (360 < b.yaw ? b.yaw -= 360 : -360 > b.yaw && (b.yaw += 360)); a = b.yaw; var c = 0; if (b.avoidShowingBackground) { var d = b.hfov / 2 , e = 180 * Math.atan2(Math.tan(d / 180 * Math.PI), h.width / h.height) / Math.PI; b.vaov > b.haov ? Math.min(Math.cos((b.pitch - d) / 180 * Math.PI), Math.cos((b.pitch + d) / 180 * Math.PI)) : c = d * (1 - Math.min(Math.cos((b.pitch - e) / 180 * Math.PI), Math.cos((b.pitch + e) / 180 * Math.PI))) } var d = b.maxYaw - b.minYaw , e = -180 , f = 180; 360 > d && (e = b.minYaw + b.hfov / 2 + c, f = b.maxYaw - b.hfov / 2 - c, d < b.hfov && (e = f = (e + f) / 2), b.yaw = Math.max(e, Math.min(f, b.yaw))); !1 === b.autoRotate && (360 < b.yaw ? b.yaw -= 360 : -360 > b.yaw && (b.yaw += 360)); !1 !== b.autoRotate && a != b.yaw && ca !== p && (b.autoRotate *= -1); a = 2 * Math.atan(Math.tan(b.hfov / 180 * Math.PI * 0.5) / (h.width / h.height)) / Math.PI * 180; h = b.minPitch + a / 2; c = b.maxPitch - a / 2; b.maxPitch - b.minPitch < a && (h = c = (h + c) / 2); isNaN(h) && (h = -90); isNaN(c) && (c = 90); b.pitch = Math.max(h, Math.min(c, b.pitch)); D.render(b.pitch * Math.PI / 180, b.yaw * Math.PI / 180, b.hfov * Math.PI / 180, { roll: b.roll * Math.PI / 180 }); b.hotSpots.forEach(Pa); b.compass && (Ga.style.transform = "rotate(" + (-b.yaw - b.northOffset) + "deg)", Ga.style.webkitTransform = "rotate(" + (-b.yaw - b.northOffset) + "deg)") } } function Z(a, b, c, d) { this.w = a; this.x = b; this.y = c; this.z = d } function na(a) { var h; h = a.alpha; var c = a.beta; a = a.gamma; c = [c ? c * Math.PI / 180 / 2 : 0, a ? a * Math.PI / 180 / 2 : 0, h ? h * Math.PI / 180 / 2 : 0]; h = [Math.cos(c[0]), Math.cos(c[1]), Math.cos(c[2])]; c = [Math.sin(c[0]), Math.sin(c[1]), Math.sin(c[2])]; h = new Z(h[0] * h[1] * h[2] - c[0] * c[1] * c[2],c[0] * h[1] * h[2] - h[0] * c[1] * c[2],h[0] * c[1] * h[2] + c[0] * h[1] * c[2],h[0] * h[1] * c[2] + c[0] * c[1] * h[2]); h = h.multiply(new Z(Math.sqrt(0.5),-Math.sqrt(0.5),0,0)); c = y.orientation ? -y.orientation * Math.PI / 180 / 2 : 0; h = h.multiply(new Z(Math.cos(c),0,-Math.sin(c),0)).toEulerAngles(); "number" == typeof Y && 10 > Y ? Y += 1 : 10 === Y ? ($a = h[2] / Math.PI * 180 + b.yaw, Y = !0, requestAnimationFrame(da)) : (b.pitch = h[0] / Math.PI * 180, b.roll = -h[1] / Math.PI * 180, b.yaw = -h[2] / Math.PI * 180 + $a) } function ua() { try { var a = {}; b.horizonPitch !== p && (a.horizonPitch = b.horizonPitch * Math.PI / 180); b.horizonRoll !== p && (a.horizonRoll = b.horizonRoll * Math.PI / 180); b.backgroundColor !== p && (a.backgroundColor = b.backgroundColor); D.init(R, b.type, b.dynamic, b.haov * Math.PI / 180, b.vaov * Math.PI / 180, b.vOffset * Math.PI / 180, T, a); !0 !== b.dynamic && (R = p) } catch (c) { if ("webgl error" == c.type || "no webgl" == c.type) L(); else if ("webgl size error" == c.type) L(b.strings.textureSizeError.replace("%s", c.width).replace("%s", c.maxWidth)); else throw L(b.strings.unknownError), c; } } function T() { if (b.sceneFadeDuration && D.fadeImg !== p) { D.fadeImg.style.opacity = 0; var a = D.fadeImg; delete D.fadeImg; setTimeout(function() { N.removeChild(a); C("scenechangefadedone") }, b.sceneFadeDuration) } Ga.style.display = b.compass ? "inline" : "none"; M(); q.load.box.style.display = "none"; ra !== p && (N.removeChild(ra), ra = p); G = !0; C("load"); F() } function Ja(a) { a.pitch = Number(a.pitch) || 0; a.yaw = Number(a.yaw) || 0; var h = c.createElement("div"); h.className = "pnlm-hotspot-base"; h.className = a.cssClass ? h.className + (" " + a.cssClass) : h.className + (" pnlm-hotspot pnlm-sprite pnlm-" + E(a.type)); var d = c.createElement("span"); a.text && (d.innerHTML = E(a.text)); var e; if (a.video) { e = c.createElement("video"); var f = a.video; b.basePath && !H(f) && (f = b.basePath + f); e.src = J(f); e.controls = !0; e.style.width = a.width + "px"; N.appendChild(h); d.appendChild(e) } else if (a.image) { f = a.image; b.basePath && !H(f) && (f = b.basePath + f); e = c.createElement("a"); e.href = J(a.URL ? a.URL : f, !0); e.target = "_blank"; d.appendChild(e); var g = c.createElement("img"); g.src = J(f); g.style.width = a.width + "px"; g.style.paddingTop = "5px"; N.appendChild(h); e.appendChild(g); d.style.maxWidth = "initial" } else if (a.URL) { e = c.createElement("a"); e.href = J(a.URL, !0); if (a.attributes) for (f in a.attributes) e.setAttribute(f, a.attributes[f]); else e.target = "_blank"; N.appendChild(e); h.className += " pnlm-pointer"; d.className += " pnlm-pointer"; e.appendChild(h) } else a.sceneId && (h.onclick = h.ontouchend = function() { h.clicked || (h.clicked = !0, B(a.sceneId, a.targetPitch, a.targetYaw, a.targetHfov)); return !1 } , h.className += " pnlm-pointer", d.className += " pnlm-pointer"), N.appendChild(h); if (a.createTooltipFunc) a.createTooltipFunc(h, a.createTooltipArgs); else if (a.text || a.video || a.image) h.classList.add("pnlm-tooltip"), h.appendChild(d), d.style.width = d.scrollWidth - 20 + "px", d.style.marginLeft = -(d.scrollWidth - h.offsetWidth) / 2 + "px", d.style.marginTop = -d.scrollHeight - 12 + "px"; a.clickHandlerFunc && (h.addEventListener("click", function(b) { a.clickHandlerFunc(b, a.clickHandlerArgs) }, "false"), h.className += " pnlm-pointer", d.className += " pnlm-pointer"); a.div = h } function M() { Ua || (b.hotSpots ? (b.hotSpots = b.hotSpots.sort(function(a, b) { return a.pitch < b.pitch }), b.hotSpots.forEach(Ja)) : b.hotSpots = [], Ua = !0, b.hotSpots.forEach(Pa)) } function f() { var a = b.hotSpots; Ua = !1; delete b.hotSpots; if (a) for (var c = 0; c < a.length; c++) { var d = a[c].div; if (d) { for (; d.parentNode && d.parentNode != N; ) d = d.parentNode; N.removeChild(d) } delete a[c].div } } function Pa(a) { var c = Math.sin(a.pitch * Math.PI / 180) , d = Math.cos(a.pitch * Math.PI / 180) , e = Math.sin(b.pitch * Math.PI / 180) , f = Math.cos(b.pitch * Math.PI / 180) , g = Math.cos((-a.yaw + b.yaw) * Math.PI / 180) , k = c * e + d * g * f; if (90 >= a.yaw && -90 < a.yaw && 0 >= k || (90 < a.yaw || -90 >= a.yaw) && 0 >= k) a.div.style.visibility = "hidden"; else { var m = Math.sin((-a.yaw + b.yaw) * Math.PI / 180) , p = Math.tan(b.hfov * Math.PI / 360); a.div.style.visibility = "visible"; var l = D.getCanvas() , n = l.clientWidth , l = l.clientHeight , c = [-n / p * m * d / k / 2, -n / p * (c * f - d * g * e) / k / 2] , d = Math.sin(b.roll * Math.PI / 180) , e = Math.cos(b.roll * Math.PI / 180) , c = [c[0] * e - c[1] * d, c[0] * d + c[1] * e]; c[0] += (n - a.div.offsetWidth) / 2; c[1] += (l - a.div.offsetHeight) / 2; n = "translate(" + c[0] + "px, " + c[1] + "px) translateZ(9999px) rotate(" + b.roll + "deg)"; a.scale && (n += " scale(" + qa / b.hfov / k + ")"); a.div.style.webkitTransform = n; a.div.style.MozTransform = n; a.div.style.transform = n } } function I(a) { b = {}; var c, d, e = "haov vaov vOffset northOffset horizonPitch horizonRoll".split(" "); ba = []; for (c in Va) Va.hasOwnProperty(c) && (b[c] = Va[c]); for (c in k.default) if (k.default.hasOwnProperty(c)) if ("strings" == c) for (d in k.default.strings) k.default.strings.hasOwnProperty(d) && (b.strings[d] = E(k.default.strings[d])); else b[c] = k.default[c], 0 <= e.indexOf(c) && ba.push(c); if (null !== a && "" !== a && k.scenes && k.scenes[a]) { var f = k.scenes[a]; for (c in f) if (f.hasOwnProperty(c)) if ("strings" == c) for (d in f.strings) f.strings.hasOwnProperty(d) && (b.strings[d] = E(f.strings[d])); else b[c] = f[c], 0 <= e.indexOf(c) && ba.push(c); b.scene = a } for (c in k) if (k.hasOwnProperty(c)) if ("strings" == c) for (d in k.strings) k.strings.hasOwnProperty(d) && (b.strings[d] = E(k.strings[d])); else b[c] = k[c], 0 <= e.indexOf(c) && ba.push(c) } function m(a) { if ((a = a ? a : !1) && "preview"in b) { var d = b.preview; b.basePath && !H(d) && (d = b.basePath + d); ra = c.createElement("div"); ra.className = "pnlm-preview-img"; ra.style.backgroundImage = "url('" + J(d).replace(/"/g, "%22").replace(/'/g, "%27") + "')"; N.appendChild(ra) } var d = b.title , e = b.author; a && ("previewTitle"in b && (b.title = b.previewTitle), "previewAuthor"in b && (b.author = b.previewAuthor)); b.hasOwnProperty("title") || (q.title.innerHTML = ""); b.hasOwnProperty("author") || (q.author.innerHTML = ""); b.hasOwnProperty("title") || b.hasOwnProperty("author") || (q.container.style.display = "none"); u.load.innerHTML = "<p>" + b.strings.loadButtonLabel + "</p>"; q.load.boxp.innerHTML = b.strings.loadingLabel; for (var f in b) if (b.hasOwnProperty(f)) switch (f) { case "title": q.title.innerHTML = E(b[f]); q.container.style.display = "inline"; break; case "author": var g = E(b[f]); b.authorURL && (g = c.createElement("a"), g.href = J(b.authorURL, !0), g.target = "_blank", g.innerHTML = E(b[f]), g = g.outerHTML); q.author.innerHTML = b.strings.bylineLabel.replace("%s", g); q.container.style.display = "inline"; break; case "fallback": g = c.createElement("a"); g.href = J(b[f], !0); g.target = "_blank"; g.textContent = "Click here to view this panorama in an alternative viewer."; var k = c.createElement("p"); k.textContent = "Your browser does not support WebGL."; k.appendChild(c.createElement("br")); k.appendChild(g); q.errorMsg.innerHTML = ""; q.errorMsg.appendChild(k); break; case "hfov": x(Number(b[f])); break; case "autoLoad": !0 === b[f] && D === p && (q.load.box.style.display = "inline", u.load.style.display = "none", oa()); break; case "showZoomCtrl": u.zoom.style.display = b[f] && !1 != b.showControls ? "block" : "none"; break; case "showFullscreenCtrl": u.fullscreen.style.display = b[f] && !1 != b.showControls && ("fullscreen"in c || "mozFullScreen"in c || "webkitIsFullScreen"in c || "msFullscreenElement"in c) ? "block" : "none"; break; case "hotSpotDebug": Wa.style.display = b[f] ? "block" : "none"; break; case "showControls": b[f] || (u.orientation.style.display = "none", u.zoom.style.display = "none", u.fullscreen.style.display = "none"); break; case "orientationOnByDefault": b[f] && Qa() } a && (d ? b.title = d : delete b.title, e ? b.author = e : delete b.author) } function e() { if (G && !La) if (za) c.exitFullscreen ? c.exitFullscreen() : c.mozCancelFullScreen ? c.mozCancelFullScreen() : c.webkitCancelFullScreen ? c.webkitCancelFullScreen() : c.msExitFullscreen && c.msExitFullscreen(); else try { l.requestFullscreen ? l.requestFullscreen() : l.mozRequestFullScreen ? l.mozRequestFullScreen() : l.msRequestFullscreen ? l.msRequestFullscreen() : l.webkitRequestFullScreen() } catch (a) {} } function g(a) { c.fullscreenElement || c.fullscreen || c.mozFullScreen || c.webkitIsFullScreen || c.msFullscreenElement ? (u.fullscreen.classList.add("pnlm-fullscreen-toggle-button-active"), za = !0) : (u.fullscreen.classList.remove("pnlm-fullscreen-toggle-button-active"), za = !1); "resize" !== a && C("fullscreenchange", za); D.resize(); x(b.hfov); F() } function t(a) { var c = b.minHfov; "multires" == b.type && D && !b.multiResMinHfov && (c = Math.min(c, D.getCanvas().width / (b.multiRes.cubeResolution / 90 * 0.9))); if (c > b.maxHfov) return console.log("HFOV bounds do not make sense (minHfov > maxHfov)."), b.hfov; var d = b.hfov , d = a < c ? c : a > b.maxHfov ? b.maxHfov : a; b.avoidShowingBackground && D && (a = D.getCanvas(), d = Math.min(d, 360 * Math.atan(Math.tan((b.maxPitch - b.minPitch) / 360 * Math.PI) / a.height * a.width) / Math.PI)); return d } function x(a) { b.hfov = t(a); C("zoomchange", b.hfov) } function s() { P = {}; $ = b.autoRotate ? b.autoRotate : $; b.autoRotate = !1 } function Ya() { La && (q.load.box.style.display = "none", q.errorMsg.style.display = "none", La = !1, N.style.display = "block", C("errorcleared")); G = !1; u.load.style.display = "none"; q.load.box.style.display = "inline"; oa() } function B(a, c, d, e, g) { G || (g = !0); G = !1; P = {}; var n, l; if (b.sceneFadeDuration && !g && (n = D.render(b.pitch * Math.PI / 180, b.yaw * Math.PI / 180, b.hfov * Math.PI / 180, { returnImage: !0 }), n !== p)) { g = new Image; g.className = "pnlm-fade-img"; g.style.transition = "opacity " + b.sceneFadeDuration / 1E3 + "s"; g.style.width = "100%"; g.style.height = "100%"; g.onload = function() { B(a, c, d, e, !0) } ; g.src = n; N.appendChild(g); D.fadeImg = g; return } g = "same" === c ? b.pitch : c; n = "same" === d ? b.yaw : "sameAzimuth" === d ? b.yaw + (b.northOffset || 0) - (k.scenes[a].northOffset || 0) : d; l = "same" === e ? b.hfov : e; f(); I(a); w.yaw = w.pitch = w.hfov = 0; m(); g !== p && (b.pitch = g); n !== p && (b.yaw = n); l !== p && (b.hfov = l); C("scenechange", a); Ya() } function Ba() { y.removeEventListener("deviceorientation", na); u.orientation.classList.remove("pnlm-orientation-button-active"); Y = !1 } function Qa() { "function" === typeof DeviceMotionEvent.requestPermission ? DeviceOrientationEvent.requestPermission().then(function(a) { "granted" == a && (Y = 1, y.addEventListener("deviceorientation", na), u.orientation.classList.add("pnlm-orientation-button-active")) }) : (Y = 1, y.addEventListener("deviceorientation", na), u.orientation.classList.add("pnlm-orientation-button-active")) } function E(a) { return k.escapeHTML ? String(a).split(/&/g).join("&").split('"').join(""").split("'").join("'").split("<").join("<").split(">").join(">").split("/").join("/").split("\n").join("<br>") : String(a).split("\n").join("<br>") } function J(a, b) { try { var c = decodeURIComponent(ab(a)).replace(/[^\w:]/g, "").toLowerCase() } catch (d) { return "about:blank" } return 0 === c.indexOf("javascript:") || 0 === c.indexOf("vbscript:") ? (console.log("Script URL removed."), "about:blank") : b && 0 === c.indexOf("data:") ? (console.log("Data URI removed from link."), "about:blank") : a } function ab(a) { return a.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(a, b) { b = b.toLowerCase(); return "colon" === b ? ":" : "#" === b.charAt(0) ? "x" === b.charAt(1) ? String.fromCharCode(parseInt(b.substring(2), 16)) : String.fromCharCode(+b.substring(1)) : "" }) } function C(a) { if (a in U) for (var b = U[a].length; 0 < b; b--) U[a][U[a].length - b].apply(null, [].slice.call(arguments, 1)) } var ea = this, b, D, ra, ia = !1, O = Date.now(), wa = 0, xa = 0, Fa = -1, Ma = 0, Na = 0, r = Array(10), za = !1, G, La = !1, Sa = !1, R, ca, w = { yaw: 0, pitch: 0, hfov: 0 }, Ta = !1, Y = !1, $a = 0, Oa, $ = 0, qa, Ea, P = {}, U = {}, ba = [], Ka = !1, Ua = !1, Za = !1, Va = { hfov: 100, minHfov: 50, multiResMinHfov: !1, maxHfov: 120, pitch: 0, minPitch: p, maxPitch: p, yaw: 0, minYaw: -180, maxYaw: 180, roll: 0, haov: 360, vaov: 180, vOffset: 0, autoRotate: !1, autoRotateInactivityDelay: -1, autoRotateStopDelay: p, type: "equirectangular", northOffset: 0, showFullscreenCtrl: !0, dynamic: !1, dynamicUpdate: !1, doubleClickZoom: !0, keyboardZoom: !0, mouseZoom: !0, showZoomCtrl: !0, autoLoad: !1, showControls: !0, orientationOnByDefault: !1, hotSpotDebug: !1, backgroundColor: [0, 0, 0], avoidShowingBackground: !1, animationTimingFunction: function(a) { return 0.5 > a ? 2 * a * a : -1 + (4 - 2 * a) * a }, draggable: !0, disableKeyboardCtrl: !1, crossOrigin: "anonymous", touchPanSpeedCoeffFactor: 1, capturedKeyNumbers: [16, 17, 27, 37, 38, 39, 40, 61, 65, 68, 83, 87, 107, 109, 173, 187, 189], friction: 0.15, strings: { loadButtonLabel: "Click to<br>Load<br>Panorama", loadingLabel: "Loading...", bylineLabel: "by %s", noPanoramaError: "No panorama image was specified.", fileAccessError: "The file %s could not be accessed.", malformedURLError: "There is something wrong with the panorama URL.", iOS8WebGLError: "Due to iOS 8's broken WebGL implementation, only progressive encoded JPEGs work for your device (this panorama uses standard encoding).", genericWebGLError: "Your browser does not have the necessary WebGL support to display this panorama.", textureSizeError: "This panorama is too big for your device! It's %spx wide, but your device only supports images up to %spx wide. Try another device. (If you're the author, try scaling down the image.)", unknownError: "Unknown error. Check developer console." } }; l = "string" === typeof l ? c.getElementById(l) : l; l.classList.add("pnlm-container"); l.tabIndex = 0; var K = c.createElement("div"); K.className = "pnlm-ui"; l.appendChild(K); var N = c.createElement("div"); N.className = "pnlm-render-container"; l.appendChild(N); var X = c.createElement("div"); X.className = "pnlm-dragfix"; K.appendChild(X); var ga = c.createElement("span"); ga.className = "pnlm-about-msg"; ga.innerHTML = '<a href="https://pannellum.org/" target="_blank">Pannellum</a> 2.5.6'; K.appendChild(ga); X.addEventListener("contextmenu", Aa); var q = {} , Wa = c.createElement("div"); Wa.className = "pnlm-sprite pnlm-hot-spot-debug-indicator"; K.appendChild(Wa); q.container = c.createElement("div"); q.container.className = "pnlm-panorama-info"; q.title = c.createElement("div"); q.title.className = "pnlm-title-box"; q.container.appendChild(q.title); q.author = c.createElement("div"); q.author.className = "pnlm-author-box"; q.container.appendChild(q.author); K.appendChild(q.container); q.load = {}; q.load.box = c.createElement("div"); q.load.box.className = "pnlm-load-box"; q.load.boxp = c.createElement("p"); q.load.box.appendChild(q.load.boxp); q.load.lbox = c.createElement("div"); q.load.lbox.className = "pnlm-lbox"; q.load.lbox.innerHTML = '<div class="pnlm-loading"></div>'; q.load.box.appendChild(q.load.lbox); q.load.lbar = c.createElement("div"); q.load.lbar.className = "pnlm-lbar"; q.load.lbarFill = c.createElement("div"); q.load.lbarFill.className = "pnlm-lbar-fill"; q.load.lbar.appendChild(q.load.lbarFill); q.load.box.appendChild(q.load.lbar); q.load.msg = c.createElement("p"); q.load.msg.className = "pnlm-lmsg"; q.load.box.appendChild(q.load.msg); K.appendChild(q.load.box); q.errorMsg = c.createElement("div"); q.errorMsg.className = "pnlm-error-msg pnlm-info-box"; K.appendChild(q.errorMsg); var u = {}; u.container = c.createElement("div"); u.container.className = "pnlm-controls-container"; K.appendChild(u.container); u.load = c.createElement("div"); u.load.className = "pnlm-load-button"; u.load.addEventListener("click", function() { m(); Ya() }); K.appendChild(u.load); u.zoom = c.createElement("div"); u.zoom.className = "pnlm-zoom-controls pnlm-controls"; u.zoomIn = c.createElement("div"); u.zoomIn.className = "pnlm-zoom-in pnlm-sprite pnlm-control"; u.zoomIn.addEventListener("click", function() { G && (x(b.hfov - 5), F()) }); u.zoom.appendChild(u.zoomIn); u.zoomOut = c.createElement("div"); u.zoomOut.className = "pnlm-zoom-out pnlm-sprite pnlm-control"; u.zoomOut.addEventListener("click", function() { G && (x(b.hfov + 5), F()) }); u.zoom.appendChild(u.zoomOut); u.container.appendChild(u.zoom); u.fullscreen = c.createElement("div"); u.fullscreen.addEventListener("click", e); u.fullscreen.className = "pnlm-fullscreen-toggle-button pnlm-sprite pnlm-fullscreen-toggle-button-inactive pnlm-controls pnlm-control"; (c.fullscreenEnabled || c.mozFullScreenEnabled || c.webkitFullscreenEnabled || c.msFullscreenEnabled) && u.container.appendChild(u.fullscreen); u.orientation = c.createElement("div"); u.orientation.addEventListener("click", function(a) { Y ? Ba() : Qa() }); u.orientation.addEventListener("mousedown", function(a) { a.stopPropagation() }); u.orientation.addEventListener("touchstart", function(a) { a.stopPropagation() }); u.orientation.addEventListener("pointerdown", function(a) { a.stopPropagation() }); u.orientation.className = "pnlm-orientation-button pnlm-orientation-button-inactive pnlm-sprite pnlm-controls pnlm-control"; var Xa = !1; y.DeviceOrientationEvent && "https:" == location.protocol && 0 <= navigator.userAgent.toLowerCase().indexOf("mobi") && (u.container.appendChild(u.orientation), Xa = !0); var Ga = c.createElement("div"); Ga.className = "pnlm-compass pnlm-controls pnlm-control"; K.appendChild(Ga); k.firstScene ? I(k.firstScene) : k.default && k.default.firstScene ? I(k.default.firstScene) : I(null); m(!0); var ja = [] , ya = []; Z.prototype.multiply = function(a) { return new Z(this.w * a.w - this.x * a.x - this.y * a.y - this.z * a.z,this.x * a.w + this.w * a.x + this.y * a.z - this.z * a.y,this.y * a.w + this.w * a.y + this.z * a.x - this.x * a.z,this.z * a.w + this.w * a.z + this.x * a.y - this.y * a.x) } ; Z.prototype.toEulerAngles = function() { var a = Math.atan2(2 * (this.w * this.x + this.y * this.z), 1 - 2 * (this.x * this.x + this.y * this.y)) , b = Math.asin(2 * (this.w * this.y - this.z * this.x)) , c = Math.atan2(2 * (this.w * this.z + this.x * this.y), 1 - 2 * (this.y * this.y + this.z * this.z)); return [a, b, c] } ; this.isLoaded = function() { return Boolean(G) } ; this.getPitch = function() { return b.pitch } ; this.setPitch = function(a, c, d, e) { O = Date.now(); if (1E-6 >= Math.abs(a - b.pitch)) return "function" == typeof d && d(e), this; (c = c == p ? 1E3 : Number(c)) ? (P.pitch = { startTime: Date.now(), startPosition: b.pitch, endPosition: a, duration: c }, "function" == typeof d && setTimeout(function() { d(e) }, c)) : b.pitch = a; F(); return this } ; this.getPitchBounds = function() { return [b.minPitch, b.maxPitch] } ; this.setPitchBounds = function(a) { b.minPitch = Math.max(-90, Math.min(a[0], 90)); b.maxPitch = Math.max(-90, Math.min(a[1], 90)); return this } ; this.getYaw = function() { return (b.yaw + 540) % 360 - 180 } ; this.setYaw = function(a, c, d, e) { O = Date.now(); if (1E-6 >= Math.abs(a - b.yaw)) return "function" == typeof d && d(e), this; c = c == p ? 1E3 : Number(c); a = (a + 180) % 360 - 180; c ? (180 < b.yaw - a ? a += 360 : 180 < a - b.yaw && (a -= 360), P.yaw = { startTime: Date.now(), startPosition: b.yaw, endPosition: a, duration: c }, "function" == typeof d && setTimeout(function() { d(e) }, c)) : b.yaw = a; F(); return this } ; this.getYawBounds = function() { return [b.minYaw, b.maxYaw] } ; this.setYawBounds = function(a) { b.minYaw = Math.max(-360, Math.min(a[0], 360)); b.maxYaw = Math.max(-360, Math.min(a[1], 360)); return this } ; this.getHfov = function() { return b.hfov } ; this.setHfov = function(a, c, d, e) { O = Date.now(); if (1E-6 >= Math.abs(a - b.hfov)) return "function" == typeof d && d(e), this; (c = c == p ? 1E3 : Number(c)) ? (P.hfov = { startTime: Date.now(), startPosition: b.hfov, endPosition: t(a), duration: c }, "function" == typeof d && setTimeout(function() { d(e) }, c)) : x(a); F(); return this } ; this.getHfovBounds = function() { return [b.minHfov, b.maxHfov] } ; this.setHfovBounds = function(a) { b.minHfov = Math.max(0, a[0]); b.maxHfov = Math.max(0, a[1]); return this } ; this.lookAt = function(a, c, d, e, f, g) { e = e == p ? 1E3 : Number(e); a !== p && 1E-6 < Math.abs(a - b.pitch) && (this.setPitch(a, e, f, g), f = p); c !== p && 1E-6 < Math.abs(c - b.yaw) && (this.setYaw(c, e, f, g), f = p); d !== p && 1E-6 < Math.abs(d - b.hfov) && (this.setHfov(d, e, f, g), f = p); "function" == typeof f && f(g); return this } ; this.getNorthOffset = function() { return b.northOffset } ; this.setNorthOffset = function(a) { b.northOffset = Math.min(360, Math.max(0, a)); F(); return this } ; this.getHorizonRoll = function() { return b.horizonRoll } ; this.setHorizonRoll = function(a) { b.horizonRoll = Math.min(90, Math.max(-90, a)); D.setPose(b.horizonPitch * Math.PI / 180, b.horizonRoll * Math.PI / 180); F(); return this } ; this.getHorizonPitch = function() { return b.horizonPitch } ; this.setHorizonPitch = function(a) { b.horizonPitch = Math.min(90, Math.max(-90, a)); D.setPose(b.horizonPitch * Math.PI / 180, b.horizonRoll * Math.PI / 180); F(); return this } ; this.startAutoRotate = function(a, c) { a = a || $ || 1; c = c === p ? Ea : c; b.autoRotate = a; ea.lookAt(c, p, qa, 3E3); F(); return this } ; this.stopAutoRotate = function() { $ = b.autoRotate ? b.autoRotate : $; b.autoRotate = !1; b.autoRotateInactivityDelay = -1; return this } ; this.stopMovement = function() { s(); w = { yaw: 0, pitch: 0, hfov: 0 } } ; this.getRenderer = function() { return D } ; this.setUpdate = function(a) { Ka = !0 === a; D === p ? pa() : F(); return this } ; this.mouseEventToCoords = function(a) { return sa(a) } ; this.loadScene = function(a, b, c, d) { !1 !== G && B(a, b, c, d); return this } ; this.getScene = function() { return b.scene } ; this.addScene = function(a, b) { k.scenes[a] = b; return this } ; this.removeScene = function(a) { if (b.scene === a || !k.scenes.hasOwnProperty(a)) return !1; delete k.scenes[a]; return !0 } ; this.toggleFullscreen = function() { e(); return this } ; this.getConfig = function() { return b } ; this.getContainer = function() { return l } ; this.addHotSpot = function(a, c) { if (c === p && b.scene === p) b.hotSpots.push(a); else { var d = c !== p ? c : b.scene; if (k.scenes.hasOwnProperty(d)) k.scenes[d].hasOwnProperty("hotSpots") || (k.scenes[d].hotSpots = [], d == b.scene && (b.hotSpots = k.scenes[d].hotSpots)), k.scenes[d].hotSpots.push(a); else throw "Invalid scene ID!"; } if (c === p || b.scene == c) Ja(a), G && Pa(a); return this } ; this.removeHotSpot = function(a, c) { if (c === p || b.scene == c) { if (!b.hotSpots) return !1; for (var d = 0; d < b.hotSpots.length; d++) if (b.hotSpots[d].hasOwnProperty("id") && b.hotSpots[d].id === a) { for (var e = b.hotSpots[d].div; e.parentNode != N; ) e = e.parentNode; N.removeChild(e); delete b.hotSpots[d].div; b.hotSpots.splice(d, 1); return !0 } } else if (k.scenes.hasOwnProperty(c)) { if (!k.scenes[c].hasOwnProperty("hotSpots")) return !1; for (d = 0; d < k.scenes[c].hotSpots.length; d++) if (k.scenes[c].hotSpots[d].hasOwnProperty("id") && k.scenes[c].hotSpots[d].id === a) return k.scenes[c].hotSpots.splice(d, 1), !0 } else return !1 } ; this.resize = function() { D && z() } ; this.isLoaded = function() { return G } ; this.isOrientationSupported = function() { return Xa || !1 } ; this.stopOrientation = function() { Ba() } ; this.startOrientation = function() { Xa && Qa() } ; this.isOrientationActive = function() { return Boolean(Y) } ; this.on = function(a, b) { U[a] = U[a] || []; U[a].push(b); return this } ; this.off = function(a, b) { if (!a) return U = {}, this; if (b) { var c = U[a].indexOf(b); 0 <= c && U[a].splice(c, 1); 0 == U[a].length && delete U[a] } else delete U[a]; return this } ; this.destroy = function() { Za = !0; clearTimeout(Oa); D && D.destroy(); Sa && (c.removeEventListener("mousemove", ta, !1), c.removeEventListener("mouseup", ma, !1), l.removeEventListener("mozfullscreenchange", g, !1), l.removeEventListener("webkitfullscreenchange", g, !1), l.removeEventListener("msfullscreenchange", g, !1), l.removeEventListener("fullscreenchange", g, !1), y.removeEventListener("resize", z, !1), y.removeEventListener("orientationchange", z, !1), l.removeEventListener("keydown", W, !1), l.removeEventListener("keyup", S, !1), l.removeEventListener("blur", aa, !1), c.removeEventListener("mouseleave", ma, !1)); l.innerHTML = ""; l.classList.remove("pnlm-container") } } return { viewer: function(c, k) { return new H(c,k) } } }(window, document); function anError(y) { var c = document.createElement("div"); c.className = "pnlm-info-box"; var p = document.createElement("p"); p.textContent = y; c.appendChild(p); document.getElementById("container").appendChild(c) } var viewer; function parseURLParameters() { var y; if (y = 0 < window.location.hash.length ? window.location.hash.slice(1) : window.location.search.slice(1)) { y = y.split("&"); for (var c = {}, p = 0; p < y.length; p++) { var H = y[p].split("=")[0] , l = y[p].split("=")[1]; if ("" != l) switch (H) { case "hfov": case "pitch": case "yaw": case "haov": case "vaov": case "minHfov": case "maxHfov": case "minPitch": case "maxPitch": case "minYaw": case "maxYaw": case "vOffset": case "autoRotate": c[H] = Number(l); break; case "autoLoad": case "ignoreGPanoXMP": c[H] = JSON.parse(l); break; case "author": case "title": case "firstScene": case "fallback": case "preview": case "panorama": case "config": c[H] = decodeURIComponent(l); break; default: anError("An invalid configuration parameter was specified: " + H); return } } var k; c.config ? (k = new XMLHttpRequest, k.onload = function() { if (200 != k.status) { var l = document.createElement("a"); l.href = c.config; l.textContent = l.href; anError("The file " + l.outerHTML + " could not be accessed.") } else { l = JSON.parse(k.responseText); void 0 === l.basePath && (l.basePath = c.config.substring(0, c.config.lastIndexOf("/") + 1)); for (var p in l) c.hasOwnProperty(p) || (c[p] = l[p]); "title"in c && (document.title = c.title); c.escapeHTML = !0; viewer = pannellum.viewer("container", c) } } , k.open("GET", c.config), k.send()) : ("title"in c && (document.title = c.title), c.escapeHTML = !0, viewer = pannellum.viewer("container", c)) } else anError("No configuration options were specified.") } "file:" == window.location.protocol ? anError("Due to browser security restrictions, Pannellum can't be run from the local filesystem; some sort of web server must be used.") : parseURLParameters(); </script> </body> </html>