{ "version": 3, "sources": ["../../javascript/gallery.ts"], "sourcesContent": ["interface GalleryPhoto {\n id: number;\n takenAt: number | null;\n description: string;\n sizes?: string[];\n webpSizes?: string[];\n width?: number | null;\n height?: number | null;\n}\n\ninterface GalleryInput {\n photos: GalleryPhoto[];\n photoDomain: string;\n galleryId: number;\n showTime: boolean;\n forSale: boolean;\n isAdmin: boolean;\n isCreator: boolean;\n}\n\n(function () {\n \"use strict\";\n\n const data: GalleryInput | undefined = window.galleryViewerData as\n | GalleryInput\n | undefined;\n if (!data || !data.photos || data.photos.length === 0) return;\n\n const photos = data.photos;\n const domain = data.photoDomain;\n const galleryId = data.galleryId;\n const showTime = data.showTime;\n const forSale = data.forSale;\n const isAdmin = data.isAdmin;\n const isCreator = data.isCreator;\n let currentIndex = -1;\n const preloaded: Record = {};\n let rnd = Date.now();\n\n // Cookie-based cart helpers\n function getCart(): string[] {\n const match = document.cookie.match(/(?:^|; )cart=([^;]*)/);\n if (!match) return [];\n const val = decodeURIComponent(match[1]);\n return val === \"\" ? [] : val.split(\",\");\n }\n\n function setCart(ids: string[]): void {\n document.cookie = \"cart=\" + encodeURIComponent(ids.join(\",\")) + \"; path=/\";\n }\n\n function isInCart(photoId: number): boolean {\n return getCart().indexOf(String(photoId)) !== -1;\n }\n\n function addToCart(photoId: number): void {\n if (isInCart(photoId)) return;\n const cart = getCart();\n cart.push(String(photoId));\n setCart(cart);\n updateCartBadge();\n }\n\n function removeFromCart(photoId: number): void {\n const cart = getCart().filter(function (id) {\n return id !== String(photoId);\n });\n setCart(cart);\n updateCartBadge();\n }\n\n function updateCartBadge(): void {\n const count = getCart().length;\n document.querySelectorAll(\".cart-badge\").forEach((badge) => {\n badge.textContent = String(count);\n (badge as HTMLElement).style.display = count > 0 ? \"\" : \"none\";\n });\n }\n\n // DOM refs\n const mainImage = document.getElementById(\"main-image\")!;\n const loader = document.getElementById(\"image-loader\")!;\n const prevBtn = document.getElementById(\"prev-photo\")!;\n const nextBtn = document.getElementById(\"next-photo\")!;\n const counter = document.getElementById(\"photo-counter\")!;\n const timestamp = document.getElementById(\"photo-timestamp\")!;\n const description = document.getElementById(\"photo-description\")!;\n const thumbStrip = document.getElementById(\"thumb-strip\");\n const thumbs = thumbStrip\n ? thumbStrip.querySelectorAll(\".gallery-thumb\")\n : [];\n const buyLinks = document.getElementById(\"buy-links\");\n const adminLinks = document.getElementById(\"admin-links\");\n\n // Browse controls (strip / grid toggle + time scrubber)\n const galleryBrowse = document.getElementById(\"gallery-browse\");\n const viewToggle = document.getElementById(\"thumb-view-toggle\");\n const viewOptions = viewToggle\n ? viewToggle.querySelectorAll(\".thumb-view-option\")\n : [];\n const viewSlider = viewToggle\n ? viewToggle.querySelector(\".thumb-view-slider\")\n : null;\n const timelineEl = document.getElementById(\"gallery-timeline\");\n const timelineTrack = document.getElementById(\"timeline-track\");\n const timelineFill = document.getElementById(\"timeline-fill\");\n const timelineTicks = document.getElementById(\"timeline-ticks\");\n const timelineHandle = document.getElementById(\"timeline-handle\");\n const timelineBubble = document.getElementById(\"timeline-bubble\");\n const timelineCurrent = document.getElementById(\"timeline-current\");\n const timelineStart = document.getElementById(\"timeline-start\");\n const timelineEnd = document.getElementById(\"timeline-end\");\n\n function photoUrl(photo: GalleryPhoto, size: string): string {\n const ext =\n photo.webpSizes && photo.webpSizes.indexOf(size) !== -1\n ? \".webp\"\n : \".jpg\";\n return (\n \"https://\" +\n domain +\n \"/resized/\" +\n galleryId +\n \"/\" +\n photo.id +\n \"/\" +\n size +\n ext\n );\n }\n\n function viewerSize(photo: GalleryPhoto): string {\n const has =\n (photo.sizes && photo.sizes.indexOf(\"1200x800\") !== -1) ||\n (photo.webpSizes && photo.webpSizes.indexOf(\"1200x800\") !== -1);\n return has ? \"1200x800\" : \"920x615\";\n }\n\n function formatDate(ms: number | null): string {\n if (!ms) return \"\";\n const d = new Date(ms);\n if (d.getFullYear() < 2001) return \"\";\n const months = [\n \"januar\",\n \"februar\",\n \"marts\",\n \"april\",\n \"maj\",\n \"juni\",\n \"juli\",\n \"august\",\n \"september\",\n \"oktober\",\n \"november\",\n \"december\",\n ];\n const day = d.getDate();\n const mon = months[d.getMonth()];\n const year = d.getFullYear();\n const hh = String(d.getHours()).padStart(2, \"0\");\n const mm = String(d.getMinutes()).padStart(2, \"0\");\n return day + \". \" + mon + \" \" + year + \" kl. \" + hh + \":\" + mm;\n }\n\n function formatTime(ms: number | null): string {\n if (!ms) return \"\";\n const d = new Date(ms);\n if (d.getFullYear() < 2001) return \"\";\n const hh = String(d.getHours()).padStart(2, \"0\");\n const mm = String(d.getMinutes()).padStart(2, \"0\");\n return hh + \":\" + mm;\n }\n\n function validTime(ms: number | null): ms is number {\n return ms != null && new Date(ms).getFullYear() >= 2001;\n }\n\n function clamp(n: number, lo: number, hi: number): number {\n return n < lo ? lo : n > hi ? hi : n;\n }\n\n function fillThumbTimes(): void {\n if (!showTime) return;\n for (let i = 0; i < thumbs.length; i++) {\n const el = thumbs[i].querySelector(\".gallery-thumb-time\");\n if (el && photos[i]) el.textContent = formatTime(photos[i].takenAt);\n }\n }\n\n function showImage(index: number): void {\n if (index < 0 || index >= photos.length || index === currentIndex) return;\n\n const photo = photos[index];\n const url = photoUrl(photo, viewerSize(photo));\n\n loader.style.opacity = \"1\";\n\n const img = new Image();\n img.onload = function () {\n if (index !== currentIndex) return;\n\n mainImage.style.backgroundImage = \"url(\" + url + \")\";\n mainImage.setAttribute(\n \"aria-label\",\n photo.description || \"Billede \" + (index + 1),\n );\n loader.style.opacity = \"0\";\n\n preloadAround(index);\n };\n currentIndex = index;\n img.src = url;\n\n updateNav();\n updateInfo(photo, index);\n updateThumbs(index);\n updateTimeline(index);\n updateHash(photo);\n\n if (index > 0) trackHit(\"photo\");\n }\n\n function updateNav(): void {\n prevBtn.style.display = currentIndex > 0 ? \"\" : \"none\";\n nextBtn.style.display = currentIndex < photos.length - 1 ? \"\" : \"none\";\n }\n\n // Megapixels rounded to one decimal, e.g. \"24 MP\".\n function megapixels(photo: GalleryPhoto): string {\n if (!photo.width || !photo.height) return \"\";\n const mp = (photo.width * photo.height) / 1e6;\n const rounded = mp >= 10 ? Math.round(mp) : Math.round(mp * 10) / 10;\n return rounded + \" MP\";\n }\n\n function updateInfo(photo: GalleryPhoto, index: number): void {\n counter.textContent = \"Billede \" + (index + 1) + \" / \" + photos.length;\n timestamp.textContent = formatDate(photo.takenAt);\n description.textContent = photo.description || \"\";\n\n // Buy / cart links\n if (buyLinks && forSale) {\n const inCart = isInCart(photo.id);\n const mp = megapixels(photo);\n const buyLabel =\n \"K\\u00f8b billedet i fuld opl\\u00f8sning\" + (mp ? \" (\" + mp + \")\" : \"\");\n const buyTitle =\n photo.width && photo.height\n ? ' title=\"' + photo.width + \" \\u00d7 \" + photo.height + ' px\"'\n : \"\";\n buyLinks.innerHTML =\n '\" +\n buyLabel +\n \"\" +\n '' +\n 'G\\u00e5 til betaling' +\n ' | ' +\n 'Fjern fra kurv' +\n \"\";\n } else if (buyLinks) {\n buyLinks.innerHTML = \"\";\n }\n\n // Admin / creator links\n if (adminLinks && (isAdmin || isCreator)) {\n let html = \"\";\n const pid = photo.id;\n\n if (isCreator) {\n html +=\n 'Download';\n html += ' | ';\n html +=\n 'Rediger galleri';\n } else {\n html +=\n 'Download';\n html += ' | ';\n html +=\n 'Rediger galleri';\n }\n\n if (isAdmin) {\n html += ' | ';\n html +=\n 'Skjul billede';\n }\n\n adminLinks.innerHTML = html;\n } else if (adminLinks) {\n adminLinks.innerHTML = \"\";\n }\n }\n\n function isGridView(): boolean {\n return galleryBrowse?.dataset.view === \"grid\";\n }\n\n function scrollThumbIntoView(index: number): void {\n const thumb = thumbs[index] as HTMLElement | undefined;\n if (!thumb || !thumbStrip || typeof thumbStrip.scrollBy !== \"function\")\n return;\n\n const stripRect = thumbStrip.getBoundingClientRect();\n const thumbRect = thumb.getBoundingClientRect();\n\n if (isGridView()) {\n if (\n thumbRect.top < stripRect.top ||\n thumbRect.bottom > stripRect.bottom\n ) {\n const delta =\n thumbRect.top -\n stripRect.top -\n (stripRect.height - thumbRect.height) / 2;\n thumbStrip.scrollBy({ top: delta, behavior: \"smooth\" });\n }\n } else if (\n thumbRect.left < stripRect.left ||\n thumbRect.right > stripRect.right\n ) {\n const delta =\n thumbRect.left -\n stripRect.left -\n (stripRect.width - thumbRect.width) / 2;\n thumbStrip.scrollBy({ left: delta, behavior: \"smooth\" });\n }\n }\n\n function updateThumbs(index: number): void {\n for (let i = 0; i < thumbs.length; i++) {\n if (i === index) {\n thumbs[i].classList.add(\"gallery-thumb-active\");\n } else {\n thumbs[i].classList.remove(\"gallery-thumb-active\");\n }\n }\n scrollThumbIntoView(index);\n }\n\n // \u2500\u2500 Strip / grid view toggle \u2500\u2500\n function moveViewSlider(): void {\n if (!viewSlider) return;\n let active: HTMLButtonElement | null = null;\n for (let i = 0; i < viewOptions.length; i++) {\n if (viewOptions[i].getAttribute(\"aria-pressed\") === \"true\") {\n active = viewOptions[i];\n }\n }\n if (!active) return;\n viewSlider.style.width = active.offsetWidth + \"px\";\n viewSlider.style.height = active.offsetHeight + \"px\";\n viewSlider.style.transform =\n \"translate(\" + active.offsetLeft + \"px, \" + active.offsetTop + \"px)\";\n }\n\n function setView(view: \"strip\" | \"grid\"): void {\n if (!galleryBrowse) return;\n galleryBrowse.dataset.view = view;\n for (let i = 0; i < viewOptions.length; i++) {\n viewOptions[i].setAttribute(\n \"aria-pressed\",\n viewOptions[i].dataset.view === view ? \"true\" : \"false\",\n );\n }\n moveViewSlider();\n if (currentIndex >= 0) scrollThumbIntoView(currentIndex);\n }\n\n if (galleryBrowse) {\n for (let i = 0; i < viewOptions.length; i++) {\n viewOptions[i].addEventListener(\"click\", function () {\n setView(viewOptions[i].dataset.view === \"grid\" ? \"grid\" : \"strip\");\n });\n }\n // Position the slider under the initially-active option, then enable\n // transitions so future toggles animate rather than jump on load.\n moveViewSlider();\n if (viewSlider) {\n requestAnimationFrame(function () {\n viewSlider.classList.add(\"thumb-view-slider-animated\");\n });\n }\n window.addEventListener(\"resize\", moveViewSlider);\n // Button widths shift once web fonts swap in; re-measure when they settle.\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(moveViewSlider);\n }\n }\n\n // \u2500\u2500 Time scrubber \u2500\u2500\n let minT = 0;\n let span = 0;\n let timed: { i: number; t: number }[] = [];\n let firstTimedIndex = 0;\n let lastTimedIndex = 0;\n let timelineReady = false;\n let scrubbing = false;\n let rafPending = false;\n let lastRatio = 0;\n\n function ratioForTime(t: number): number {\n return span > 0 ? clamp((t - minT) / span, 0, 1) : 0;\n }\n\n function nearestIndexForRatio(ratio: number): number {\n const target = minT + ratio * span;\n let best = timed[0];\n let bestDist = Infinity;\n for (let i = 0; i < timed.length; i++) {\n const dist = Math.abs(timed[i].t - target);\n if (dist < bestDist) {\n bestDist = dist;\n best = timed[i];\n }\n }\n return best.i;\n }\n\n function setHandle(ratio: number): void {\n const pct = (ratio * 100).toFixed(3) + \"%\";\n if (timelineFill) timelineFill.style.width = pct;\n if (timelineHandle) timelineHandle.style.left = pct;\n }\n\n function buildTimeline(): void {\n if (\n !showTime ||\n !timelineEl ||\n !timelineTrack ||\n !timelineTicks ||\n !timelineHandle\n )\n return;\n\n timed = [];\n for (let i = 0; i < photos.length; i++) {\n const t = photos[i].takenAt;\n if (validTime(t)) timed.push({ i, t });\n }\n if (timed.length < 2) return;\n\n minT = Infinity;\n let maxT = -Infinity;\n for (const e of timed) {\n if (e.t < minT) {\n minT = e.t;\n firstTimedIndex = e.i;\n }\n if (e.t > maxT) {\n maxT = e.t;\n lastTimedIndex = e.i;\n }\n }\n span = maxT - minT;\n if (span <= 0) return;\n\n // One tick per photo \u2014 clusters reveal where the bursts happened\n const frag = document.createDocumentFragment();\n for (const e of timed) {\n const tick = document.createElement(\"div\");\n tick.className = \"timeline-tick\";\n tick.style.left = (ratioForTime(e.t) * 100).toFixed(3) + \"%\";\n frag.appendChild(tick);\n }\n timelineTicks.appendChild(frag);\n\n if (timelineStart) timelineStart.textContent = formatTime(minT);\n if (timelineEnd) timelineEnd.textContent = formatTime(maxT);\n timelineTrack.setAttribute(\"aria-valuemin\", \"0\");\n timelineTrack.setAttribute(\"aria-valuemax\", \"100\");\n\n timelineReady = true;\n timelineEl.removeAttribute(\"hidden\");\n timelineEl.classList.remove(\"hidden\");\n document\n .querySelectorAll(\".timeline-hint\")\n .forEach((el) => el.classList.remove(\"hidden\"));\n\n wireScrub();\n }\n\n function updateTimeline(index: number): void {\n if (!timelineReady) return;\n const t = photos[index].takenAt;\n if (validTime(t)) {\n const label = formatTime(t);\n if (timelineHandle) timelineHandle.style.display = \"\";\n if (!scrubbing) {\n setHandle(ratioForTime(t));\n if (timelineBubble) timelineBubble.textContent = label;\n }\n if (timelineCurrent) timelineCurrent.textContent = label;\n if (timelineTrack) {\n timelineTrack.setAttribute(\n \"aria-valuenow\",\n (ratioForTime(t) * 100).toFixed(0),\n );\n timelineTrack.setAttribute(\"aria-valuetext\", \"kl. \" + label);\n }\n } else if (timelineHandle) {\n timelineHandle.style.display = \"none\";\n if (!scrubbing && timelineCurrent) timelineCurrent.textContent = \"\";\n }\n }\n\n function ratioFromClientX(clientX: number): number {\n if (!timelineTrack) return 0;\n const r = timelineTrack.getBoundingClientRect();\n return r.width > 0 ? clamp((clientX - r.left) / r.width, 0, 1) : 0;\n }\n\n function previewScrub(ratio: number): void {\n lastRatio = ratio;\n setHandle(ratio);\n const idx = nearestIndexForRatio(ratio);\n const label = formatTime(photos[idx].takenAt);\n if (timelineBubble) timelineBubble.textContent = label;\n if (timelineCurrent) timelineCurrent.textContent = label;\n if (!rafPending) {\n rafPending = true;\n requestAnimationFrame(function () {\n rafPending = false;\n showImage(nearestIndexForRatio(lastRatio));\n });\n }\n }\n\n function wireScrub(): void {\n if (!timelineTrack || !timelineEl) return;\n\n function startScrub(e: PointerEvent): void {\n scrubbing = true;\n timelineEl!.classList.add(\"is-scrubbing\");\n try {\n timelineTrack!.setPointerCapture(e.pointerId);\n } catch {\n /* not supported \u2014 capture is best-effort */\n }\n previewScrub(ratioFromClientX(e.clientX));\n e.preventDefault();\n }\n\n function moveScrub(e: PointerEvent): void {\n if (!scrubbing) return;\n previewScrub(ratioFromClientX(e.clientX));\n }\n\n function endScrub(): void {\n if (!scrubbing) return;\n scrubbing = false;\n timelineEl!.classList.remove(\"is-scrubbing\");\n showImage(nearestIndexForRatio(lastRatio));\n updateTimeline(currentIndex);\n }\n\n timelineTrack.addEventListener(\"pointerdown\", startScrub);\n timelineTrack.addEventListener(\"pointermove\", moveScrub);\n timelineTrack.addEventListener(\"pointerup\", endScrub);\n timelineTrack.addEventListener(\"pointercancel\", endScrub);\n\n timelineTrack.addEventListener(\"keydown\", function (e) {\n let handled = true;\n if (e.key === \"ArrowLeft\") prev();\n else if (e.key === \"ArrowRight\") next();\n else if (e.key === \"Home\") showImage(firstTimedIndex);\n else if (e.key === \"End\") showImage(lastTimedIndex);\n else handled = false;\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n });\n }\n\n function updateHash(photo: GalleryPhoto): void {\n const hash = currentIndex === 0 ? \"\" : \"#\" + photo.id;\n if (window.location.hash !== hash) {\n history.replaceState(null, \"\", hash || window.location.pathname);\n }\n }\n\n function preloadAround(index: number): void {\n [index + 1, index + 2].forEach(function (i) {\n if (i < photos.length && !preloaded[i]) {\n preloaded[i] = true;\n const img = new Image();\n img.src = photoUrl(photos[i], viewerSize(photos[i]));\n }\n });\n }\n\n function prev(): void {\n showImage(currentIndex - 1);\n }\n function next(): void {\n showImage(currentIndex + 1);\n }\n\n function trackHit(type: string): void {\n const url = \"/hit?type=\" + type + \"&id=\" + galleryId + \"&rnd=\" + rnd++;\n if (navigator.sendBeacon) {\n navigator.sendBeacon(url);\n } else {\n new Image().src = url;\n }\n }\n\n function getIndexFromHash(): number {\n const hash = parseInt(window.location.hash.replace(\"#\", \"\"), 10);\n if (!hash) return 0;\n for (let i = 0; i < photos.length; i++) {\n if (photos[i].id === hash) return i;\n }\n return 0;\n }\n\n // Buy / remove-from-cart click handlers\n if (buyLinks) {\n buyLinks.addEventListener(\"click\", function (e) {\n const target = e.target as HTMLElement;\n const buyBtn = target.closest(\".js-buy\") as HTMLElement | null;\n const removeBtn = target.closest(\".js-remove\") as HTMLElement | null;\n\n if (buyBtn) {\n e.preventDefault();\n const pid = parseInt(buyBtn.dataset.photoId!, 10);\n addToCart(pid);\n buyBtn.style.display = \"none\";\n const pay = buyLinks.querySelector(\".js-pay\") as HTMLElement | null;\n if (pay) pay.style.display = \"\";\n }\n\n if (removeBtn) {\n e.preventDefault();\n const pid = parseInt(removeBtn.dataset.photoId!, 10);\n removeFromCart(pid);\n const pay = buyLinks.querySelector(\".js-pay\") as HTMLElement | null;\n if (pay) pay.style.display = \"none\";\n const buy = buyLinks.querySelector(\".js-buy\") as HTMLElement | null;\n if (buy) buy.style.display = \"\";\n }\n });\n }\n\n // Initialize cart badge\n updateCartBadge();\n\n // Right-click protection\n const viewer = document.getElementById(\"gallery-viewer\");\n if (viewer) {\n viewer.addEventListener(\"contextmenu\", function (e) {\n e.preventDefault();\n });\n\n mainImage.addEventListener(\"dragstart\", function (e) {\n e.preventDefault();\n });\n }\n\n // Event listeners\n prevBtn.addEventListener(\"click\", prev);\n nextBtn.addEventListener(\"click\", next);\n\n mainImage.addEventListener(\"click\", function (e: any) {\n if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n next();\n });\n mainImage.style.cursor = \"pointer\";\n\n thumbStrip!.addEventListener(\"click\", function (e) {\n const btn = (e.target as HTMLElement).closest(\n \".gallery-thumb\",\n ) as HTMLElement | null;\n if (btn) {\n const idx = parseInt(btn.dataset.index!, 10);\n showImage(idx);\n }\n });\n\n // Touch swipe navigation\n (function () {\n let touchStartX = 0;\n let touchStartY = 0;\n let swiping = false;\n const minSwipe = 40;\n const container = document.getElementById(\"main-image-container\");\n if (!container) return;\n\n container.addEventListener(\n \"touchstart\",\n function (e) {\n if (e.touches.length !== 1) return;\n touchStartX = e.touches[0].clientX;\n touchStartY = e.touches[0].clientY;\n swiping = true;\n },\n { passive: true },\n );\n\n container.addEventListener(\n \"touchmove\",\n function (e) {\n if (!swiping) return;\n const dx = Math.abs(e.touches[0].clientX - touchStartX);\n const dy = Math.abs(e.touches[0].clientY - touchStartY);\n if (dx > dy && dx > 10) {\n e.preventDefault();\n }\n },\n { passive: false },\n );\n\n container.addEventListener(\n \"touchend\",\n function (e) {\n if (!swiping) return;\n swiping = false;\n const dx = e.changedTouches[0].clientX - touchStartX;\n const dy = Math.abs(e.changedTouches[0].clientY - touchStartY);\n if (Math.abs(dx) < minSwipe || dy > Math.abs(dx)) return;\n if (dx < 0) next();\n else prev();\n },\n { passive: true },\n );\n })();\n\n // Keyboard navigation\n document.addEventListener(\"keydown\", function (e) {\n if (\n (e.target as HTMLElement).tagName === \"INPUT\" ||\n (e.target as HTMLElement).tagName === \"TEXTAREA\" ||\n (e.target as HTMLElement).tagName === \"SELECT\"\n )\n return;\n\n if (e.key === \"ArrowLeft\") {\n prev();\n e.preventDefault();\n } else if (e.key === \"ArrowRight\") {\n next();\n e.preventDefault();\n }\n });\n\n // Hash change\n window.addEventListener(\"hashchange\", function () {\n showImage(getIndexFromHash());\n });\n\n // Initialize\n fillThumbTimes();\n buildTimeline();\n const startIndex = getIndexFromHash();\n showImage(startIndex);\n trackHit(\"gallery\");\n trackHit(\"photo\");\n})();\n"], "mappings": "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", "names": ["data", "photos", "domain", "galleryId", "showTime", "forSale", "isAdmin", "isCreator", "currentIndex", "preloaded", "rnd", "getCart", "match", "val", "setCart", "ids", "isInCart", "photoId", "addToCart", "cart", "updateCartBadge", "removeFromCart", "id", "count", "badge", "mainImage", "loader", "prevBtn", "nextBtn", "counter", "timestamp", "description", "thumbStrip", "thumbs", "buyLinks", "adminLinks", "galleryBrowse", "viewToggle", "viewOptions", "viewSlider", "timelineEl", "timelineTrack", "timelineFill", "timelineTicks", "timelineHandle", "timelineBubble", "timelineCurrent", "timelineStart", "timelineEnd", "photoUrl", "photo", "size", "ext", "viewerSize", "formatDate", "ms", "d", "months", "day", "mon", "year", "hh", "mm", "formatTime", "validTime", "clamp", "n", "lo", "hi", "fillThumbTimes", "i", "el", "showImage", "index", "url", "img", "preloadAround", "updateNav", "updateInfo", "updateThumbs", "updateTimeline", "updateHash", "trackHit", "megapixels", "mp", "inCart", "buyLabel", "buyTitle", "html", "pid", "isGridView", "scrollThumbIntoView", "thumb", "stripRect", "thumbRect", "delta", "moveViewSlider", "active", "setView", "view", "minT", "span", "timed", "firstTimedIndex", "lastTimedIndex", "timelineReady", "scrubbing", "rafPending", "lastRatio", "ratioForTime", "nearestIndexForRatio", "ratio", "target", "best", "bestDist", "dist", "setHandle", "pct", "buildTimeline", "t", "maxT", "e", "frag", "tick", "wireScrub", "label", "ratioFromClientX", "clientX", "r", "previewScrub", "idx", "startScrub", "moveScrub", "endScrub", "handled", "prev", "next", "hash", "type", "getIndexFromHash", "buyBtn", "removeBtn", "pay", "buy", "viewer", "btn", "touchStartX", "touchStartY", "swiping", "minSwipe", "container", "dx", "dy", "startIndex"] }